ArgoCD 挂钩 - 仅在发生更改时运行 PreSync 挂钩

Ces*_*sar 7 kubernetes argocd

我们有时希望在部署新版本应用程序之前运行一些数据库迁移作业。ArgoCD 中的常见方法似乎是使用 PreSync 挂钩,我已经测试过它并且似乎有效,但我发现它在功能方面有点有限,并且不确定我是否遗漏了某些内容或如果事情就是这样的话。

我希望它的工作方式是在数据库迁移作业以某种方式发生更改(很可能是新映像)时才运行,但是预同步作业的设计方式(并且可以理解)是始终运行每次同步时指定作业。从功能上来说,这很好,迁移作业将需要约 20 秒的时间来启动和完成,最终什么也不做,但是对于每个不相关的更改都发生这种情况显然并不理想。

我希望有某种方法可以实现我所缺少的“ArgoCD 本机”。

我当前使用的作业模板(并且运行每次同步)是这样的:

{{- define "project.migration_job" -}}
{{- $appsettings := (get .Values.global.apps .name) }}
---
apiVersion: batch/v1
kind: Job
metadata:
  generateName: {{ .name }}-
  annotations:
    argocd.argoproj.io/hook: PreSync
spec:
  template:
    spec:
      automountServiceAccountToken: false
      containers:
        - name: {{ .name }}
          image: "{{ .Values.global.repo }}/{{ .name }}:{{ $appsettings.image }}"
          resources:
            requests:
              memory: {{ $appsettings.memory | default "256Mi" | quote }}
              cpu: {{ $appsettings.cpu | default "75m" | quote }}
            limits:
              memory: {{ $appsettings.memory | default "256Mi" | quote }}
              cpu: {{ $appsettings.cpu | default "75m" | quote }}
          env:
            {{- include "project.environment_variables" (dict "Values" .Values "env" .env) | trim | nindent 12 -}}
            {{- include "project.secret_environment_variables" (dict "Values" .Values "secrets" .secrets) | trim | nindent 12 }}
      restartPolicy: Never
  backoffLimit: 2
{{ end -}}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

Eli*_*ley 0

我不知道是否有本地解决方案,但这可能会有所帮助:

在您的 PreSync 挂钩中:

  1. IMAGE_TAG_TO_DEPLOY:获取将从源存储库部署的图像标签(例如:curl -LSs https://x-access-token:"$GITHUB_TOKEN@raw.githubusercontent.com/company/project/master/path-to-image-tag.yaml"并解析图像标签值)
  2. COMMIT_ID_TO_DEPLOY:找到对应的commit IDIMAGE_TAG_TO_DEPLOY
  3. COMMIT_ID_DEPLOYED:查找名为的git标签指向的提交IDcurrently-deployed
  4. 如果COMMIT_ID_TO_DEPLOY== COMMIT_ID_DEPLOYED结束 PreSync Hook
  5. 执行 PreSync 挂钩所需的操作。
  6. 将 git 标签添加currently-deployedCOMMIT_ID_TO_DEPLOY您的 git 存储库中