前言
国内关于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(可有可无) --- 自动部署到自己服务器的指定位置
使用教程-可以当模版自己用
-
创建流文件
在项目根目录下创建 .github/workflows/
目录来存储工作流文件。Github Actions将自动扫描这个目录下的xxx.yml文件。
也可以点击这里进行创建
-
工作流文件内容
这个文件定义了我们要干什么。大家可以根据自己要上传的目录和构建的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包没有主清单没法运行(这是个坑)
-
生成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
-
添加secrets
当前项目添加
上图与下图对应
成果
部署成功,以后只要push到main分支都会自动部署到自己服务器了。
大家有什么疑问可以留在评论区或者私信我,我会帮助大家解答🤩