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: $INTERNAL_SERVER_PROT username: root password: ${{ secrets.INTERNAL_SERVER_PASSWORD }} source: $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: $SINGAPORE_SERVER_HOST port: $SSH_PROT username: root password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }} source: $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: $INTERNAL_SERVER_HOST port: $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: $SINGAPORE_SERVER_HOST port: $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