name: Docker Build & Push # 参考实现:E:\Desktop\CICD\.gitea\workflows\ci.yml # 关键配置:container: dockerreg.eazygame.cn/node-with-docker:22(job 内执行 docker build/push) # 触发条件:main 分支推送 或 打 v* tag # 镜像推送到 Gitea Container Registry: git.eazygame.cn/xiner/edu/: # 详见 docs/standards/cicd-runbook.md §10、project_rules §15.7 on: push: branches: [main] paths: - 'services/api-gateway/**' - 'services/classes/**' - 'apps/teacher-portal/**' - 'packages/shared-proto/**' - '.github/workflows/docker.yml' tags: - 'v*' permissions: packages: write contents: read env: REGISTRY: git.eazygame.cn OWNER: xiner REPO_LOWER: edu jobs: build-push: runs-on: ubuntu-latest container: dockerreg.eazygame.cn/node-with-docker:22 strategy: matrix: service: - { name: api-gateway, dockerfile: services/api-gateway/Dockerfile, context: ./services/api-gateway } - { name: classes, dockerfile: services/classes/Dockerfile, context: . } - { name: teacher-portal, dockerfile: apps/teacher-portal/Dockerfile, context: . } steps: - uses: actions/checkout@v4 # 登录 Gitea Container Registry # GITHUB_TOKEN 由 Gitea Actions 自动注入,对应仓库写权限 - name: Login to Gitea Container Registry run: | echo "${{ secrets.GITHUB_TOKEN }}" | \ docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin # 生成镜像 tag # main 分支:latest + git-sha # v* tag:v + latest - name: Extract metadata id: meta run: | TAGS="${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.REPO_LOWER }}/${{ matrix.service.name }}:latest" SHA_TAG="${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.REPO_LOWER }}/${{ matrix.service.name }}:sha-${GITHUB_SHA::7}" TAGS="$TAGS,$SHA_TAG" if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then VERSION="${GITHUB_REF#refs/tags/v}" TAGS="$TAGS,${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.REPO_LOWER }}/${{ matrix.service.name }}:v${VERSION}" fi echo "tags=$TAGS" >> $GITHUB_OUTPUT echo "Resolved tags: $TAGS" - name: Build and push ${{ matrix.service.name }} run: | IFS=',' read -ra TAG_ARRAY <<< "${{ steps.meta.outputs.tags }}" TAG_ARGS="" for tag in "${TAG_ARRAY[@]}"; do TAG_ARGS="$TAG_ARGS -t $tag" done docker build \ $TAG_ARGS \ -f ${{ matrix.service.dockerfile }} \ ${{ matrix.service.context }} for tag in "${TAG_ARRAY[@]}"; do echo "Pushing $tag..." docker push $tag done - name: Summary run: | echo "### Docker 镜像已推送" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "服务:\`${{ matrix.service.name }}\`" >> $GITHUB_STEP_SUMMARY echo "镜像标签:" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY