每个环境的 Jenkins X values.yaml
Jenkins X per environment values.yaml
我正在使用 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
文件中列出。
生产 values.yaml
文件中的密钥需要是您在 requirements.yaml
中使用的图表的名称 - 这就是 helm 组合图表的方式。
因此,如果您的应用在 requirements.yaml
中被称为 cheese
,请尝试在 values.yaml
中使用它
cheese:
env:
- name: MY_ENV
value: some_production_value
值得注意的是,截至今天,语法似乎已经改变。
使用 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 在他的回答中所解释的那样。
我正在使用 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
文件中列出。
生产 values.yaml
文件中的密钥需要是您在 requirements.yaml
中使用的图表的名称 - 这就是 helm 组合图表的方式。
因此,如果您的应用在 requirements.yaml
中被称为 cheese
,请尝试在 values.yaml
cheese:
env:
- name: MY_ENV
value: some_production_value
值得注意的是,截至今天,语法似乎已经改变。
使用 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 在他的回答中所解释的那样。