引路文艺倾年-CSDN博客飞哥不鸽-CSDN博客 两位哥,哥教我我给他们丢捻了,两位大佬谁看了不说一句牛!
CI/CD
- CI(Continuous Integration)持续集成,CD(Continuous Deployment)持续部署。
- CI:指将代码频繁地合并到共享存储库中,并进行自动化构建和测试,以便能够及早发现和解决潜在问题。
- CD:是指将代码自动化部署到测试或生产环境中
语法
- workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
- name: 工作流的名称。
- on: 指定次工作流的触发器。push 表示只要有人将更改推送到仓库就会触发工作流运行。(点击这里了解如何指定特定分支,路径或标签)
- jobs: 将工作流运行的所有作业组合到一起。
- build-and-deploy: 定义的作业的名称。
- runs-on: 将作业配置为在最新版本的 Ubuntu Linux 上运行。这意味着作业将在 GitHub 托管的新虚拟机上执行。有关使用其他运行器的语法示例,请参阅 GitHub 操作的工作流语法。
- steps: 将作业中运行的所有步骤组合在一起。嵌套在此部分下的每个项都是一个单独的操作或 shell 脚本。
- uses: 指定需要运行的 action。
- env: 指定运行 action 时需要用到的环境变量的值。
一般流水线包含的几个操作要点如下:workflow->job->step->action
下面正式开始!
后端部署:
第一种:公共仓库(服务器主机账号密码等信息在仓库中配置)
1.密钥配置
REMOTE_IP
REMOTE_PWD
2.main.yml
# Workflow 名称
name: Deploy bj-hospital
# 定义触发工作流的事件
on:
# 当推送到 main 分支时触发
push:
branches: [ main ]
# 允许从 Actions 标签页手动运行此工作流
workflow_dispatch:
# 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
jobs:
develop_build:
# 定义运行的环境
runs-on: ubuntu-latest
# 定义作业的步骤
steps:
# 第一步:拉取最新提交的代码到虚拟机中
- name: Pull code
uses: actions/checkout@v3
# 第二步:设置 JDK 环境
- name: Set jdk
uses: actions/setup-java@v3
with:
distribution: 'temurin' # 指定使用 temurin jdk
java-version: '8' # 指定 Java 版本
cache: 'maven' # 缓存 Maven 依赖项
# 第三步:打包项目,跳过测试
- name: Package
run: mvn -B package -Dmaven.test.skip=true
# 第四步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
- name: Remove Jar
run: sshpass -p ${{ secrets.REMOTE_PWD }} ssh -o StrictHostKeyChecking=no root@${{ secrets.REMOTE_IP }} "cd /data/111/111/GitHub_Action && rm -rf ./*"
# 第五步:通过 SCP 将本地生成的 JAR 包和启动脚本上传到远程服务器的指定目录
- name: Upload
run: sshpass -p ${{ secrets.REMOTE_PWD }} scp -r -o StrictHostKeyChecking=no ./target/xxxxx.jar ./run.sh root@${{ secrets.REMOTE_IP }}:/data/bj-hospital/back_end/GitHub_Action
# 第六步:通过 SSH 连接到远程服务器,赋予启动脚本执行权限并运行该脚本来部署项目
- name: Deploy
run: sshpass -p ${{ secrets.REMOTE_PWD }} ssh -o StrictHostKeyChecking=no root@${{ secrets.REMOTE_IP }} "cd /data/111/111/GitHub_Action && chmod +x run.sh && ./run.sh"
3.run.sh
#! /bin/bash
# 切换到jar包目录下
cd /data/bj-hospital/back_end/GitHub_Action
AppName=maple-admin.jar
PID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
if [ x"$PID" != x"" ]; then
echo "$AppName is running..."
kill -9 $PID
echo "$AppName exited."
fi
source /etc/profile; nohup java -jar $AppName --spring.profiles.active=prod >> /data/bj-hospital/back_end/logs/$AppName-$(date +%Y-%m-%d).log 2>&1 &
PID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
if [ x"$PID" != x"" ]; then
echo "$AppName is successfully run..."
else
echo "$AppName is failed."
fi
里面执行的路径记得要换成自己的鸭!
第二种:私人仓库(服务器信息在config.yml上配置)
# 部署配置文件,服务器的信息
server:
host: 'xxxxxxxxxxx'
username: 'xxxx'
password: 'xxxxxx'
remote_path: '/data/111/111/GitHub_Action' # 目标路径
# Workflow 名称
name: Deploy bj-hospital
# 定义触发工作流的事件
on:
# 当推送到 main 分支时触发
push:
branches: [ main ]
# 允许从 Actions 标签页手动运行此工作流
workflow_dispatch:
# 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
jobs:
develop_build:
# 定义运行的环境
runs-on: ubuntu-latest
# 定义作业的步骤
steps:
# 第一步:拉取最新提交的代码到虚拟机中
- name: Pull code
uses: actions/checkout@v3
# 第二步:设置 JDK 环境
- name: Set jdk
uses: actions/setup-java@v3
with:
distribution: 'temurin' # 指定使用 temurin jdk
java-version: '8' # 指定 Java 版本
cache: 'maven' # 缓存 Maven 依赖项
# 第三步:打包项目,跳过测试
- name: Package
run: mvn -B package -Dmaven.test.skip=true
# 列出目标目录内容以检查生成的文件
- name: List target directory
run: ls -la maple-admin-rest/target
# 加载 config.yml 文件内容
- name: Load config
id: config
run: |
sudo apt-get update
sudo apt-get install -y curl
sudo curl -L -o /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
echo "HOST=$(yq e .server.host .github/workflows/config.yml)" >> $GITHUB_ENV
echo "USERNAME=$(yq e .server.username .github/workflows/config.yml)" >> $GITHUB_ENV
echo "PASSWORD=$(yq e .server.password .github/workflows/config.yml)" >> $GITHUB_ENV
echo "REMOTE_PATH=$(yq e .server.remote_path .github/workflows/config.yml)" >> $GITHUB_ENV
# 第四步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
- name: Remove Jar
run: sshpass -p ${{ env.PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ env.USERNAME }}@${{ env.HOST }} "cd ${{ env.REMOTE_PATH }} && rm -rf ./*"
# 第五步:通过 SCP 将本地生成的 JAR 包和启动脚本上传到远程服务器的指定目录
- name: Upload
run: sshpass -p ${{ env.PASSWORD }} scp -r -o StrictHostKeyChecking=no maple-admin-rest/target/xxxx.jar ./run.sh ${{ env.USERNAME }}@${{ env.HOST }}:${{ env.REMOTE_PATH }}
# 第六步:通过 SSH 连接到远程服务器,赋予启动脚本执行权限并运行该脚本来部署项目
- name: Deploy
run: sshpass -p ${{ env.PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ env.USERNAME }}@${{ env.HOST }} "cd ${{ env.REMOTE_PATH }} && chmod +x run.sh && ./run.sh"
前端:(同理)
第一种:公共仓库,在里面配置服务器信息
# Workflow 的名称
name: Deploy bj_hospital_web
# 定义触发事件,push 推送到 master 分支或手动触发
on:
# 当推送到 master 分支时触发工作流
push:
branches: [ master ]
# 允许从 Actions 标签页手动运行此工作流
workflow_dispatch:
# 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
jobs:
develop_build:
# 定义运行的环境,这里使用最新版的 Ubuntu
runs-on: ubuntu-latest
steps:
# 第一步:拉取最新提交的代码到虚拟机中
- name: Pull code
uses: actions/checkout@v3
# 第二步:设置 Node.js 环境
- name: use Node.js
# 使用 actions/setup-node 安装 Node.js
uses: actions/setup-node@v1
with:
node-version: 16.x # 指定 Node.js 版本为 16.x
# 第三步:配置国内源以加快依赖项安装速度
- name: config
run: yarn config set registry https://registry.npmmirror.com/
# 第四步:安装项目依赖
- name: dependency
run: yarn
# 第五步:打包项目
- name: build
run: yarn run build
# 第六步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
- name: Remove Dist
run: sshpass -p ${{secrets.REMOTE_PWD}} ssh -o StrictHostKeyChecking=no root@${{secrets.REMOTE_IP}} "cd /data/xxx/nginx/html && rm -rf ./*"
# 第七步:通过 SCP 将本地生成的打包文件上传到远程服务器的指定目录
- name: Upload
run: sshpass -p ${{secrets.REMOTE_PWD}} scp -r -o StrictHostKeyChecking=no ./dist/* root@${{secrets.REMOTE_IP}}:/data/co-school/nginx/html/
第二种:需要添加一个解析config.yml的步骤
# workflow 的名称
name: Deploy bj_hospital_web
# 定义触发事件,push 推送到 master 分支或手动触发
on:
# 当推送到 master 分支时触发工作流
push:
branches: [ master ]
# 允许从 Actions 标签页手动运行此工作流
workflow_dispatch:
# 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
jobs:
develop_build:
# 定义运行的环境,这里使用最新版的 Ubuntu
runs-on: ubuntu-latest
steps:
# 第一步:拉取最新提交的代码到虚拟机中
- name: Pull code
uses: actions/checkout@v3
# 加载 config.yml 文件内容
- name: Load config
id: config
run: |
sudo apt-get update
sudo apt-get install -y curl
sudo curl -L -o /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
echo "HOST=$(yq e .server.host .github/workflows/config.yml)" >> $GITHUB_ENV
echo "USERNAME=$(yq e .server.username .github/workflows/config.yml)" >> $GITHUB_ENV
echo "PASSWORD=$(yq e .server.password .github/workflows/config.yml)" >> $GITHUB_ENV
echo "REMOTE_PATH=$(yq e .server.remote_path .github/workflows/config.yml)" >> $GITHUB_ENV
# 第二步:设置 Node.js 环境
- name: use Node.js
# 使用 actions/setup-node 安装 Node.js
uses: actions/setup-node@v1
with:
node-version: 16.x # 指定 Node.js 版本为 16.x
# 第三步:配置国内源以加快依赖项安装速度
- name: config
run: yarn config set registry https://registry.npmmirror.com/
# 第四步:安装项目依赖
- name: dependency
run: yarn
# 第五步:打包项目
- name: build
run: yarn run build
# 第六步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
- name: Remove Dist
run: sshpass -p ${{ env.PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ env.USERNAME }}@${{ env.HOST }} "cd ${{ env.REMOTE_PATH }} && rm -rf ./*"
# 第七步:通过 SCP 将本地生成的打包文件上传到远程服务器的指定目录
- name: Upload
run: sshpass -p ${{ env.PASSWORD }} scp -r -o StrictHostKeyChecking=no ./dist/* ${{ env.USERNAME }}@${{ env.HOST }}:${{ env.REMOTE_PATH }}
最最最最最重要!
修改完代码Maven要重新clean重新打包,不然上传的一直是原来的jar包,我这个小傻汁改完忘记重新打包,又多找了5h的bug(哽咽。
版权归原作者 你们卷吧,我卷不动了 所有, 如有侵权,请联系我们删除。