diff --git a/chart/jenkins-operator/Chart.yaml b/chart/jenkins-operator/Chart.yaml index 63dc4b69..66132d13 100644 --- a/chart/jenkins-operator/Chart.yaml +++ b/chart/jenkins-operator/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v1 appVersion: "0.3.3" description: Kubernetes native operator which fully manages Jenkins on Kubernetes name: jenkins-operator -version: 0.0.8 +version: 0.1.0 icon: https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/assets/jenkins-operator-icon.png diff --git a/chart/jenkins-operator/templates/backup.yaml b/chart/jenkins-operator/templates/backup.yaml new file mode 100644 index 00000000..f604f1f6 --- /dev/null +++ b/chart/jenkins-operator/templates/backup.yaml @@ -0,0 +1,17 @@ +{{ if .Values.jenkins.backup.pvc.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: jenkins-backup + namespace: {{ .Values.jenkins.namespace }} + labels: + app: jenkins-operator + jenkins-cr: {{ .Values.jenkins.name }} +spec: + storageClassName: {{ .Values.jenkins.backup.pvc.className }} + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.jenkins.backup.pvc.size }} +{{ end }} \ No newline at end of file diff --git a/chart/jenkins-operator/templates/configuration.yaml b/chart/jenkins-operator/templates/configuration.yaml new file mode 100644 index 00000000..c960ca4e --- /dev/null +++ b/chart/jenkins-operator/templates/configuration.yaml @@ -0,0 +1,20 @@ +{{ if .Values.jenkins.configuration.configurationAsCode.content }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: jenkins-{{ .Values.jenkins.name }}-casc + namespace: {{ .Values.jenkins.namespace }} +{{- with .Values.jenkins.configuration.configurationAsCode.content }} +data: {{ toYaml . | nindent 2 }} +{{- end }} +{{ end }} +{{ if .Values.jenkins.configuration.groovyScripts.content }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: jenkins-{{ .Values.jenkins.name }}-gs + namespace: {{ .Values.jenkins.namespace }} +{{- with .Values.jenkins.configuration.groovyScripts.content }} +data: {{ toYaml . | nindent 2 }} +{{- end }} +{{ end }} \ No newline at end of file diff --git a/chart/jenkins-operator/templates/jenkins-cr.yaml b/chart/jenkins-operator/templates/jenkins-cr.yaml deleted file mode 100644 index 124c3a98..00000000 --- a/chart/jenkins-operator/templates/jenkins-cr.yaml +++ /dev/null @@ -1,8 +0,0 @@ -{{ if .Values.jenkins.enabled }} -apiVersion: {{ .Values.jenkins.apiVersion }} -kind: Jenkins -metadata: - name: {{ .Values.jenkins.name }} -spec: - {{- toYaml .Values.jenkins.spec | nindent 4 }} -{{- end }} diff --git a/chart/jenkins-operator/templates/jenkins.yaml b/chart/jenkins-operator/templates/jenkins.yaml new file mode 100644 index 00000000..0e567943 --- /dev/null +++ b/chart/jenkins-operator/templates/jenkins.yaml @@ -0,0 +1,109 @@ +{{ if .Values.jenkins.enabled }} +apiVersion: {{ .Values.jenkins.apiVersion }} +kind: Jenkins +metadata: + name: {{ .Values.jenkins.name }} + namespace: {{ .Values.jenkins.namespace }} +spec: + {{- if .Values.jenkins.configuration.configurationAsCode.content }} + configurationAsCode: + configurations: + - name: jenkins-{{ .Values.jenkins.name }}-casc + secret: + {{- if .Values.jenkins.configuration.secretRefName }} + name: {{ .Values.jenkins.configuration.secretRefName }} + {{ else if .Values.jenkins.configuration.secretData }} + name: jenkins-{{ .Values.jenkins.name }} + {{- end }} + {{- end }} + {{- if .Values.jenkins.configuration.groovyScripts.content }} + groovyScripts: + configurations: + - name: jenkins-{{ .Values.jenkins.name }}-gs + secret: + {{- if .Values.jenkins.configuration.secretRefName }} + name: {{ .Values.jenkins.configuration.secretRefName }} + {{ else if .Values.jenkins.configuration.secretData }} + name: jenkins-{{ .Values.jenkins.name }} + {{- end }} + {{- end }} + {{- if .Values.jenkins.backup.enabled }} + backup: + containerName: {{ .Values.jenkins.backup.containerName }} + action: + exec: + {{- with .Values.jenkins.backup.backupCommand }} + command: {{ toYaml . | nindent 8 }} + {{- end }} + interval: {{ .Values.jenkins.backup.interval }} + makeBackupBeforePodDeletion: {{ .Values.jenkins.backup.makeBackupBeforePodDeletion }} + restore: + containerName: {{ .Values.jenkins.backup.containerName }} + action: + exec: + {{- with .Values.jenkins.backup.restoreCommand }} + command: {{ toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.jenkins.backup.recoveryOnce }} + recoveryOnce: {{ .Values.jenkins.backup.recoveryOnce }} + {{- end }} + {{- end }} + {{- with .Values.jenkins.notifications }} + notifications: {{ toYaml . | nindent 4 }} + {{- end }} + master: + {{- with .Values.jenkins.basePlugins }} + basePlugins: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.jenkins.plugins }} + plugins: {{ toYaml . | nindent 4 }} + {{- end }} + disableCSRFProtection: {{ .Values.jenkins.disableCSRFProtection }} + containers: + - name: {{ .Values.jenkins.name }}-master + image: {{ .Values.jenkins.image }} + imagePullPolicy: {{ .Values.jenkins.imagePullPolicy }} + {{- with .Values.jenkins.imagePullSecrets }} + imagePullSecrets: {{ toYaml . | nindent 10 }} + {{- end }} + livenessProbe: + failureThreshold: 12 + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: 80 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /login + port: http + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + {{- with .Values.jenkins.resources }} + resources: {{ toYaml . | nindent 10 }} + {{- end }} + {{- if .Values.jenkins.backup.enabled }} + - name: {{ .Values.jenkins.backup.containerName }} + image: {{ .Values.jenkins.backup.image }} + imagePullPolicy: IfNotPresent + {{- with .Values.jenkins.backup.env }} + env: {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.jenkins.backup.volumeMounts }} + volumeMounts: {{- toYaml . | nindent 8 }} + {{- end }} + {{- end }} + {{- with .Values.jenkins.volumes }} + volumes: {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.jenkins.seedJobs }} + seedJobs: {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/chart/jenkins-operator/templates/deployment.yaml b/chart/jenkins-operator/templates/operator.yaml similarity index 77% rename from chart/jenkins-operator/templates/deployment.yaml rename to chart/jenkins-operator/templates/operator.yaml index 40070b81..ca3af6a9 100644 --- a/chart/jenkins-operator/templates/deployment.yaml +++ b/chart/jenkins-operator/templates/operator.yaml @@ -5,7 +5,7 @@ metadata: labels: {{ include "jenkins-operator.labels" . | indent 4 }} spec: - replicas: {{ .Values.replicaCount }} + replicas: {{ .Values.operator.replicaCount }} selector: matchLabels: app.kubernetes.io/name: {{ include "jenkins-operator.name" . }} @@ -17,14 +17,14 @@ spec: app.kubernetes.io/instance: {{ .Release.Name }} spec: serviceAccountName: jenkins-operator - {{- with .Values.imagePullSecrets }} + {{- with .Values.operator.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} containers: - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} + image: {{ .Values.operator.image }} + imagePullPolicy: {{ .Values.operator.imagePullPolicy }} ports: - name: http containerPort: 80 @@ -44,16 +44,16 @@ spec: - name: OPERATOR_NAME value: "jenkins-operator" resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.nodeSelector }} + {{- toYaml .Values.operator.resources | nindent 12 }} + {{- with .Values.operator.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} {{- end }} - {{- with .Values.affinity }} + {{- with .Values.operator.affinity }} affinity: {{- toYaml . | nindent 8 }} {{- end }} - {{- with .Values.tolerations }} + {{- with .Values.operator.tolerations }} tolerations: {{- toYaml . | nindent 8 }} {{- end }} diff --git a/chart/jenkins-operator/templates/secret.yaml b/chart/jenkins-operator/templates/secret.yaml new file mode 100644 index 00000000..02ff72db --- /dev/null +++ b/chart/jenkins-operator/templates/secret.yaml @@ -0,0 +1,11 @@ +{{ if and (eq .Values.jenkins.configuration.secretRefName "") (.Values.jenkins.configuration.secretData) }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: jenkins-{{ .Values.jenkins.name }} + namespace: {{ .Values.jenkins.namespace }} +{{- with .Values.jenkins.configuration.secretData }} +data: {{ toYaml . | nindent 2 }} +{{- end }} +{{ end }} diff --git a/chart/jenkins-operator/values.yaml b/chart/jenkins-operator/values.yaml index 956cc3e0..12d56b9c 100644 --- a/chart/jenkins-operator/values.yaml +++ b/chart/jenkins-operator/values.yaml @@ -1,70 +1,209 @@ -# Default values for jenkins-operator. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: virtuslab/jenkins-operator - tag: v0.3.3 - pullPolicy: IfNotPresent - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" +# Jenkins Operator Helm chart +# Jenkins instance configuration jenkins: + # enabled can enable or disable the Jenkins instance + # Set to false if you have configured CR already and/or you want to deploy an operator only enabled: true + + # apiVersion is the version of the CR manifest + # The recommended and default value is "jenkins.io/v1alpha2" + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/v0.1.x/migration-guide-v1alpha1-to-v1alpha2/ for more migration guide apiVersion: jenkins.io/v1alpha2 - name: example - spec: - master: - containers: - - name: jenkins-master - image: jenkins/jenkins:lts - imagePullPolicy: Always - livenessProbe: - failureThreshold: 12 - httpGet: - path: /login - port: http - scheme: HTTP - initialDelaySeconds: 80 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 5 - readinessProbe: - failureThreshold: 3 - httpGet: - path: /login - port: http - scheme: HTTP - initialDelaySeconds: 30 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - resources: - limits: - cpu: 1500m - memory: 3Gi - requests: - cpu: "1" - memory: 500Mi -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi + # name of resource + # The pod name will be jenkins- (name will be set as suffix) + name: jenkins -nodeSelector: {} + # namespace is the namespace where the resources will be deployed + # It's not recommended to use default namespace + # Create new namespace for jenkins (called e.g. jenkins) + namespace: default -tolerations: [] + # image is the name (and tag) of the Jenkins instance + # Default: jenkins/jenkins:lts + # It's recommended to use LTS (tag: "lts") version + image: jenkins/jenkins:lts -affinity: {} + # imagePullPolicy defines policy for pulling images + imagePullPolicy: Always + + # disableCSRFProtection can enable or disable operator built-in CSRF protection + # Set it to true if you are using OpenShift Jenkins Plugin + # See https://github.com/jenkinsci/kubernetes-operator/pull/193 for more info + disableCSRFProtection: false + + # imagePullSecrets is used if you want to pull images from private repository + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/configuration/#pulling-docker-images-from-private-repositories for more info + imagePullSecrets: [] + + # notifications is feature that notify user about Jenkins reconcilation status + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/notifications/ for more info + notifications: [] + + # basePlugins are plugins installed and required by the operator + # Shouldn't contain plugins defined by user + # You can change their versions here + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/customization/#install-plugins for more details + # + # Example: + # + # basePlugins: + # - name: kubernetes + # version: 1.18.3 + # - name: workflow-job + # version: "2.34" + # - name: workflow-aggregator + # version: "2.6" + # - name: git + # version: 3.12.0 + # - name: job-dsl + # version: "1.76" + # - name: configuration-as-code + # version: "1.29" + # - name: configuration-as-code-support + # version: "1.19" + # - name: kubernetes-credentials-provider + # version: 0.12.1 + basePlugins: [] + + # plugins are plugins required by the user + # You can define plugins here + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/customization/#install-plugins for more details + # + # Example: + # + # plugins: + # - name: simple-theme-plugin + # version: 0.5.1 + plugins: [] + + # seedJobs is placeholder for jenkins seed jobs + # For seed job creation tutorial, check https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/configuration/#prepare-job-definitions-and-pipelines + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/configuration/#configure-seed-jobs for additional info + # Example: + # + # seedJobs: + # - id: jenkins-operator + # targets: "cicd/jobs/*.jenkins" + # description: "Jenkins Operator repository" + # repositoryBranch: master + # repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git + seedJobs: [] + + # Resource limit/request for Jenkins + # See https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ for details + resources: + limits: + cpu: 1500m + memory: 3Gi + requests: + cpu: 1 + memory: 500Mi + + # volumes used by Jenkins + # By default, we are only using backup + volumes: + - name: backup # PVC volume where backups will be stored + persistentVolumeClaim: + claimName: jenkins-backup + + # backup is section for configuring operator's backup feature + # By default backup feature is enabled and pre-configured + # This section simplifies the configuration described here: https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/configure-backup-and-restore/ + # For customization tips see https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/custom-backup-and-restore/ + backup: + # enabled is enable/disable switch for backup feature + # By default the feature is enabled + enabled: true + + # image used by backup feature + # By default using prebuilt backup PVC image by VirtusLab + image: virtuslab/jenkins-operator-backup-pvc:v0.0.8 + + # containerName is backup container name + containerName: backup + + # interval defines how often make backup in seconds + interval: 30 + + # makeBackupBeforePodDeletion when enabled will make backup before pod deletion + makeBackupBeforePodDeletion: true + + # backupCommand is backup container command + backupCommand: + - /home/user/bin/backup.sh + + # restoreCommand is backup restore command + restoreCommand: + - /home/user/bin/restore.sh + + # pvc is Persistent Volume Claim Kubernetes resource + pvc: + # enabled is enable/disable switch for PVC + enabled: true + + # size is size of PVC + size: 5Gi + + # className is storageClassName for PVC + # See https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1 for more details + className: "" + + # env contains container environment variables + # PVC backup provider handles these variables: + # BACKUP_DIR - path for storing backup files (default: "/backup") + # JENKINS_HOME - path to jenkins home (default: "/jenkins-home") + # BACKUP_COUNT - define how much recent backups will be kept + env: + - name: BACKUP_DIR + value: /backup + - name: JENKINS_HOME + value: /jenkins-home + - name: BACKUP_COUNT + value: "3" # keep only the 3 most recent backups + + # volumeMounts holds the mount points for volumes + volumeMounts: + - name: jenkins-home + mountPath: /jenkins-home # Jenkins home volume + - mountPath: /backup # backup volume + name: backup + + # configuration is section where we can configure Jenkins instance + # See https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/customization/ for details + configuration: + configurationAsCode: + content: {} + groovyScripts: + content: {} + + # secretRefName of existing secret (previously created) + secretRefName: "" + + # secretData creates new secret if secretRefName is empty and fills with data provided in secretData + secretData: {} + +# operator is section for configuring operator deployment +operator: + replicaCount: 1 + + # image is the name (and tag) of the Jenkins Operator image + image: virtuslab/jenkins-operator:v0.3.3 + + # imagePullPolicy defines policy for pulling images + imagePullPolicy: IfNotPresent + + # imagePullSecrets is used if you want to pull images from private repository + imagePullSecrets: [] + + # nameOverride overrides the app name + nameOverride: "" + + # fullnameOverride overrides the deployment name + fullnameOverride: "" + + resources: {} + nodeSelector: {} + tolerations: [] + affinity: {}