一、GitHub Actions 是什么?
GitHub Actions 是 GitHub 提供的一项持续集成和持续部署(CI/CD)服务,它允许你在 GitHub 仓库中自动化运行软件开发生命周期流程。借助该服务,你可以直接在 GitHub 仓库里创建工作流,这些工作流能够在代码发生特定事件(如推送、拉取请求等)时自动执行一系列任务。
二、配置 SSH 连接腾讯云服务器
-
添加 服务器配置:
SERVER_USERNAME:登录远程服务器的账户名
SSH_PRIVATE_KEY:登录远程服务的私钥
SERVER_PORT:ssh端口,未改过的固定22
SERVER_HOST:远程服务器地址
image.png - 私钥获取、配置方式
2.1:可以在本地环境,打开命令界面,输入ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
,回车后,会提示你输入一些配置来生成密钥文件,一直回车就好了,省事些。
2.1:找到生成的私钥(默认为 id_rsa),公钥(默认为 id_rsa.pub)文件;将私钥文件的内容配置到上面图的SSH_PRIVATE_KEY配置项的值里面取。
2.3:将公钥文件内容,粘贴到远程服务器的~/.ssh/authorized_keys
文件中;如果该文件不存在,需要创建它。
image.png
三、项目中配置 Actions
-
在项目根目录下创建
.github/workflows/deploy.yml
文件
image.png 编写yml文件
# 工作流的名称,用于在 GitHub Actions 界面中标识该工作流
name: deploy
# 定义工作流的触发条件
on:
# 手动触发
workflow_dispatch:
# 当有新的版本(release)被创建时触发工作流
release:
types: [created]
# 定义工作流中的作业
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn -B -Dmaven.test.skip=true package --file pom.xml
# ---------------------- 新增:准备 SSH 私钥(关键!)----------------------
- name: Prepare SSH Private Key
run: |
# 创建临时目录并写入私钥
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
# 设置私钥权限(必须为 600,否则 SSH 拒绝使用)
chmod 600 ~/.ssh/id_rsa
# ---------------------- 远程操作:停止服务 & 清理旧文件 ----------------------
- name: Stop service and clean old JAR
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
# 停止服务(远程操作)
/opt/retrieve-back/retrieve-back.sh stop
# 清空旧文件(远程操作)
rm -f /opt/retrieve-back/admin.jar
# ---------------------- 本地操作:SCP 上传新 JAR 文件(核心修正!)----------------------
- name: SCP Upload New JAR File
run: |
# 拼接本地 JAR 路径(GITHUB_WORKSPACE 是本地环境变量,此处有效)
LOCAL_JAR_PATH="$GITHUB_WORKSPACE/admin/target/admin.jar"
# 检查文件是否存在
if [ ! -f "$LOCAL_JAR_PATH" ]; then
echo "错误:JAR 文件不存在于 $LOCAL_JAR_PATH"
exit 1
fi
# 使用私钥进行 SCP 上传(通过 -i 选项指定私钥文件)
scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa "$LOCAL_JAR_PATH" "${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_HOST }}:/opt/retrieve-back/admin.jar"
shell: bash
# ---------------------- 远程操作:启动服务 & 检查状态 ----------------------
- name: Start service and check status
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
cd /opt/retrieve-back/
# 启动服务(远程操作)
/opt/retrieve-back/retrieve-back.sh start
# 检查服务状态(可选)
/opt/retrieve-back/retrieve-back.sh status