diff --git a/.gitea/workflows/prod_build_schedule.yaml b/.gitea/workflows/prod_build_schedule.yaml new file mode 100644 index 0000000..e36dd0d --- /dev/null +++ b/.gitea/workflows/prod_build_schedule.yaml @@ -0,0 +1,146 @@ +name: 定时 连卡佛 back-java prod 分支构建部署 +on: + schedule: + # cron为UTC时区,构建时间=部署时间-8小时 {*分 (-8)时 *日 *月 *周} --- + # 示例: 1月1日22点22分触发构建 cron写作 - '22 14 1 1 *' + - cron: '22 14 1 1 *' + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + + env: + REMOTE_DEPLOY_PATH: /workspace/workspace_lanecrawford/back + + steps: + - name: 1.检出代码 + uses: actions/checkout@v4 + with: + ref: prod/release_1.0 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: 2.设置JAVA Maven 环境 + run: | + # 适配act的root用户和Gitea Runner普通用户 + SUDO="" + [ "$(id -u)" != "0" ] && SUDO="sudo" + + # 安装依赖 + $SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends + + # 下载并安装Maven + MAVEN_VERSION="3.6.3" + MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz" + MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}" + wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL} + + # 解压+软链接 + $SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/ + $SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven + + # 配置PATH + echo "/usr/local/maven/bin" >> $GITHUB_PATH + export PATH="/usr/local/maven/bin:$PATH" + + # 验证 + mvn -v + + - name: 2.构建jar包 + run: + mvn -B clean package -DskipTests --file pom.xml + + - name: 3.检查 Runner 本地文件 + run: | + echo "当前目录:$(pwd)" + echo "target 目录内容:" + ls -la ./target/ + + # 容错:处理通配符无匹配的情况 + JAR_FILE=$(ls ./target/*.jar 2>/dev/null | head -n1) + if [ -z "$JAR_FILE" ] || [ ! -f "$JAR_FILE" ]; then + echo "❌ Runner 本地无有效 JAR 包!" + exit 1 + fi + + # 检查Docker配置文件 + for FILE in Dockerfile docker-compose.yml; do + if [ ! -f "./$FILE" ]; then + echo "❌ 缺失文件:$FILE" + exit 1 + fi + done + echo "✅ 本地文件校验通过!" + + - name: 4. 同步文件到远程服务器 + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SSH_KEY }} + source: "./target/*.jar,./Dockerfile,./docker-compose.yml" + target: ${{ env.REMOTE_DEPLOY_PATH }} + ssh_options: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" + strip_components: 0 + + - name: 5. 验证远程文件 + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + key: ${{ secrets.SSH_KEY }} + script: | + echo "===== 远程部署目录文件列表 =====" + ls -la ${{ env.REMOTE_DEPLOY_PATH }} + + # 容错:检查JAR包 + REMOTE_JAR=$(ls ${{ env.REMOTE_DEPLOY_PATH }}/target/*.jar 2>/dev/null | head -n1) + if [ -z "$REMOTE_JAR" ] || [ ! -f "$REMOTE_JAR" ]; then + echo "❌ 远程服务器无有效 JAR 包!" + exit 1 + fi + + # 检查Docker文件 + for FILE in Dockerfile docker-compose.yml; do + 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 "===== 开始部署服务 =====" + cd ${{ env.REMOTE_DEPLOY_PATH }} + + # 容错:停止旧容器(不存在则跳过) + echo "停止旧容器..." + docker compose down || true + + # 清理无效镜像(可选,释放空间) + docker system prune -f + + # 构建并启动新容器 + echo "构建Docker镜像..." + docker compose build --no-cache + echo "启动服务..." + docker compose up -d + + # 验证服务状态 + echo "验证容器状态..." + docker compose ps + echo "✅ 部署完成!" \ No newline at end of file