【问题标题】:Jenkins X per environment values.yamlJenkins X 每个环境 values.yaml
【发布时间】:2019-02-19 18:30:21
【问题描述】:

我正在使用 Jenkins X 并尝试根据我要推广的环境通过 values.yaml 文件设置不同的变量。例如,在将发布从暂存升级到生产时,我希望我的 environment-xxxx-production 存储库中的 values.yaml 文件覆盖我的项目存储库中的值。

根据https://github.com/jenkins-x/jx/issues/1667#issuecomment-420901836 这个评论,这应该只需将变量放在environment-xxxx-production 存储库中即可。

我的项目中的示例deployment.yaml 文件。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ template "fullname" . }}
  labels:
    draft: {{ default "draft-app" .Values.draft }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        draft: {{ default "draft-app" .Values.draft }}
        app: {{ template "fullname" . }}
{{- if .Values.podAnnotations }}
      annotations:
{{ toYaml .Values.podAnnotations | indent 8 }}
{{- end }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        ports:
        - containerPort: {{ .Values.service.internalPort }}
{{/*
Here's the section in question.
*/}}
{{- if .Values.env }}
        env:
{{- if .Values.prBranch }}
          - name: MY_ENV
            value: "some_value"
{{- else }}
{{ toYaml .Values.env | indent 10 }}
{{- end }}
{{- end }}
        livenessProbe:
          httpGet:
            path: {{ .Values.probePath }}
            port: {{ .Values.service.internalPort }}
          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
          periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
          successThreshold: {{ .Values.livenessProbe.successThreshold }}
          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
        readinessProbe:
          httpGet:
            path: {{ .Values.probePath }}
            port: {{ .Values.service.internalPort }}
          periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
          successThreshold: {{ .Values.readinessProbe.successThreshold }}
          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
        resources:
{{ toYaml .Values.resources | indent 12 }}
      terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}

示例项目values.yaml 包含以下内容:

env:
  - name: MY_ENV
    value: "some_staging_value"

样本environment-xxxx-production values.yaml 包含以下内容:

env:
- name: MY_ENV
  value: some_production_value

我当然可以让预览和暂存环境变量正常工作。 但是,当我将应用程序推广到生产环境时,env environment-xxxx-production 中的列表不会覆盖 env 在项目本身的values.yaml 文件中列出。

【问题讨论】:

    标签: jenkins kubernetes-helm jenkins-x


    【解决方案1】:

    生产values.yaml 文件中的键需要是您在requirements.yaml 中使用的图表的名称——这就是helm 组合图表的方式。

    因此,如果您的应用在 requirements.yaml 中被称为 cheese,请尝试在 values.yaml 中使用它

    cheese:
      env:
      - name: MY_ENV
        value: some_production_value
    

    【讨论】:

    【解决方案2】:

    值得注意的是,截至今天,语法似乎发生了变化。

    使用jx create quickstart 创建应用程序时,如果我们查看部署模板 (your-app/charts/your-app/templates/deployment.yaml),则会显示部署的 env 部分填充如下:

            env:
    {{- range $pkey, $pval := .Values.env }}
            - name: {{ $pkey }}
              value: {{ quote $pval }}
    {{- end }}
    

    这意味着在 values.yaml 文件中,存在于您的 GitOps 存储库中,用于暂存、生产和应用程序存储库中的默认值;您的自定义 ENV 变量应添加为:

    your-app:
      env:
        MY_ENV_VAR: "Staging value for MY_ENV_VAR"
    

    其中“your-app”是您应用的名称,与 requirements.yaml 中的名称相匹配,正如 James 在他的回答中所解释的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多