name: Build and Push to SmartParks Registry # 监听master分支的推送事件 on: push: branches: [ master ] jobs: build-and-deploy: name: 构建并推送镜像到仓库注册表 runs-on: ubuntu timeout-minutes: 30 # 设置超时时间,防止无限等待 steps: - name: 拉取代码 uses: http://git.missmoc.top/mocheng/checkout@v4 with: fetch-depth: 0 # 拉取完整历史,确保版本信息正确 - name: 使用Maven构建项目 run: | echo "===== 开始Maven构建 =====" /maven/apache-maven-3.9.11/bin/mvn clean package -DskipTests echo "===== Maven构建完成 =====" - name: 构建并推送Docker镜像 env: # Gitea容器注册表地址(请确认是否正确) GITEA_REGISTRY: 172.100.10.45:3000 # 仓库路径(组织/仓库名,严格区分大小写) REPO_PATH: by2025/SmartParks # Gitea内置认证令牌 GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | echo "===== 登录到Gitea容器注册表 =====" # 登录并检查结果 if ! echo "$GITEA_TOKEN" | docker login $GITEA_REGISTRY -u ${{ github.actor }} --password-stdin; then echo "错误:登录到容器注册表失败" exit 1 fi echo "===== 查找项目中的Dockerfile =====" # 查找所有Dockerfile并检查是否存在 dockerfiles=$(find . -type f -name "Dockerfile" ! -path "./.git/*") if [ -z "$dockerfiles" ]; then echo "警告:未找到任何Dockerfile" exit 0 fi # 处理每个Dockerfile echo "$dockerfiles" | while read -r dockerfile; do echo "===== 处理Dockerfile: $dockerfile =====" docker_context=$(dirname "$dockerfile") # 生成镜像标签(基于目录名,转换为小写并替换斜杠) image_tag=$(echo "$docker_context" | sed 's|./||g' | tr '/' '-' | tr '[:upper:]' '[:lower:]') # 完整镜像名称 full_image_name="$GITEA_REGISTRY/$REPO_PATH:$image_tag-${{ github.sha }}" echo "构建镜像: $full_image_name" if ! docker build -t "$full_image_name" -f "$dockerfile" "$docker_context"; then echo "错误:构建镜像 $full_image_name 失败" exit 1 fi echo "推送镜像: $full_image_name" if ! docker push "$full_image_name"; then echo "错误:推送镜像 $full_image_name 失败" exit 1 fi # 推送latest标签 latest_image="$GITEA_REGISTRY/$REPO_PATH:$image_tag-latest" echo "推送最新标签: $latest_image" docker tag "$full_image_name" "$latest_image" if ! docker push "$latest_image"; then echo "错误:推送最新标签 $latest_image 失败" exit 1 fi done echo "===== 清理操作 =====" docker logout $GITEA_REGISTRY echo "===== 所有操作完成 ====="