Skip to content

release: v1.3.1 - 修复 Outlook OAuth 复用授权结果与 RefreshToken 明文写入 #20

release: v1.3.1 - 修复 Outlook OAuth 复用授权结果与 RefreshToken 明文写入

release: v1.3.1 - 修复 Outlook OAuth 复用授权结果与 RefreshToken 明文写入 #20

Workflow file for this run

# ============================================================================
# Magicmail Docker 镜像 CI/CD
# 多架构构建 (linux/amd64 + linux/arm64 + linux/arm/v7) 并同步推送至 Docker Hub + GitHub Container Registry
# 触发条件: 推送 tag (v*) 或手动触发
#
# 分支约定: 与 release.yml 一致,所有 v* tag(含 rc)都必须打在 main 上,
# 否则直接失败,避免在 dev 上误打 tag 时把镜像推到公共仓库。
# ============================================================================
name: Docker Image CI
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
push_image:
description: '是否推送到镜像仓库'
required: true
default: 'true'
type: choice
options:
- 'true'
- 'false'
image_tag:
description: '镜像标签 (留空则自动获取最新 git tag)'
required: false
default: ''
env:
# Docker Hub
REGISTRY_HUB: docker.io
IMAGE_NAME_HUB: ${{ github.repository }}
# GitHub Container Registry (ghcr.io)
REGISTRY_GHCR: ghcr.io
IMAGE_NAME_GHCR: ${{ github.repository }}
jobs:
build-and-push:
name: Build & Push Multi-Arch
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
# ─── 1. 检出代码 ──────────────────────────────
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史,包含 tags
# ─── 1b. 校验 tag 归属(尽早失败,别浪费多架构构建时间) ───
- name: 校验 tag 位置
if: github.event_name == 'push'
run: |
# tag 推送时 checkout 只拉了这一个 ref,main 分支的引用需要手动补
git fetch --no-tags origin '+refs/heads/main:refs/remotes/origin/main'
if ! git merge-base --is-ancestor HEAD origin/main; then
echo "::error::tag ${GITHUB_REF_NAME} 指向的提交 $(git rev-parse --short HEAD) 不在 main 分支上,拒绝构建镜像"
exit 1
fi
echo "OK: ${GITHUB_REF_NAME} @ $(git rev-parse --short HEAD) 位于 main"
# ─── 2. 配置 QEMU (支持多架构) ────────────────
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
# ─── 3. 配置 Buildx ──────────────────────────
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# ─── 4. 自动获取最新 git tag ─────────────────
- name: Get latest git tag
id: tag
run: |
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LATEST_TAG" ]; then
echo "tag=latest" >> $GITHUB_OUTPUT
else
# 去掉 v 前缀 (v1.2.3 → 1.2.3)
CLEAN_TAG="${LATEST_TAG#v}"
echo "tag=$CLEAN_TAG" >> $GITHUB_OUTPUT
fi
echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT
# 仅「正式版 tag 推送」才允许生成 latest / 1.2 / 1 这类浮动标签,
# 避免 rc 版 (v1.2.0-rc.1) 把 latest 指向预发布镜像。
if [[ "${GITHUB_REF}" == refs/tags/v* && "${GITHUB_REF_NAME}" != *-* ]]; then
echo "is_release=true" >> $GITHUB_OUTPUT
else
echo "is_release=false" >> $GITHUB_OUTPUT
fi
# ─── 5a. 登录 Docker Hub ─────────────────────
- name: Log in to Docker Hub
if: github.event_name == 'push' || inputs.push_image == 'true'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY_HUB }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# ─── 5b. 登录 GitHub Container Registry ──────
- name: Log in to GitHub Container Registry
if: github.event_name == 'push' || inputs.push_image == 'true'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY_GHCR }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# ─── 6. 提取元数据 (双仓库标签) ──────────────
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY_HUB }}/${{ env.IMAGE_NAME_HUB }}
${{ env.REGISTRY_GHCR }}/${{ env.IMAGE_NAME_GHCR }}
tags: |
# tag 推送: v1.2.3 → 1.2.3, 1.2, 1, latest
type=semver,pattern={{version}}
# 浮动标签只在正式版生成,rc/alpha 等预发布不参与
type=semver,pattern={{major}}.{{minor}},enable=${{ steps.tag.outputs.is_release }}
type=semver,pattern={{major}},enable=${{ steps.tag.outputs.is_release }}
# 注意: is_default_branch 在 tag 推送时恒为 false (ref 为 refs/tags/v*),
# 之前的写法导致 latest 标签从未被打上,这里改为按「正式版 tag 事件」启用
type=raw,value=latest,enable=${{ steps.tag.outputs.is_release }}
# 手动触发: 使用自定义标签或自动获取最新 git tag
type=raw,value=${{ inputs.image_tag }},enable=${{ github.event_name == 'workflow_dispatch' && inputs.image_tag != '' }}
type=raw,value=${{ steps.tag.outputs.tag }},enable=${{ github.event_name == 'workflow_dispatch' && inputs.image_tag == '' }}
# ─── 7. 构建并推送 (双仓库同步) ─────────────
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: ${{ github.event_name == 'push' || inputs.push_image == 'true' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: true
sbom: true