鏡像發佈後自動更新文檔網站

比較常見的一個場景是:

對於上面的流水線可以採用 Jenkins、Argo Workflow 或者其他類似工具。至於流水線的自動觸發,可以藉助代碼倉庫的 WebHook 或者像 Argo Events 這種事件驅動的框架。

可以選用 Harbor 作爲鏡像倉庫,它包括了:鏡像同步、鏡像清理、鏡像代理、統一身份認證等企業級功能。當然,你需要自己想辦法來確保其數據庫、緩存的高可用。

最後的環境更新環節,除了可以直接登錄環境操作以外,可以採用 Argo CD 這種 GitOps 的方式來維護,也可以採用鏡像更新控制器來實現自動更新。Argo 和 Flux 分別都提供了自己的方案:

  • Image Updater

  • Image refector and automation

Flux

下面是 Flux 提供的方案:

這裏有兩個組件,分別負責:掃描鏡像、更新代碼倉庫。

以 Kubernetes 應用爲例,如果把 Deployment、ConfigMap 等清單文件與業務代碼保存在同一個代碼倉庫中的話,需要注意避免鏡像更新導致的更新死循環。這種情況,可以在設置 commit message 和事件觸發的地方約定一個特殊字符串,下面是 ImageUpdateAutomation 的配置:

apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: dev-docs
namespace: default
spec:
interval: 3m
sourceRef:
kind: GitRepository
name: dev-docs
git:
checkout:
ref:
branch: main
commit:
author:
email: [email protected]
name: someone
messageTemplate: 'skip-ci: {{range .Updated.Images}}{{println .}}{{end}}'
push:
branch: main
update:
path: ./kubernetes
strategy: Setters

下面是 Argo Events 提供的 Sensor 功能的配置:

apiVersion: argoproj.io/v1alpha1
kind: Sensor
metadata:
name: dev-docs-release
namespace: default
spec:
dependencies:
- name: push
eventSourceName: default
eventName: push
filters:
exprLogicalOperator: "and"
data:
- path: body.object_kind
type: string
value:
- push
- path: body.project.name
type: string
value:
- dev-docs
exprs:
- expr: ref =~ "refs/heads/release-" || ref == "refs/heads/main"
fields:
- name: ref
path: body.ref
- expr: msg !~ "skip-ci"
fields:
- name: msg
path: commits[0].message

triggers:
- template:
name: trigger
argoWorkflow:
operation: submit
source:
resource:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dev-docs-push-
spec:
arguments:
parameters:
- name: branch
workflowTemplateRef:
name: dev-docs
parameters:
- src:
dependencyName: push
dataKey: body.ref
dest: spec.arguments.parameters.0.value

如果希望在某個環境中始終部署主幹分支的版本,可以考慮以時間戳爲鏡像 Tag,並設置 Harbor 僅保留最近(例如:30 天)內推送的鏡像。

以下是鏡像更新的配置:

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: dev-docs
namespace: default
spec:
imageRepositoryRef:
name: dev-docs
policy:
alphabetical:
order: asc

更多 DevOps 相關教程,請訪問:https://github.com/devops-ws

本文分享自微信公衆號 - Jenkins(Jenkins-Community)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章