使用Giuhub Actions 实现自动化部署Jar包

1,233 阅读4分钟

前言

国内关于Github Actions的资料太少了,搞了几天终于成功了(GPT帮助🥹)。本期是一个使用Github Actions来实现自动化部署Jar包,当然也可以使用Docker来实现自动化部署(之后出)。

简单来说就是我可以实现push到main分支,自动部署到我的服务器。

传送带:Github Actions官方文档(官方文档是个好东西啊)

Github地址(提供了模板可以直接用,喜欢的可以点个⭐️):github.com/tudoutiaoya…

Github Actions是什么

GitHub Actions是GitHub提供的一个持续集成和持续部署的工具,可以通过一系列的自动化流程来构建、测试和部署软件。相同类型的产品还有Jenkins、GitLab CI/CD等。

什么是CI/CD

CI(Continuous Integration)持续集成,CD(Continuous Deployment)持续部署。

CI:指将代码频繁地合并到共享存储库中,并进行自动化构建和测试,以便能够及早发现和解决潜在问题。

CD:是指将代码自动化部署到测试或生产环境中

好处是什么?相比直接部署Jar包咋样?

相比就是太方便了!!!能省去太多时间了

之前

本地打包成Jar包 ---> ftp工具上传到服务器 ---> 查看原先的Java进程并停掉(比如jps命令、ps -ef | grep .. 很多命令可以查看Java进程) ----> nohup java -jar xxx.jar --spring.profiles.active=prod > nohup.out &

现在

定义触发事件(比如push到main分支) --- 自动构建Jar包 --- 自定运行test(可有可无) --- 自动部署到自己服务器的指定位置

使用教程-可以当模版自己用

  1. 创建流文件

在项目根目录下创建 .github/workflows/ 目录来存储工作流文件。Github Actions将自动扫描这个目录下的xxx.yml文件。

也可以点击这里进行创建

image.png

  1. 工作流文件内容

这个文件定义了我们要干什么。大家可以根据自己要上传的目录和构建的Jar包名称自行修改。

我写了详细的注释,有不懂的大家可以copy到GPT或者查看官方文档。

主要内容:

  • push到main分支或者pull request合并到main分支触发CI/CD
  • 使用GitHub 提供托管的ubuntu虚拟机构建Jar包
  • 将Jar包通过scp命令传输到自己服务器
  • 停止之前运行的Java进程重新java -jar运行
name: auto build and deploy # workflow 的名称

on: # 定义触发事件,push 推送到 main 分支或 pull request
  push:
    branches:
      - main
  pull_request:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest # 定义运行的环境
    steps: # 定义步骤
      - uses: actions/checkout@v3
      - uses: actions/setup-java@master # 使用 Setup Java action,安装 Java 运行时环境
        with:
          java-version: 8 # 指定 Java 版本
          distribution: "adopt" # 指定使用 AdoptOpenJDK 发行版
          cache: maven # 缓存 Maven 依赖项
      - run: mvn clean -DfinalName=test_deploy_jar package --file pom.xml

      - name: Copy Jar to Server # 定义一个步骤名称
        uses: appleboy/scp-action@master # 使用 appleboy/scp-action 这个开源 action,将 jar 包拷贝到远程服务器
        with:
          host: ${{ secrets.HOST }} # 远程服务器地址,从 secrets 中读取
          username: ${{ secrets.USERNAME }} # 远程服务器用户名,从 secrets 中读取
          port: ${{ secrets.PORT }} # 远程服务器端口号,从 secrets 中读取
          key: ${{ secrets.KEY }} # SSH 密钥,从 secrets 中读取
          source: "target/test_deploy_jar.jar" # 要拷贝的文件路径
          rm: true # 是否删除目标文件,如果为 true,表示先删除目标文件,再拷贝新文件
          target: "/www/test" # 目标文件路径 注意,最终目录为/www/test/target/test_deploy_jar.jar
      - name: Deploy
        uses: appleboy/ssh-action@master # 使用 appleboy/ssh-action 这个开源 action,远程执行 shell 脚本
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          port: ${{ secrets.PORT }}
          command_timeout: 20s # shell 命令执行超时时间,20s
          script: |
            cd /www/test/target
            ps -ef | grep test_deploy_jar.jar | grep -v grep | awk '{print $2}' | xargs kill -9 
            nohup java -jar test_deploy_jar.jar --spring.profiles.active=prod > nohup.out &
            exit

注意:

最好pom文件中自己指定要打包的文件名,工作流文件中mvn clean -DfinalName=test_deploy_jar package --file pom.xml这里没有覆盖pom文件中的内容笔者也不很清楚为啥

还有查看自己pom文件这里是否有skip标签为true,如果有应改为false或者删掉,这里表示跳过Spring Boot Maven插件的执行。如果为true会导致构建的Jar包没有主清单没法运行(这是个坑)

image.png

  1. 生成SSH密钥

SSS密钥添加secrets的时候需要使用(下一步)

(1)输入命令: ssh-keygen

(2)接下来一路回车

(3)检查是否创建SSH KEYS:

ls ~/.ssh/

(4)服务器安装公钥

cd ~/.ssh/
cat id_rsa.pub >> authorized_keys

(5)给文件权限,保证连接成功

chmod 600 authorized_keys
chmod 700 ~/.ssh

// 重启ssh服务
service sshd restart
  1. 添加secrets

当前项目添加

上图与下图对应 image.png

成果

部署成功,以后只要push到main分支都会自动部署到自己服务器了。

大家有什么疑问可以留在评论区或者私信我,我会帮助大家解答🤩