name: Release on: push: tags: ["v*"] env: BUILDX_NO_DEFAULT_ATTESTATIONS: "1" DASH_REPO: wangdefa/oci-portal-dash jobs: release: runs-on: ubuntu-latest-amd64 steps: - uses: actions/checkout@v4 - name: 准备 buildx 与镜像地址 run: | # 多平台构建需要 docker-container driver;Dockerfile 交叉编译,无需 QEMU docker buildx create --use --driver docker-container --driver-opt network=host || true REGISTRY=$(echo "${{ gitea.server_url }}" | sed 's|https\?://||') echo "REGISTRY=${REGISTRY}" >> "$GITHUB_ENV" echo "IMAGE=${REGISTRY}/${{ gitea.repository }}" >> "$GITHUB_ENV" - name: 下载前端最新 dist.zip 解压进嵌入目录 env: TOKEN: ${{ secrets.BUILD_TOKEN }} run: | DASH_TAG=$(curl -fsSL -H "Authorization: token ${TOKEN}" \ "${{ gitea.server_url }}/api/v1/repos/${DASH_REPO}/releases/latest" | jq -r '.tag_name') curl -fsSL -H "Authorization: token ${TOKEN}" \ -o dist.zip "${{ gitea.server_url }}/${DASH_REPO}/releases/download/${DASH_TAG}/dist.zip" rm -rf internal/webui/dist && mkdir -p internal/webui/dist unzip -q dist.zip -d internal/webui/dist test -f internal/webui/dist/index.html - name: 构建双架构二进制(artifact stage 导出) run: | docker buildx build --pull \ --platform linux/amd64,linux/arm64 \ --target artifact \ --output type=local,dest=./output . mkdir -p assets mv output/linux_amd64/oci-portal-server assets/oci-portal-server-linux-amd64 mv output/linux_arm64/oci-portal-server assets/oci-portal-server-linux-arm64 - name: 构建并推送多平台镜像(与上一步共享构建缓存) env: TOKEN: ${{ secrets.BUILD_TOKEN }} run: | echo "${TOKEN}" | docker login "${REGISTRY}" -u "${{ gitea.repository_owner }}" --password-stdin docker buildx build --pull \ --platform linux/amd64,linux/arm64 \ -t "${IMAGE}:${{ gitea.ref_name }}" -t "${IMAGE}:latest" \ --push . - name: 提取 CHANGELOG 版本段作为 Release 描述 run: | TAG="${{ gitea.ref_name }}" awk -v ver="${TAG#v}" '$0 ~ "^## \\[" ver "\\]" {flag=1; next} /^## \[/ && flag {exit} flag {print}' CHANGELOG.md > release-notes.md [ -s release-notes.md ] || echo "Release ${TAG}" > release-notes.md - name: 创建 Release 并上传二进制附件(重跑幂等,同名附件自动替换) uses: https://gitea.com/actions/gitea-release-action@v1 with: token: ${{ secrets.BUILD_TOKEN }} body_path: release-notes.md files: assets/*