一、GitHub Actions 是什么?
GitHub Actions 是 GitHub 提供的一項持續(xù)集成和持續(xù)部署(CI/CD)服務,它允許你在 GitHub 倉庫中自動化運行軟件開發(fā)生命周期流程。借助該服務,你可以直接在 GitHub 倉庫里創(chuàng)建工作流,這些工作流能夠在代碼發(fā)生特定事件(如推送、拉取請求等)時自動執(zhí)行一系列任務。
二、配置 SSH 連接騰訊云服務器
-
添加 服務器配置:
SERVER_USERNAME:登錄遠程服務器的賬戶名
SSH_PRIVATE_KEY:登錄遠程服務的私鑰
SERVER_PORT:ssh端口,未改過的固定22
SERVER_HOST:遠程服務器地址
image.png - 私鑰獲取、配置方式
2.1:可以在本地環(huán)境,打開命令界面,輸入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文件中;如果該文件不存在,需要創(chuàng)建它。
image.png
三、項目中配置 Actions
-
在項目根目錄下創(chuàng)建
.github/workflows/deploy.yml文件
image.png 編寫yml文件
# 工作流的名稱,用于在 GitHub Actions 界面中標識該工作流
name: deploy
# 定義工作流的觸發(fā)條件
on:
# 手動觸發(fā)
workflow_dispatch:
# 當有新的版本(release)被創(chuàng)建時觸發(fā)工作流
release:
types: [created]
# 定義工作流中的作業(yè)
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: |
# 創(chuàng)建臨時目錄并寫入私鑰
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 是本地環(huán)境變量,此處有效)
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
# ---------------------- 遠程操作:啟動服務 & 檢查狀態(tài) ----------------------
- 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
# 檢查服務狀態(tài)(可選)
/opt/retrieve-back/retrieve-back.sh status


