ArgoCD Image Updater是如何運作的?
Argo CD Image Updater 是一種自動更新由 Argo CD 管理的 Kubernetes 工作負載的容器鏡像的工具。 該工具可以檢查與 Kubernetes 工作負載一起部署的容器鏡像的新版本,并使用 Argo CD 自動將其更新到允許的最新版本。它通過為 Argo CD 應用程序設置適當的應用程序參數來工作,類似于 argocd app set --helm-set image.tag=v1.0.1,但以完全自動化的方式。
Argo CD Image Updater 會定期輪詢 Argo CD 中配置的應用程序,并查詢相應的鏡像倉庫以獲取可能的新版本。如果在倉庫中找到新版本的鏡像,并且滿足版本約束,Argo CD 鏡像更新程序將指示 Argo CD 使用新版本的鏡像更新應用程序。
根據您的應用程序自動同步策略,Argo CD 將自動部署新的鏡像版本或將應用程序標記為不同步,您可以通過同步應用程序來手動觸發鏡像更新。
它是如何運作的?
Image Updater 程序通過讀取 ArgoCD 應用程序資源中的 annotations 來工作,這些注解指定應自動更新哪些鏡像。它會檢查指定鏡像倉庫中是否有較新的標簽,如果它們與預定義的模式或規則匹配,則使用這些較新的標簽更新應用程序清單。此自動化過程可確保您的應用程序始終運行最新版本的鏡像,遵循 GitOps 的一致性和可追溯性原則。
Image Updater 基本的工作流程如下所示:
- Annotation 配置:開發人員注解 ArgoCD 應用程序以告訴 Image Updater 要跟蹤哪些鏡像,包括標簽過濾和更新策略的規則。
- 鏡像倉庫輪詢:Image Updater 定期輪詢配置的鏡像倉庫以查找符合指定條件的新標簽。
- 自動更新:當找到新的匹配標簽時,Image Updater 會自動更新應用程序的 Kubernetes 清單中的鏡像標簽,并將更改提交回源 Git 存儲庫。
- 同步變更:ArgoCD 檢測到提交的更改,同步更新的清單,并將它們應用到 Kubernetes 集群。
特征
- 更新由 Argo CD 管理且由 Helm 或 Kustomize 工具生成的應用程序鏡像
- 根據不同的更新策略更新應用鏡像
- semver:根據給定的鏡像約束更新到允許的最高版本
- latest:更新到最近創建的鏡像標簽
- name:更新到按字母順序排序的列表中的最后一個標簽
- digest:更新到可變標簽的最新推送版本
- 支持廣泛使用的容器鏡像倉庫
- 通過配置支持私有容器鏡像倉庫
- 可以將更改寫回 Git
- 能夠使用匹配器函數過濾鏡像倉庫返回的標簽列表
- 在 Kubernetes 集群中運行,或者可以從命令行獨立使用
- 能夠執行應用程序的并行更新
另外需要注意的是使用該工具目前有幾個限制:
- 想要更新容器鏡像的應用程序必須使用 Argo CD 進行管理。不支持未使用 Argo CD 管理的工作負載。
- Argo CD 鏡像更新程序只能更新其清單使用 Kustomize 或 Helm 呈現的應用程序的容器鏡像,特別是在 Helm 的情況下,模板需要支持使用參數(即image.tag)。
- 鏡像拉取密鑰必須存在于 Argo CD Image Updater 運行(或有權訪問)的同一 Kubernetes 集群中。目前無法從其他集群獲取這些機密信息。
安裝
建議在運行 Argo CD 的同一個 Kubernetes 命名空間集群中運行 Argo CD Image Updater,但這不是必需的。事實上,甚至不需要在 Kubernetes 集群中運行 Argo CD Image Updater 或根本不需要訪問任何 Kubernetes 集群。但如果不訪問 Kubernetes,某些功能可能無法使用,所以強烈建議使用第一種安裝方法。
運行鏡像更新程序的最直接方法是將其作為 Kubernetes 工作負載安裝到運行 Argo CD 的命名空間中。這樣就不需要任何配置,也不會對你的工作負載產生任何影響。
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
安裝完成后我們就可以在 Argo CD 中看到 Argo CD Image Updater 組件了:
$ kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 21m
argocd-applicationset-controller-587b5c864b-2kt2v 1/1 Running 0 7d4h
argocd-dex-server-6958d7dcf4-66s6s 1/1 Running 0 7d4h
argocd-image-updater-57b788886d-d4qh5 1/1 Running 0 34s
argocd-notifications-controller-6847bd5c98-wqbjj 1/1 Running 0 7d4h
argocd-redis-6fcf5c8898-c6752 1/1 Running 0 7d4h
argocd-repo-server-9646985c8-7dmj5 1/1 Running 0 7d4h
argocd-server-67b76b54d7-hxx6q 1/1 Running 0 7d4h
現在我們就可以直接去監聽鏡像是否發生了變化,而不需要在 CI 流水線中去手動提交修改資源清單到代碼倉庫了。
配置
要充分利用 ArgoCD 鏡像更新程序,將其配置連接到鏡像倉庫至關重要,尤其是在使用私有倉庫或公共倉庫上的私有存儲庫時。以下是如何配置必要的憑據并了解可用的不同方法。
ArgoCD Image Updater 可以使用以下方法獲取憑據:
- 從 Kubernetes Secret 中獲取憑據:標準的 Docker Pull Secret 或自定義 Secret,憑證格式為
<username>:<password>
,比如我們可以用下面的命令來創建一個。
kubectl create -n argocd secret docker-registry dockerhub-secret \
--docker-username someuser \
--docker-password s0m3p4ssw0rd \
--docker-server "https://registry-1.docker.io"
這個 secret 可以被引用為 pullsecret:<namespace>/<secret_name> (pullsecret:argocd/dockerhub-secret)。
- 通用 Secret:通用 Secret 是包含單個鍵值對的 Secret,鍵值對可以是任何格式,比如我們可以用下面的命令來創建一個:
kubectl create -n argocd secret generic some-secret \
--from-literal=creds=someuser:s0m3p4ssw0rd
該 secret 可以用 secret:<namespace>/<secret_name>#<field_name> (secret:argocd/some-secret#creds) 的方式引用。
- 環境變量:將憑證存儲在環境變量中,該變量可以傳遞到 ArgoCD Image Updater pod,我們可以在 pod 的配置中設置:
env:
- name: DOCKER_HUB_CREDS
value: "someuser:s0m3p4ssw0rd"
該 secret 可以用 env:<name_of_environment_variable> (env:DOCKER_HUB_CREDS) 的方式引用。
- Script 腳本:使用以<username>:<password>格式輸出憑據的腳本。
#!/bin/sh
echo "someuser:s0m3p4ssw0rd"
將其引用為 ext:<full_path_to_script>。
我們這里就以 Github 的 Container Registry 為例,來演示下如何使用 ArgoCD Image Updater 來更新鏡像。
首先我們在 Github 個人設置頁面中創建一個個人訪問令牌,如下圖所示:
Token
這個 Token 的權限要包括 write:packages 和 read:packages,這樣我們才能推送和拉取鏡像,創建后會得到一個 Token。
然后我們可以在終端或命令行中,使用 GitHub 用戶名和 GitHub 的個人訪問令牌(PAT)登錄 GitHub Container Registry。
export PAT=<your-token>
echo $PAT | docker login ghcr.io -u <your-github-username> --password-stdin
將替換為個人訪問令牌,將替換為 GitHub 用戶名。
登錄成功后我們可以使用以下命令將 Docker 鏡像標記為 GitHub Container Registry 鏡像:
docker tag <your-image-name>:<tag> ghcr.io/<your-github-username>/<your-image-name>:<tag>
將 <your-image-name>:<tag> 替換為本地 Docker 鏡像名與 tag 名,將 <your-github-username> 替換為 GitHub 用戶名,<tag> 替換想要使用的標簽(例如默認的 latest 標簽)。
然后使用以下命令將 Docker 鏡像推送到 GitHub Container Registry 即可:
docker push ghcr.io/<your-github-username>/<your-image-name>:<tag>
完成以上步驟后,就可以在 GitHub 個人賬號的 的 Packages 部分看到 Docker 鏡像了,但是該鏡像默認為 private 鏡像,Pull 使用時需要先登錄。
github packages
現在回到我們的鏡像更新程序中,使用上面的 Token 來創建一個 Secret:
kubectl create -n argocd secret docker-registry ghcr-secret \
--docker-username=cnych \
--docker-password=$PAT \
--docker-server="https://ghcr.io"
設置憑據后,將它們配置在 ArgoCD 鏡像更新程序的配置中,以通過鏡像倉庫進行身份驗證,我們可以修改鏡像更新程序的配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-image-updater-config
namespace: argocd
data:
registries.conf: |
registries:
- name: ghcr-hub
api_url: https://ghcr.io # 鏡像倉庫地址
credentials: pullsecret:argocd/ghcr-secret # 憑據
defaultns: library # 默認命名空間
default: true # 默認倉庫
上面配置中我們指定了 GitHub 鏡像倉庫的憑據為 pullsecret:argocd/ghcr-secret,這樣 ArgoCD Image Updater 在訪問 ghcr.io 時就會使用這個憑據。
接下來我們還需要將 ArgoCD Image Updater 與 Git 集成,這也是重點,這樣 ArgoCD Image Updater 就可以將鏡像更新直接提交回源 Git 倉庫。
我們可以在 ArgoCD 的 Dashboard 中先添加一個 Git 倉庫 https://github.com/cnych/k8s-devops-gitops-demo:
add git repo
接下來我們可以按照正常使用方式創建一個新的 Application 對象,對應的資源清單文件如下所示:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-demo
namespace: argocd
spec:
destination:
namespace: gitops-demo
server: https://kubernetes.default.svc
project: default
source:
path: helm # 從 Helm 存儲庫創建應用程序時,chart 必須指定 path
repoURL: https://github.com/cnych/k8s-devops-gitops-demo.git
targetRevision: master
helm:
parameters:
- name: replicaCount
value: "2"
valueFiles:
- my-values.yaml
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
直接創建上面的資源清單文件后,ArgoCD 會自動創建一個 Application 資源對象,并且會自動同步到 Git 倉庫中,我們可以在 Git 倉庫中看到對應的資源清單文件:
gitops-demo
如果該應用出現了如下所示的錯誤信息:
Namespace gitops-demo SyncFailed resource :Namespace is not permitted in project default
則表面當前使用的 project 沒有權限創建 namespace,我們只需要為其添加對應的權限即可:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: default
namespace: argocd
spec:
clusterResourceWhitelist: # 白名單,表示允許訪問的資源
- group: "*"
kind: "*"
destinations:
- name: "*"
namespace: "*"
server: "*"
sourceRepos:
- "*"
我們可以使用 argocd app get 命令來查看 Application 資源對象的狀態:
$ argocd app get argocd/gitops-demo
Name: argocd/gitops-demo
Project: default
Server: https://kubernetes.default.svc
Namespace: gitops-demo
URL: https://grpc.argocd.k8s.local/applications/gitops-demo
Source:
- Repo: https://github.com/cnych/k8s-devops-gitops-demo.git
Target: master
Path: helm
Helm Values: my-values.yaml
SyncWindow: Sync Allowed
Sync Policy: Automated (Prune)
Sync Status: Synced to master (53d91ed)
Health Status: Progressing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Namespace gitops-demo Running Synced namespace/gitops-demo created
apps Deployment default gitops-demo-helm-guestbook Succeeded Pruned pruned
Service default gitops-demo-helm-guestbook Succeeded Pruned pruned
Service gitops-demo gitops-demo-devops-demo Synced Healthy service/gitops-demo-devops-demo created
apps Deployment gitops-demo gitops-demo-devops-demo Synced Progressing deployment.apps/gitops-demo-devops-demo created
networking.k8s.io Ingress gitops-demo gitops-demo-devops-demo Synced Progressing ingress.networking.k8s.io/gitops-demo-devops-demo created
需要注意要在目標命名空間中添加 Image Pull Secret。
正常我們這個應用就可以運行了:
$ curl http://gitops-demo.k8s.local/
{"msg":"Hello Tekton On GitLab With ArgoCD"}
但是在 Dashboard 中我們可以看到應用雖然已經是 Synced 狀態,但是 APP HEALTH 一直顯示為 Progressing 狀態。
App Health
這是因為 ArgoCD 的健康狀態機制引起的,我們可以在源碼 https://github.com/argoproj/gitops-engine/blob/master/pkg/health/health_ingress.go#L7 中看到健康狀態的檢查邏輯。
func getIngressHealth(obj *unstructured.Unstructured) (*HealthStatus, error) {
ingresses, _, _ := unstructured.NestedSlice(obj.Object, "status", "loadBalancer", "ingress")
health := HealthStatus{}
if len(ingresses) > 0 {
health.Status = HealthStatusHealthy
} else {
health.Status = HealthStatusProgressing
}
return &health, nil
}
他需要檢查 Ingress 資源對象的 status.loadBalancer.ingress 字段是否為空,如果為空則表示健康狀態為 Progressing,否則為 Healthy,但實際情況卻是并不是所有的 Ingress 資源對象都會自動生成 status.loadBalancer.ingress 字段,比如我們這里就并沒有生成。
這個時候我們可以通過配置 argocd-cm 的配置資源來修改健康狀態檢查邏輯,添加如下所示的配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
resource.customizations: |
networking.k8s.io/Ingress:
health.lua: |
hs = {}
if obj.metadata ~= nil and obj.metadata.creationTimestamp ~= nil then
hs.status = "Healthy"
hs.message = "Ingress 已創建"
else
hs.status = "Progressing"
hs.message = "Ingress 正在創建中"
end
return hs
上面的配置表示如果 Ingress 資源對象的 metadata.creationTimestamp 字段不為空,則表示健康狀態為 Healthy,否則為 Progressing,更新上面的配置后,我們再次查看應用的健康狀態就會發現已經變成了 Healthy 狀態:
App Health
接下來我們就可以使用 ArgoCD Image Updater 來更新鏡像了,修改上面的 Application 資源清單文件,我們需要添加一些注解來指定需要更新的鏡像規則策略,如下所示:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitops-demo
namespace: argocd
annotations:
argocd-image-updater.argoproj.io/image-list: myalias=ghcr.io/cnych/gitops-demo # 指定鏡像倉庫
argocd-image-updater.argoproj.io/myalias.allow-tags: regexp:^.*$ # 允許所有標簽
argocd-image-updater.argoproj.io/myalias.pull-secret: pullsecret:argocd/ghcr-secret # 指定憑據
argocd-image-updater.argoproj.io/myalias.update-strategy: latest # 指定更新策略
# argocd-image-updater.argoproj.io/myalias.ignore-tags: latest, master # 指定忽略的標簽
argocd-image-updater.argoproj.io/write-back-method: git # 指定寫回方法
argocd-image-updater.argoproj.io/git-branch: master # 指定 Git 分支
argocd-image-updater.argoproj.io/myalias.force-update: "true" # 強制更新
spec:
destination:
namespace: gitops-demo
server: https://kubernetes.default.svc
project: default
source:
path: helm # 從 Helm 存儲庫創建應用程序時,chart 必須指定 path
repoURL: https://github.com/cnych/k8s-devops-gitops-demo.git
targetRevision: master
helm:
parameters:
- name: replicaCount
value: "2"
valueFiles:
- my-values.yaml
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
這個新的資源對象中,我們添加了一些注釋,這些注釋用于配置 Argo CD Image Updater。這些配置用于指定自動更新容器鏡像的策略、參數和相關信息。以下是對這些注釋的詳細解釋:
- argocd-image-updater.argoproj.io/image-list: 這個注解定義了應用中使用的鏡像列表。
- argocd-image-updater.argoproj.io/allow-tags: 這個注解指定了允許更新的鏡像標簽,可以使用正則表達式的方式。
- argocd-image-updater.argoproj.io/<alias>.pull-secret: 這個注解指定了用于拉取鏡像的 Secret。
- argocd-image-updater.argoproj.io/update-strategy: 這個注解定義了鏡像更新策略。這里的值是 latest,表示使用最新的鏡像標簽進行更新,還可以指定的值包括:digest、name、semver。
- latest: 使用最新的鏡像標簽進行更新。
- digest: 使用鏡像的 digest 進行更新。
- name: 使用鏡像的名稱進行更新。
- semver: 使用 semver 進行更新。
- argocd-image-updater.argoproj.io/write-back-method: 這個注解定義了更新后的配置寫回方法。git 表示將更新后的配置寫回到 Git 倉庫。
- git: 將更新后的配置寫回到 Git 倉庫。
- patch: 使用 kubectl patch 命令更新資源。
- replace: 使用 kubectl replace 命令更新資源。
- argocd-image-updater.argoproj.io/git-branch: 這個注解定義了更新后的配置寫回到 Git 倉庫的分支。
現在我們重新更新 Application 資源對象即可。接下來我們只需要重新推送一個新的鏡像到 GitHub Container Registry 即可自動觸發 ArgoCD Image Updater 更新鏡像。
我們更新下倉庫中的 main.go 文件:
修改代碼
現在我們重新構建一個新的鏡像并推送到 GitHub Container Registry:
docker build --platform linux/amd64 -t ghcr.io/cnych/gitops-demo:v0.1.1 .
docker push ghcr.io/cnych/gitops-demo:v0.1.1
推送新的鏡像后,然后 Argo CD Image Updater 將會每 2 分鐘從鏡像倉庫去檢索鏡像版本變化,一旦發現有新的鏡像版本,它將自動使用新版本來更新集群內工作負載的鏡像,并將鏡像版本回寫到 Git 倉庫中去,我們可以去查看 Argo CD Image Updater 的日志變化:
$ kubectl logs -f argocd-image-updater-57b788886d-d4qh5 -n argocd
time="2024-09-27T06:51:32Z" level=info msg="argocd-image-updater v0.14.0+af844fe starting [loglevel:INFO, interval:2m0s, healthport:8080]"
time="2024-09-27T06:51:32Z" level=warning msg="commit message template at /app/config/commit.template does not exist, using default"
time="2024-09-27T08:35:39Z" level=warning msg="\"latest\" strategy has been renamed to \"newest-build\". Please switch to the new convention as support for the old naming convention will be removed in future versions." image_alias=myalias image_name=ghcr.io/cnych/gitops-demo registry_url=ghcr.io
time="2024-09-27T08:35:40Z" level=info msg="Processing results: applicatinotallow=1 images_cnotallow=1 images_skipped=0 images_updated=0 errors=0"
xxxxxxxxxxxxxxtime="2024-09-27T08:37:40Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"
time="2024-09-27T08:37:40Z" level=warning msg="\"latest\" strategy has been renamed to \"newest-build\". Please switch to the new convention as support for the old naming convention will be removed in future versions." image_alias=myalias image_name=ghcr.io/cnych/gitops-demo registry_url=ghcr.io
time="2024-09-27T08:37:44Z" level=info msg="Setting new image to ghcr.io/cnych/gitops-demo:v0.1.1" alias=myalias applicatinotallow=gitops-demo image_name=cnych/gitops-demo image_tag=latest registry=ghcr.io
time="2024-09-27T08:37:44Z" level=info msg="Successfully updated image 'ghcr.io/cnych/gitops-demo:latest' to 'ghcr.io/cnych/gitops-demo:v0.1.1', but pending spec update (dry run=false)" alias=myalias applicatinotallow=gitops-demo image_name=cnych/gitops-demo image_tag=latest registry=ghcr.io
time="2024-09-27T08:37:44Z" level=info msg="Committing 1 parameter update(s) for application gitops-demo" applicatinotallow=gitops-demo
time="2024-09-27T08:37:44Z" level=info msg="Starting configmap/secret informers"
time="2024-09-27T08:37:44Z" level=info msg="Configmap/secret informer synced"
time="2024-09-27T08:37:44Z" level=info msg="Initializing https://github.com/cnych/k8s-devops-gitops-demo.git to /tmp/git-gitops-demo1873820104"
time="2024-09-27T08:37:44Z" level=info msg="secrets informer cancelled"
time="2024-09-27T08:37:44Z" level=info msg="configmap informer cancelled"
time="2024-09-27T08:37:44Z" level=info msg="git fetch origin --tags --force --prune" dir=/tmp/git-gitops-demo1873820104 execID=acebc
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git fetch origin --tags --force --prune]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1640.146246
time="2024-09-27T08:37:46Z" level=info msg="git config user.name argocd-image-updater" dir=/tmp/git-gitops-demo1873820104 execID=7ec2d
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git config user.name argocd-image-updater]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1.5687190000000002
time="2024-09-27T08:37:46Z" level=info msg="git config user.email noreply@argoproj.io" dir=/tmp/git-gitops-demo1873820104 execID=6e796
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git config user.email noreply@argoproj.io]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1.688394
time="2024-09-27T08:37:46Z" level=info msg="git checkout --force master" dir=/tmp/git-gitops-demo1873820104 execID=403bb
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git checkout --force master]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=4.522311
time="2024-09-27T08:37:46Z" level=info msg="git clean -ffdx" dir=/tmp/git-gitops-demo1873820104 execID=b3f03
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git clean -ffdx]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1.429556
time="2024-09-27T08:37:46Z" level=info msg="git -c gpg.format=openpgp commit -a -F /tmp/image-updater-commit-msg441967746" dir=/tmp/git-gitops-demo1873820104 execID=0efc6
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git -c gpg.format=openpgp commit -a -F /tmp/image-updater-commit-msg441967746]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=5.239213
time="2024-09-27T08:37:46Z" level=info msg="git push origin master" dir=/tmp/git-gitops-demo1873820104 execID=fcd1f
time="2024-09-27T08:37:47Z" level=info msg=Trace args="[git push origin master]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1934.14529
time="2024-09-27T08:37:47Z" level=info msg="Successfully updated the live application spec" applicatinotallow=gitops-demo
time="2024-09-27T08:37:47Z" level=info msg="Processing results: applicatinotallow=1 images_cnotallow=1 images_skipped=0 images_updated=1 errors=0"
然后在 Git 倉庫中我們也可以看到有一條新的 commit 提交記錄,可以看到在回寫時,ArgoCD Image Updater 并不會直接修改倉庫的 values.yaml 文件,而是會創建一個專門用于覆蓋 Helm Chart values.yaml 的 .argocd-source-devops-demo.yaml 文件。
git commit
自動提交變更后,Argo CD 就會自動同步部署應用了。
app sync
當然現在訪問應用結果就是我們更改后的內容了:
$ curl http://gitops-demo.k8s.local/
{"msg":"Hello ArgoCD With Image Updater"}
另外我們可以注意到每次 Git 提交都與作者的姓名和電子郵件地址相關聯。如果未配置,Argo CD 鏡像更新程序執行的提交將使用 argocd-image-updater <noreply@argoproj.io> 作為作者。您可以使用 --git-commit-user 和 --git-commit-email 命令行開關覆蓋作者,或在 argocd-image-updater-config ConfigMap 中設置 git.user 和 git.email 即可。
同樣我們可以將 Argo CD Image Updater 使用的默認提交消息更改為適合你的方式。可以創建一個簡單的模板(使用 Golang Template),并通過將 argocd-image-updater-config ConfigMap 中的密鑰 git.commit-message-template 設置為模板的內容來使其可用,例如:
data:
git.commit-message-template: |
build: automatic update of {{ .AppName }}
{{ range .AppChanges -}}
updates image {{ .Image }} tag '{{ .OldTag }}' to '{{ .NewTag }}'
{{ end -}}
模板中提供了兩個頂級變量:
- .AppName 是正在更新的應用程序的名稱。
- .AppChanges 是更新所執行的更改的列表。此列表中的每個條目都是一個結構體,為每個更改提供以下信息:
- .Image 保存已更新圖像的全名。
- .OldTag 保存更新之前的標簽名稱或 SHA 摘要。
- .NewTag 保存更新為的標簽名稱或 SHA 摘要。