上传文件至「.gitea/workflows」

This commit is contained in:
2025-12-01 16:35:29 +08:00
parent fc7020c1d7
commit 7994e7d082
4 changed files with 339 additions and 265 deletions

View File

@@ -1,4 +1,4 @@
name: git commit 控制 AiDA back-java Develop 分支构建部署 name: git commit 控制 AiDA back-java 开发分支构建部署
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
@@ -9,7 +9,9 @@ jobs:
build_and_deploy: build_and_deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: "contains(github.event.head_commit.message, '[run build]')" if: "contains(github.event.head_commit.message, '[run build]')"
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions: permissions:
contents: read contents: read
@@ -19,27 +21,31 @@ jobs:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-version-aida-back REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-version-aida-back
steps: steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码 - name: 1.检出代码
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
ref: dev/3.1_release_merge ref: dev/3.1_release_merge
- name: Set up JDK 8 - name: 2.Set up JDK 8
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: '8' java-version: '8'
distribution: 'temurin' distribution: 'temurin'
- name: 2.设置JAVA Maven 环境 - name: 3.设置JAVA Maven 环境
run: | run: |
# 适配act的root用户和Gitea Runner普通用户 # 适配root/普通用户
SUDO="" SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo" [ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖 # 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends $SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载并安装Maven # 下载Maven
MAVEN_VERSION="3.9.11" MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz" MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}" MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
@@ -56,93 +62,111 @@ jobs:
# 验证 # 验证
mvn -v mvn -v
- name: 2.构建jar包 - name: 4.构建jar包
run:
mvn -B clean package -DskipTests --file pom.xml
- name: 3.检查 Runner 本地文件
run: | run: |
echo "当前目录:$(pwd)" echo "===== 开始构建JAR包 ====="
echo "target 目录内容:" mvn -B clean package -DskipTests --file pom.xml 2>&1
ls -la ./target/ # 检查构建是否成功
if [ $? -ne 0 ]; then
# 容错:处理通配符无匹配的情况 echo "JAR包构建失败!"
JAR_FILE=$(ls ./target/*.jar 2>/dev/null | head -n1)
if [ -z "$JAR_FILE" ] || [ ! -f "$JAR_FILE" ]; then
echo "❌ Runner 本地无有效 JAR 包!"
exit 1 exit 1
fi fi
# 检查Docker配置文件 - name: 5.生成Dockerfile
for FILE in Dockerfile docker-compose.yml; do run: |
if [ ! -f "./$FILE" ]; then echo "===== 生成Dockerfile ====="
echo "❌ 缺失文件:$FILE" cat > Dockerfile << 'EOF'
exit 1 FROM openjdk:8
fi VOLUME /tmp
done RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "✅ 本地文件校验通过!" RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./target/aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
echo "Dockerfile内容:"
cat Dockerfile
- name: 4. 同步文件到远程服务器 - name: 6.生成docker-compose.yml
uses: appleboy/scp-action@v0.1.7 run: |
with: echo "===== 生成docker-compose.yml ====="
host: ${{ secrets.SERVER_HOST }} cat > docker-compose.yml << 'EOF'
username: ${{ secrets.SERVER_USER }} version: '3'
key: ${{ secrets.SSH_KEY }} services:
source: "./target/*.jar,./Dockerfile,./docker-compose.yml" aida_back:
target: ${{ env.REMOTE_DEPLOY_PATH }} container_name: develop-version-aida-back
ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" build: .
strip_components: 0 volumes:
# 数据挂载
- ./log:/log
ports:
- '10090:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 5. 验证远程文件 - name: 7.安装SSH工具
uses: appleboy/ssh-action@v1.0.3 run: |
with: $SUDO apt install -y sshpass openssh-client --no-install-recommends
host: ${{ secrets.SERVER_HOST }} # 配置SSH免密
username: ${{ secrets.SERVER_USER }} mkdir -p ~/.ssh
key: ${{ secrets.SSH_KEY }} echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
script: | chmod 600 ~/.ssh/id_rsa
echo "===== 远程部署目录文件列表 =====" ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
ls -la ${{ env.REMOTE_DEPLOY_PATH }}
# 容错:检查JAR包 - name: 8.同步文件到远程服务器
REMOTE_JAR=$(ls ${{ env.REMOTE_DEPLOY_PATH }}/target/*.jar 2>/dev/null | head -n1) run: |
if [ -z "$REMOTE_JAR" ] || [ ! -f "$REMOTE_JAR" ]; then echo "===== 同步文件到远程服务器 ====="
echo "❌ 远程服务器无有效 JAR 包!" # 使用scp同步文件
exit 1 scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
fi ./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
# 检查Docker文件 - name: 9.部署和运行服务
for FILE in Dockerfile docker-compose.yml; do run: |
if [ ! -f "${{ env.REMOTE_DEPLOY_PATH }}/$FILE" ]; then
echo "❌ 远程缺失文件:$FILE"
exit 1
fi
done
echo "✅ 远程文件校验通过!"
- name: 6. 部署和运行服务
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
echo "===== 开始部署服务 =====" echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }} cd ${{ env.REMOTE_DEPLOY_PATH }}
# 容错:停止旧容器(不存在则跳过)
echo "停止旧容器..." echo "停止旧容器..."
docker compose down || true docker compose down || true
echo "清理Docker资源..."
# 清理无效镜像(可选,释放空间)
docker system prune -f docker system prune -f
echo "构建镜像..."
# 构建并启动新容器
echo "构建Docker镜像..."
docker compose build --no-cache docker compose build --no-cache
echo "启动服务..." echo "启动服务..."
docker compose up -d docker compose up -d
# 验证服务状态
echo "验证容器状态..." echo "验证容器状态..."
docker compose ps docker compose ps
echo "部署完成!" echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -151,7 +151,7 @@ jobs:
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码 password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop' subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改 # 收件人列表,可以根据需要更改
to: 'cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱 to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 --- # --- 邮件正文内容 ---
body: | body: |

View File

@@ -1,10 +1,13 @@
name: 手动 AiDA back-java Develop 分支构建部署 name: 手动 AiDA back-java 生产分支构建部署
on: on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build_and_deploy: build_and_deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions: permissions:
contents: read contents: read
@@ -14,27 +17,31 @@ jobs:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back
steps: steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码 - name: 1.检出代码
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
ref: release/3.1 ref: release/3.1
- name: Set up JDK 8 - name: 2.Set up JDK 8
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: '8' java-version: '8'
distribution: 'temurin' distribution: 'temurin'
- name: 2.设置JAVA Maven 环境 - name: 3.设置JAVA Maven 环境
run: | run: |
# 适配act的root用户和Gitea Runner普通用户 # 适配root/普通用户
SUDO="" SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo" [ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖 # 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends $SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载并安装Maven # 下载Maven
MAVEN_VERSION="3.9.11" MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz" MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}" MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
@@ -51,93 +58,111 @@ jobs:
# 验证 # 验证
mvn -v mvn -v
- name: 2.构建jar包 - name: 4.构建jar包
run:
mvn -B clean package -DskipTests --file pom.xml
- name: 3.检查 Runner 本地文件
run: | run: |
echo "当前目录:$(pwd)" echo "===== 开始构建JAR包 ====="
echo "target 目录内容:" mvn -B clean package -DskipTests --file pom.xml 2>&1
ls -la ./target/ # 检查构建是否成功
if [ $? -ne 0 ]; then
# 容错:处理通配符无匹配的情况 echo "JAR包构建失败!"
JAR_FILE=$(ls ./target/*.jar 2>/dev/null | head -n1)
if [ -z "$JAR_FILE" ] || [ ! -f "$JAR_FILE" ]; then
echo "❌ Runner 本地无有效 JAR 包!"
exit 1 exit 1
fi fi
# 检查Docker配置文件 - name: 5.生成Dockerfile
for FILE in Dockerfile docker-compose.yml; do run: |
if [ ! -f "./$FILE" ]; then echo "===== 生成Dockerfile ====="
echo "❌ 缺失文件:$FILE" cat > Dockerfile << 'EOF'
exit 1 FROM openjdk:8
fi VOLUME /tmp
done RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "✅ 本地文件校验通过!" RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./target/aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
echo "Dockerfile内容:"
cat Dockerfile
- name: 4. 同步文件到远程服务器 - name: 6.生成docker-compose.yml
uses: appleboy/scp-action@v0.1.7 run: |
with: echo "===== 生成docker-compose.yml ====="
host: ${{ secrets.SERVER_HOST }} cat > docker-compose.yml << 'EOF'
username: ${{ secrets.SERVER_USER }} version: '3'
key: ${{ secrets.SSH_KEY }} services:
source: "./target/*.jar,./Dockerfile,./docker-compose.yml" aida_back:
target: ${{ env.REMOTE_DEPLOY_PATH }} container_name: prod-version-aida-back
ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" build: .
strip_components: 0 volumes:
# 数据挂载
- ./log:/log
ports:
- '10010:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 5. 验证远程文件 - name: 7.安装SSH工具
uses: appleboy/ssh-action@v1.0.3 run: |
with: $SUDO apt install -y sshpass openssh-client --no-install-recommends
host: ${{ secrets.SERVER_HOST }} # 配置SSH免密
username: ${{ secrets.SERVER_USER }} mkdir -p ~/.ssh
key: ${{ secrets.SSH_KEY }} echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
script: | chmod 600 ~/.ssh/id_rsa
echo "===== 远程部署目录文件列表 =====" ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
ls -la ${{ env.REMOTE_DEPLOY_PATH }}
# 容错:检查JAR包 - name: 8.同步文件到远程服务器
REMOTE_JAR=$(ls ${{ env.REMOTE_DEPLOY_PATH }}/target/*.jar 2>/dev/null | head -n1) run: |
if [ -z "$REMOTE_JAR" ] || [ ! -f "$REMOTE_JAR" ]; then echo "===== 同步文件到远程服务器 ====="
echo "❌ 远程服务器无有效 JAR 包!" # 使用scp同步文件
exit 1 scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
fi ./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
# 检查Docker文件 - name: 9.部署和运行服务
for FILE in Dockerfile docker-compose.yml; do run: |
if [ ! -f "${{ env.REMOTE_DEPLOY_PATH }}/$FILE" ]; then
echo "❌ 远程缺失文件:$FILE"
exit 1
fi
done
echo "✅ 远程文件校验通过!"
- name: 6. 部署和运行服务
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
echo "===== 开始部署服务 =====" echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }} cd ${{ env.REMOTE_DEPLOY_PATH }}
# 容错:停止旧容器(不存在则跳过)
echo "停止旧容器..." echo "停止旧容器..."
docker compose down || true docker compose down || true
echo "清理Docker资源..."
# 清理无效镜像(可选,释放空间)
docker system prune -f docker system prune -f
echo "构建镜像..."
# 构建并启动新容器
echo "构建Docker镜像..."
docker compose build --no-cache docker compose build --no-cache
echo "启动服务..." echo "启动服务..."
docker compose up -d docker compose up -d
# 验证服务状态
echo "验证容器状态..." echo "验证容器状态..."
docker compose ps docker compose ps
echo "部署完成!" echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -1,43 +1,50 @@
name: 定时 AiDA back-java Develop 分支构建部署 name: 定时 AiDA back-java 生产分支构建部署
on: on:
schedule: schedule:
# cron为UTC时区构建时间=部署时间-8小时 {*分 (-8)时 *日 *月 *周} --- # cron为UTC时区构建时间=部署时间-8小时 {*分 (-8)时 *日 *月 *周} ---
# 示例: 1月1日22点22分触发构建 cron写作 - '22 14 1 1 *' # 示例: 1月1日22点22分触发构建 cron写作 - '22 14 1 1 *'
- cron: '59 15 28 11 *' - cron: '18 7 28 11 *'
jobs: jobs:
build_and_deploy: build_and_deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions: permissions:
contents: read contents: read
packages: write packages: write
env: env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-version-aida-back REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back
steps: steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码 - name: 1.检出代码
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
ref: release/3.1 ref: release/3.1
- name: Set up JDK 8 - name: 2.Set up JDK 8
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: '8' java-version: '8'
distribution: 'temurin' distribution: 'temurin'
- name: 2.设置JAVA Maven 环境 - name: 3.设置JAVA Maven 环境
run: | run: |
# 适配act的root用户和Gitea Runner普通用户 # 适配root/普通用户
SUDO="" SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo" [ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖 # 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends $SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载并安装Maven # 下载Maven
MAVEN_VERSION="3.9.11" MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz" MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}" MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
@@ -54,93 +61,111 @@ jobs:
# 验证 # 验证
mvn -v mvn -v
- name: 2.构建jar包 - name: 4.构建jar包
run:
mvn -B clean package -DskipTests --file pom.xml
- name: 3.检查 Runner 本地文件
run: | run: |
echo "当前目录:$(pwd)" echo "===== 开始构建JAR包 ====="
echo "target 目录内容:" mvn -B clean package -DskipTests --file pom.xml 2>&1
ls -la ./target/ # 检查构建是否成功
if [ $? -ne 0 ]; then
# 容错:处理通配符无匹配的情况 echo "JAR包构建失败!"
JAR_FILE=$(ls ./target/*.jar 2>/dev/null | head -n1)
if [ -z "$JAR_FILE" ] || [ ! -f "$JAR_FILE" ]; then
echo "❌ Runner 本地无有效 JAR 包!"
exit 1 exit 1
fi fi
# 检查Docker配置文件 - name: 5.生成Dockerfile
for FILE in Dockerfile docker-compose.yml; do run: |
if [ ! -f "./$FILE" ]; then echo "===== 生成Dockerfile ====="
echo "❌ 缺失文件:$FILE" cat > Dockerfile << 'EOF'
exit 1 FROM openjdk:8
fi VOLUME /tmp
done RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "✅ 本地文件校验通过!" RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./target/aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
echo "Dockerfile内容:"
cat Dockerfile
- name: 4. 同步文件到远程服务器 - name: 6.生成docker-compose.yml
uses: appleboy/scp-action@v0.1.7 run: |
with: echo "===== 生成docker-compose.yml ====="
host: ${{ secrets.SERVER_HOST }} cat > docker-compose.yml << 'EOF'
username: ${{ secrets.SERVER_USER }} version: '3'
key: ${{ secrets.SSH_KEY }} services:
source: "./target/*.jar,./Dockerfile,./docker-compose.yml" aida_back:
target: ${{ env.REMOTE_DEPLOY_PATH }} container_name: prod-version-aida-back
ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" build: .
strip_components: 0 volumes:
# 数据挂载
- ./log:/log
ports:
- '10010:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 5. 验证远程文件 - name: 7.安装SSH工具
uses: appleboy/ssh-action@v1.0.3 run: |
with: $SUDO apt install -y sshpass openssh-client --no-install-recommends
host: ${{ secrets.SERVER_HOST }} # 配置SSH免密
username: ${{ secrets.SERVER_USER }} mkdir -p ~/.ssh
key: ${{ secrets.SSH_KEY }} echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
script: | chmod 600 ~/.ssh/id_rsa
echo "===== 远程部署目录文件列表 =====" ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
ls -la ${{ env.REMOTE_DEPLOY_PATH }}
# 容错:检查JAR包 - name: 8.同步文件到远程服务器
REMOTE_JAR=$(ls ${{ env.REMOTE_DEPLOY_PATH }}/target/*.jar 2>/dev/null | head -n1) run: |
if [ -z "$REMOTE_JAR" ] || [ ! -f "$REMOTE_JAR" ]; then echo "===== 同步文件到远程服务器 ====="
echo "❌ 远程服务器无有效 JAR 包!" # 使用scp同步文件
exit 1 scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
fi ./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
# 检查Docker文件 - name: 9.部署和运行服务
for FILE in Dockerfile docker-compose.yml; do run: |
if [ ! -f "${{ env.REMOTE_DEPLOY_PATH }}/$FILE" ]; then
echo "❌ 远程缺失文件:$FILE"
exit 1
fi
done
echo "✅ 远程文件校验通过!"
- name: 6. 部署和运行服务
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
echo "===== 开始部署服务 =====" echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }} cd ${{ env.REMOTE_DEPLOY_PATH }}
# 容错:停止旧容器(不存在则跳过)
echo "停止旧容器..." echo "停止旧容器..."
docker compose down || true docker compose down || true
echo "清理Docker资源..."
# 清理无效镜像(可选,释放空间)
docker system prune -f docker system prune -f
echo "构建镜像..."
# 构建并启动新容器
echo "构建Docker镜像..."
docker compose build --no-cache docker compose build --no-cache
echo "启动服务..." echo "启动服务..."
docker compose up -d docker compose up -d
# 验证服务状态
echo "验证容器状态..." echo "验证容器状态..."
docker compose ps docker compose ps
echo "部署完成!" echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain