LLMX/.gitea/workflows/deploy.master.yml
gewuyou 9f6c246acb
Some checks failed
CI/CD Pipeline / remote-internal-deploy (push) Has been cancelled
CI/CD Pipeline / remote-singapore-deploy (push) Has been cancelled
CI/CD Pipeline / build-and-deploy (push) Has been cancelled
ci:优化 GitHub Actions 工作流中的变量使用
-将环境变量引用从 $VAR_NAME 形式更改为 ${{ env.VAR_NAME }} 形式- 修正了几个变量引用,使其与新的语法一致
-这些更改提高了工作流的可读性和可维护性
2025-05-11 15:23:11 +08:00

220 lines
9.7 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: CI/CD Pipeline
on:
push:
branches:
- master # 触发构建的分支
env:
# ========== 环境变量配置 ==========
DOCKER_REGISTRY_URL: ${{vars.DOCKER_REGISTRY_URL}} # 私有Docker镜像仓库地址
INTERNAL_DOCKER_REGISTRY_URL: ${{vars.INTERNAL_DOCKER_REGISTRY_URL}}
PROJECT_NAME: llmx # 项目名称
MAIN_COMPOSE_FILE: docker/docker-compose.master.main.yml
AGENT_COMPOSE_FILE: docker/docker-compose.master.agent.yml
SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码
JCNC_GITEA_URL: ${{vars.SERVER_GITEA_URL}} # Gitea地址
RUNNER_TOOL_CACHE: /opt/tools-cache # 工具缓存目录
GRADLE_CACHE_KEY: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
SPRING_PROFILES_ACTIVE: master
INTERNAL_SERVER_HOST: ${{ vars.INTERNAL_SERVER_HOST }}
INTERNAL_SERVER_PROT: ${{ vars.INTERNAL_SERVER_PROT }}
SINGAPORE_SERVER_HOST: ${{ vars.SINGAPORE_SERVER_HOST }}
SSH_PROT: ${{ vars.SSH_PROT }}
jobs:
build-and-deploy:
runs-on: ubuntu-latest
container:
image: jcnc/act-runner:latest # 使用自定义Runner镜像
options: --user root # 以root用户运行需要docker权限
steps:
# ========== 1. 代码检出 ==========
- name: 🛒 Checkout source code
uses: ${{env.JCNC_GITEA_URL}}/actions/checkout@v4
with:
fetch-depth: 0 # 获取完整git历史某些插件需要
# ========== 2. Docker环境准备 ==========
- name: 🐳 Install Docker Environment
run: |
echo "=== 检查Docker安装状态 ==="
if ! command -v docker >/dev/null; then
echo "❌ Docker未安装开始安装..."
curl -fsSL https://get.docker.com | sh | tee docker-install.log
echo "✅ Docker安装完成"
echo "✅ Docker Compose安装完成"
else
echo " Docker已安装版本: $(docker -v)"
echo " Docker Compose已安装版本: $(docker compose version)"
fi
# ========== 3. Gradle环境准备 ==========
- name: 🔧 Prepare Gradle Environment
run: |
echo "赋予gradlew执行权限..."
chmod +x gradlew
echo "当前目录结构:"
ls -al
# ========== 4. 恢复缓存 ==========
- name: 📦 Use Cache
id: cache
uses: ${{env.JCNC_GITEA_URL}}/actions/cache/restore@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
~/.cache
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
env:
ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出
- name: ⚙️ Setup Gradle
uses: ${{env.JCNC_GITEA_URL}}/gradle/actions/setup-gradle@v4
with:
gradle-version: wrapper # 使用项目自带的gradle-wrapper
- name: 📦 Copy Compose File to Internal Server
uses: ${{env.JCNC_GITEA_URL}}/appleboy/scp-action@v1
with:
host: ${{ env.INTERNAL_SERVER_HOST }}
port: ${{ env.INTERNAL_SERVER_PROT }}
username: root
password: ${{ secrets.INTERNAL_SERVER_PASSWORD }}
source: ${{ env.MAIN_COMPOSE_FILE }}
target: "/home/luke/deploy/llmx/"
- name: 📦 Copy Compose File to Singapore Server
uses: ${{env.JCNC_GITEA_URL}}/appleboy/scp-action@v1
with:
host: ${{ env.SINGAPORE_SERVER_HOST }}
port: ${{ env.SSH_PROT }}
username: root
password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }}
source: ${{ env.AGENT_COMPOSE_FILE }}
target: "/home/deploy/llmx/"
# ========== 5. 构建阶段 ==========
- name: 🏗️ Build with Jib
run: |
echo "开始构建Docker镜像..."
./gradlew jib --stacktrace --build-cache --info -Dorg.gradle.caching=true -Dorg.gradle.jvmargs="-Xmx2g -Xms2g -XX:MaxMetaspaceSize=1g" | tee build.log
echo "=== 镜像构建结果 ==="
docker images | grep ${{ env.PROJECT_NAME }} || true
- name: 🛑 Stop Gradle Daemon
run: |
echo "停止Gradle守护进程..."
./gradlew --stop
echo "剩余Java进程:"
ps aux | grep java || true
- name: 🛰️ Tag & Push to Internal Registry
run: |
echo "标记并推送镜像到内部服务器..."
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-core-service:latest ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
echo "${{ secrets.INTERNAL_DOCKER_REGISTRY_PASSWORD }}" | docker login ${{env.INTERNAL_DOCKER_REGISTRY_URL}} -u root --password-stdin
docker push ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
docker push ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
docker logout ${{env.INTERNAL_DOCKER_REGISTRY_URL}}
- name: 🛰️ Tag & Push to Singapore Registry
run: |
echo "标记并推送镜像到内部服务器..."
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-core-service:latest ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
echo "${{ secrets.INTERNAL_DOCKER_REGISTRY_PASSWORD }}" | docker login ${{env.SINGAPORE_DOCKER_REGISTRY_URL}} -u root --password-stdin
docker push ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
docker push ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
docker logout ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}
# ========== 6. 保存缓存 ==========
- name: 📦 Save Cache
id: cache
uses: ${{env.JCNC_GITEA_URL}}/actions/cache/save@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
~/.cache
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
env:
ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出
- name: 🧼 Cleanup Dangling Images
run: |
echo "开始清理无标签镜像..."
docker image prune -f
remote-internal-deploy:
needs: build-and-deploy
runs-on: ubuntu-latest
container:
image: jcnc/act-runner:latest # 使用自定义Runner镜像
options: --user root # 以root用户运行需要docker权限
steps:
- name: ✈️ Deploy on Internal Server
uses: ${{env.JCNC_GITEA_URL}}/appleboy/ssh-action@v1
with:
host: ${{ env.INTERNAL_SERVER_HOST }}
port: ${{ env.INTERNAL_SERVER_PROT }}
username: root
password: ${{ secrets.INTERNAL_SERVER_PASSWORD }}
script: |
cd /home/luke/deploy/llmx
echo "准备部署环境..."
chmod +x docker-compose.master.yml
echo "当前Docker状态:"
docker ps -a
echo "清理旧容器..."
docker compose -f docker-compose.master.yml down --remove-orphans
echo "清理后Docker状态:"
docker ps -a
echo "拉取最新镜像..."
docker compose -f docker-compose.master.yml pull
echo "启动新服务..."
docker compose -f docker-compose.master.yml up -d
docker compose ps
echo "=== 服务状态检查 ==="
docker compose -f docker-compose.master.yml ps
echo "开始清理无标签镜像..."
docker image prune -f
echo "清理docker-compose.master.yml"
rm -rf docker-compose.master.yml
remote-singapore-deploy:
needs: build-and-deploy
runs-on: ubuntu-latest
container:
image: jcnc/act-runner:latest # 使用自定义Runner镜像
options: --user root # 以root用户运行需要docker权限
steps:
- name: ✈️ Deploy on Internal Server
uses: ${{env.JCNC_GITEA_URL}}/appleboy/ssh-action@v1
with:
host: ${{ env.SINGAPORE_SERVER_HOST }}
port: ${{ env.SSH_PROT }}
username: root
password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }}
script: |
cd /home/deploy/llmx
echo "准备部署环境..."
chmod +x docker-compose.master.yml
echo "当前Docker状态:"
docker ps -a
echo "清理旧容器..."
docker compose -f docker-compose.master.yml down --remove-orphans
echo "清理后Docker状态:"
docker ps -a
echo "拉取最新镜像..."
docker compose -f docker-compose.master.yml pull
echo "启动新服务..."
docker compose -f docker-compose.master.yml up -d
docker compose ps
echo "=== 服务状态检查 ==="
docker compose -f docker-compose.master.yml ps
echo "开始清理无标签镜像..."
docker image prune -f
echo "清理docker-compose.master.yml"
rm -rf docker-compose.master.yml