-
Notifications
You must be signed in to change notification settings - Fork 0
103 lines (94 loc) · 4.74 KB
/
Copy pathbuild-and-push-image.yml
File metadata and controls
103 lines (94 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Docker イメージをビルドして GHCR(ghcr.io)へ公開するワークフロー。
#
# デプロイ先は `docker compose pull` でこのイメージを取得して動かす前提。
#
# ビルドするのは linux/amd64 と linux/arm64。公開リポジトリなので Actions の実行時間も
# 公開パッケージのストレージ・転送量も無料で、非公開だった頃に amd64 だけにしていた
# 理由(枠の消費)が無くなった。エミュレーションは使わない —— .NET は
# クロスコンパイル(Dockerfile の `-a`)、Claude Code の CLI は
# 対象アーキのパッケージを取り出すだけなので、どちらもビルドホストのアーキで走る。
name: build-and-push-image
on:
push:
branches: [main]
tags: ["v*"]
# ドキュメントだけの変更ではイメージの中身が変わらないので、実行そのものを省く
# (実行時間は無料だが、中身の変わらないイメージを積み増しても読み手が困るだけ)
paths-ignore:
- "**.md"
- ".gitignore"
- "docker-compose*.yml"
- ".env.example"
# 手動実行(Actions タブの "Run workflow")
workflow_dispatch:
# 同じ ref への連続 push では古い実行を打ち切る(後から来たものだけが要る)
concurrency:
group: build-and-push-image-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
packages: write # GHCR への push に必要
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: リポジトリをチェックアウト
uses: actions/checkout@v7
- name: Buildx をセットアップ
uses: docker/setup-buildx-action@v4
- name: GHCR にログイン
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# タグ:
# latest … main への push 時(デプロイ先が通常追いかけるタグ)
# sha-<短縮SHA> … 毎回付ける固定タグ(どのコミットが動いているか後から特定できる)
# 直近 10 版まで残す(下の削除ステップ参照)
# v1.2.3 … `v*` タグを push した場合のみ
- name: イメージのタグ・ラベルを決める
id: meta
uses: docker/metadata-action@v6
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=sha,format=short,prefix=sha-
type=ref,event=tag
- name: イメージをビルドして push
uses: docker/build-push-action@v7
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
# attestation(provenance/sbom)は付けない —— pull 側で検証していないので、
# マニフェストに余分な要素が増えるだけ
provenance: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# レイヤーキャッシュを実行間で使い回す。csproj を触っていない push では
# NuGet の復元層ごと再利用される
cache-from: type=gha
cache-to: type=gha,mode=max
# 古いイメージを消して直近 10 版だけ残す。
#
# `latest` を付け替えても前の版は `sha-` タグ付きで残り続けるため、放っておくと
# push のたびに積み上がる。一覧が読めなくなるのと、どれが生きているか分からなく
# なるのを防ぐための掃除。
#
# 公開パッケージのストレージ・転送量は無料なので、枠のために消しているのではない。
# かつては 1 版だけ残していたが(非公開の枠を気にしていた頃の名残)、それだと
# `sha-` タグを指定して古い版へ戻す運用ができない —— 10 版あれば数日ぶんは戻せる。
#
# 失敗しても握りつぶさない(continue-on-error を付けない)。消せていないのに
# 成功に見えると、積み上がりに気づけないため。
# GITHUB_TOKEN で権限が足りない場合は、delete:packages + read:packages を持つ PAT を
# シークレット GHCR_CLEANUP_TOKEN に入れれば、そちらが使われる。
- name: 古いイメージを削除して直近 10 版だけ残す
uses: actions/delete-package-versions@v5
with:
package-name: ${{ github.event.repository.name }}
package-type: container
min-versions-to-keep: 10
token: ${{ secrets.GHCR_CLEANUP_TOKEN || secrets.GITHUB_TOKEN }}