sync-image #7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: sync-image | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| date: | |
| description: "可选:附加版本日期(例如 20251016),将额外同步 tag-<date>" | |
| required: false | |
| default: "" | |
| jobs: | |
| sync: | |
| name: Sync images from CNB to GHCR & Docker Hub | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: false | |
| - name: Setup skopeo | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends skopeo jq | |
| - name: Login to Docker Hub | |
| env: | |
| DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USERNAME }} | |
| DOCKERHUB_PASS: ${{ secrets.DOCKERHUB_TOKEN }} | |
| run: | | |
| if [ -n "${DOCKERHUB_USER}" ] && [ -n "${DOCKERHUB_PASS}" ]; then | |
| echo "$DOCKERHUB_PASS" | skopeo login docker.io --username "$DOCKERHUB_USER" --password-stdin | |
| else | |
| echo "[WARN] 未配置 Docker Hub 凭据,跳过登录" | |
| fi | |
| - name: Sync images directly | |
| run: | | |
| set -euo pipefail | |
| # 固定使用 cnb 作为源 | |
| src_key="cnb" | |
| echo "使用源: ${src_key}" | |
| date_input='${{ github.event.inputs.date }}' | |
| if [ -n "$date_input" ]; then | |
| echo "使用日期后缀: $date_input" | |
| else | |
| echo "未指定日期后缀" | |
| fi | |
| # 读取 registry 映射 | |
| ghcr_repo=$(jq -r '.registry["ddk"].github' mapping.json) | |
| docker_repo=$(jq -r '.registry["ddk"].docker' mapping.json) | |
| cnb_repo=$(jq -r '.registry["ddk"].cnb' mapping.json) | |
| ghcr_clang_repo=$(jq -r '.registry["ddk-clang"].github' mapping.json) | |
| docker_clang_repo=$(jq -r '.registry["ddk-clang"].docker' mapping.json) | |
| cnb_clang_repo=$(jq -r '.registry["ddk-clang"].cnb' mapping.json) | |
| # 选择源 | |
| src_ddk="$cnb_repo"; src_clang="$cnb_clang_repo" | |
| # ddk 标签:来自 mapping.json.android[].name | |
| echo "[INFO] 从 mapping.json 收集 ddk 标签" | |
| ddk_count=$(jq -r '.android | length' mapping.json) | |
| echo "ddk 标签数量: $ddk_count" | |
| while read -r tag; do | |
| echo "[DEBUG] ddk tag: $tag" | |
| name="ddk:$tag" | |
| src="$src_ddk:$tag" | |
| dst_ghcr="$ghcr_repo:$tag" | |
| dst_dock="$docker_repo:$tag" | |
| echo "=== 同步 $name ===" | |
| echo "源: $src" | |
| echo "→ GHCR: $dst_ghcr" | |
| echo "→ Docker: $dst_dock" | |
| skopeo copy --all docker://$src docker://$dst_ghcr | |
| if skopeo login --get-login docker.io >/dev/null 2>&1; then | |
| skopeo copy --all docker://$src docker://$dst_dock | |
| else | |
| echo "[WARN] 未登录 Docker Hub,跳过 $dst_dock" | |
| fi | |
| # 若指定日期,则添加额外的日期标签项(源使用原标签,目标标签追加 -$date) | |
| if [ -n "$date_input" ]; then | |
| echo "[DEBUG] ddk tag with date: ${tag}-$date_input" | |
| name_date="ddk:${tag}-$date_input" | |
| dst_ghcr_date="$ghcr_repo:${tag}-$date_input" | |
| dst_dock_date="$docker_repo:${tag}-$date_input" | |
| echo "=== 同步 $name_date ===" | |
| echo "源: $src" | |
| echo "→ GHCR: $dst_ghcr_date" | |
| echo "→ Docker: $dst_dock_date" | |
| skopeo copy --all docker://$src docker://$dst_ghcr_date | |
| if skopeo login --get-login docker.io >/dev/null 2>&1; then | |
| skopeo copy --all docker://$src docker://$dst_dock_date | |
| else | |
| echo "[WARN] 未登录 Docker Hub,跳过 $dst_dock_date" | |
| fi | |
| fi | |
| done < <(jq -r '.android[].name' mapping.json) | |
| # ddk-clang 标签:来自 mapping.json.clang[].version | |
| echo "[INFO] 从 mapping.json 收集 ddk-clang 标签" | |
| clang_count=$(jq -r '.clang | length' mapping.json) | |
| echo "ddk-clang 标签数量: $clang_count" | |
| while read -r tag; do | |
| echo "[DEBUG] clang tag: $tag" | |
| name="ddk-clang:$tag" | |
| src="$src_clang:$tag" | |
| dst_ghcr="$ghcr_clang_repo:$tag" | |
| dst_dock="$docker_clang_repo:$tag" | |
| echo "=== 同步 $name ===" | |
| echo "源: $src" | |
| echo "→ GHCR: $dst_ghcr" | |
| echo "→ Docker: $dst_dock" | |
| skopeo copy --all docker://$src docker://$dst_ghcr | |
| if skopeo login --get-login docker.io >/dev/null 2>&1; then | |
| skopeo copy --all docker://$src docker://$dst_dock | |
| else | |
| echo "[WARN] 未登录 Docker Hub,跳过 $dst_dock" | |
| fi | |
| if [ -n "$date_input" ]; then | |
| echo "[DEBUG] clang tag with date: ${tag}-$date_input" | |
| name_date="ddk-clang:${tag}-$date_input" | |
| dst_ghcr_date="$ghcr_clang_repo:${tag}-$date_input" | |
| dst_dock_date="$docker_clang_repo:${tag}-$date_input" | |
| echo "=== 同步 $name_date ===" | |
| echo "源: $src" | |
| echo "→ GHCR: $dst_ghcr_date" | |
| echo "→ Docker: $dst_dock_date" | |
| skopeo copy --all docker://$src docker://$dst_ghcr_date | |
| if skopeo login --get-login docker.io >/dev/null 2>&1; then | |
| skopeo copy --all docker://$src docker://$dst_dock_date | |
| else | |
| echo "[WARN] 未登录 Docker Hub,跳过 $dst_dock_date" | |
| fi | |
| fi | |
| done < <(jq -r '.clang[].version' mapping.json) | |
| echo "同步完成。源 → GHCR 与(可选)Docker Hub。" | tee -a $GITHUB_STEP_SUMMARY |