Closed13
GitHub Actionsでbuildとpushのstepを分けるには

以下をstepから分けたい。
理由はイメージビルドとインフラの構築を同時にやって起動時間を短縮するため
- name: Build
env:
REPO: xxxxxxxxxxx
run: docker build -t $(eval echo $REPO):latest
- name: push
env:
REPO: xxxxxxxxxxx
run: docker push $(eval echo $REPO):latest

step間のイメージ受け渡しはどうやるのか
↓でできそう

あってるかわからないけどストレージのコスト計算
Retention Periodで1日に設定する想定
20営業日の毎日1GBの容量をアップロード(1日で削除)
1GB * 480時間 = 480GB時間
480GB時間 / 744時間 = 約0.65GB月
(あってれば)問題なさそう!

Download後すぐに削除するactionを追加するともっとストレージをを圧縮できる
オープンソースなので、ストレージが無料枠を超えそうなら検討する。
(今回は導入を見送る)

やっぱり削除したくなってきてAPIで対応しようという気になってきた。
以下で行けるか確認
- name: Delete Artifact
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
ARTIFACT_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/${{ github.repository }}/actions/artifacts \
| jq -r '.artifacts[] | select(.name=="pre-build-image.tar") | .id')
if [ -n "$ARTIFACT_ID" ]; then
echo "Deleting existing artifact with ID $ARTIFACT_ID"
curl -X DELETE -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/${{ github.repository }}/actions/artifacts/$ARTIFACT_ID
else
echo "No existing artifact found."
fi

upload-artifactとdownload-artifactは癖が強すぎたので記事にする
- outputで出力する
- upload-artifactはworking-directoryが無視される
- download-artifactももちろんworking-directoryが無視される
- docker loadは沼るようなエラーを吐く
↓の記事で助かった。。
https://stackoverflow.com/questions/54499389/cant-load-docker-from-saved-tar-image

buildからartifactアップロードまで
以下で検証
- name: Build
run: docker build -t test:latest --output type=tar,dest=build-image.tar
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: build-image.tar
path: ./build-image.tar
retention-days: 1

アップロードまでは上手くいったけど容量が少ない。
サーバ起動で普通にエラーになった。save方式に変更してみる
- name: Build
run: |
docker build -t test:latest
docker save -o build-image.tar test:latest
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: build-image.tar
path: ./build-image.tar
retention-days: 1

Downloadについて
- name: Load Docker Image
run: docker load -i pre-build-image.tar

エラーになった。
調べるとimportでやるらしい?
- name: Load Docker Image
env:
REPO: xxxxxxxxxxx
run: cat build-image.tar | docker import - $(eval echo $REPO):latest

importだとサーバ起動時にエラー。
結果、docker loadでよかったがbuild時の出力形式がtar形式ではダメだった。
--output type=docker
でも良さそうだが、docker save
で対応する
- name: Build
env:
REPO: xxxxxxxxxxx
run: |
docker build -t $(eval echo $REPO):latest
docker save -o build-image.tar $(eval echo $REPO):latest
~~~~~
- name: Load Docker Image
run: docker load -i build-image.tar

どうして --output type=tar が問題になる場合があるのか?
-
--output type=tar
は Docker イメージではなく OCI イメージを保存します。 - この形式は docker load に対応していないため、通常のイメージ操作には向きません。
GPTによると、とのことでした

別の要因でbuild時に$REPOが取得できなかったので、暫定的にタグ付けしてpush前に再度タグ付けをするように変更
- name: Build Docker Image
run: |
docker build -t build-image:latest
docker save -o build-image.tar build-image:latest
~~~~
- name: push
env:
ECR_REPO: xxxxxxxxxxx
run: |
docker tag build-image:latest $(eval echo $REPO):latest
docker push $(eval echo $REPO):latest
evalやめたいんだけど、変数展開できない。。泣
このスクラップは3ヶ月前にクローズされました
ログインするとコメントできます