
這一篇是為了補齊前篇更進一步的部分,我們要用 github action 的自動化幫助我們打包 image
並且上到我們指定的存放 image 的地方,像是 docker Registry, Habor 或是 AWS ECR
那因為其他都大同小異,我們這裡選用 AWS ECR 去實現相關功能
我們這裡在 .github/workflows 裡面新增 push-ecr.yaml
完整的 workflow 在下方
name: "push to ECR"
on:
push:
branches: [main]
tags: ["v*"]
workflow_dispatch:
permissions:
id-token: write
contents: read
concurrency:
group: ecr-push-${{ github.ref }}
cancel-in-progress: true
jobs:
build-and-push:
name: "build and push image"
runs-on: ubuntu-latest
steps:
- name: "checkout code"
uses: "actions/checkout@v4"
- name: "configure aws credential"
uses: "aws-actions/configure-aws-credentials@v4"
with:
role-to-assume: ${{ vars.AWS_ROLE_ARN }}
aws-region: ${{ vars.AWS_REGION }}
role-session-name: gha-${{ github.run_id }}
- name: "login intto ECR"
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: "docker metadata"
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ steps.login-ecr.outputs.registry }}/${{ vars.ECR_REPOSITORY }}
tags: |
type=sha,format=long
type=ref,event=branch
type=semver,pattern={{version}}
type=raw,value=latest,enable={{is_default_branch}}
- name: "setup docker buildx"
uses: docker/setup-buildx-action@v3
- name: "build and push"
id: build
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: "image digest"
run: echo "push digest = ${{ steps.build.outputs.digest }}"
以下為上面的流程圖,這樣看會比較清楚
這裡可以對應 yaml 上面所代表的意思
這裡應該有注意到我們 github action 有幾個 variable 要設置
我們先建立一個 github repo
Secrets and variables -> Action
Variable

把以下設定進去,
我們登入自己的 aws 帳號 並且建立 ECR
操作步驟
去左上角的搜尋框找 ECR
這時候可以進到 ECR 的頁面 -> 點擊創建
我們在匡選處(1) -> 輸入自己想要的 repo 名稱
大功告成 -> 其中這個 repo 名稱就是我們 ECR_REPOSITORY 參數的名稱,後面會用到
我們要建立一個角色給 github action 有相關權限可以 push images 給 我們的 image repo
操作步驟

identity provider

Add provider


OpenID Connect
https://token.actions.githubusercontent.com
Audience 的部分輸入 sts.amazonaws.com
Add Provider
補充說明 : (這個 Provider URL 和 Audience 是固定的 可以在 github doc 找得到 參照 github doc)
role -> 點選橘色按鈕 Create Role

Web identity
token.actions.githubusercontent.com
sts.amazonaws.com
然後就點擊下一步

我們這裡設置 AmazonEC2ContainerRegistryPowerUser 或是同等能涵蓋 push/pull ECR 的權限的也可以

最後一步了
role 的名稱 : 沒有硬性規定我這裡姑且叫做 gha-ecr-push
下方的 json 記得收緊一下權限,我們要在特定tag 才觸發,可以在建立後去 trust relationships 那裡編輯

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "<這裏是你的 oidc provider 基本上不用改>/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": [
"<這裏是你的github repo oidc 記得改,不要複製說不能用怪我QQ>:ref:refs/heads/main",
"<這裏是你的github repo oidc 記得改,不要複製說不能用怪我QQ>:ref:refs/tags/v*"
]
}
}
}
]
}
repo oidc 那段可以在 github oidc 那裡找得到(如下圖)

接下來我們可以用 tag push 看看結果了
git tag -a v-0.0.1 -m 'demo'
然後 push tag
git push origin v-0.0.1

我們這裡似乎寫得太多了,目前已經接近尾聲,我們應用的部分大致上也探討完了,
接下來我們要往 bun 不一定有人會用到的部分開始探討了