- 所有需要 docker 的 job 改用 container: dockerreg.eazygame.cn/node-with-docker:22 - ci-go.yml: quality 阶段用 golang:1.22-alpine,docker-build 阶段切到 node-with-docker:22 - ci-ts.yml/docker.yml/deploy.yml: 全部加 container 配置 - 移除 setup-node/setup-go action(容器内已有 node/go 或手动安装) - 不配置 npm 代理(runner 已全局代理)
93 lines
3.2 KiB
YAML
93 lines
3.2 KiB
YAML
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/<service>:<tag>
|
||
# 详见 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<version> + 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
|