15 changed files with 1100 additions and 0 deletions
			
			
		| @ -0,0 +1,21 @@ | |||||
|  | # Patterns to ignore when building packages. | ||||
|  | # This supports shell glob matching, relative path matching, and | ||||
|  | # negation (prefixed with !). Only one pattern per line. | ||||
|  | .DS_Store | ||||
|  | # Common VCS dirs | ||||
|  | .git/ | ||||
|  | .gitignore | ||||
|  | .bzr/ | ||||
|  | .bzrignore | ||||
|  | .hg/ | ||||
|  | .hgignore | ||||
|  | .svn/ | ||||
|  | # Common backup files | ||||
|  | *.swp | ||||
|  | *.bak | ||||
|  | *.tmp | ||||
|  | *~ | ||||
|  | # Various IDEs | ||||
|  | .project | ||||
|  | .idea/ | ||||
|  | *.tmproj | ||||
| @ -0,0 +1,17 @@ | |||||
|  | --- | ||||
|  | apiVersion: v1 | ||||
|  | name: my-bloody-jenkins | ||||
|  | version: 0.1.186 | ||||
|  | appVersion: "2.332.3-277" | ||||
|  | icon: https://raw.githubusercontent.com/odavid/k8s-helm-charts/master/charts/my-bloody-jenkins/logo/jenkins-logo.png | ||||
|  | description: > | ||||
|  |   A Helm chart for my-bloody-jenkins - a self configured jenkins docker image, based on Jenkins LTS. | ||||
|  |   Inspired by https://github.com/kubernetes/charts/tree/master/stable/jenkins, but better suites https://github.com/odavid/my-bloody-jenkins | ||||
|  | sources: | ||||
|  |   - https://github.com/odavid/my-bloody-jenkins | ||||
|  |   - https://github.com/odavid/k8s-helm-charts/tree/master/charts/my-bloody-jenkins | ||||
|  |   - https://github.com/odavid/jenkins-jnlp-slave | ||||
|  | maintainers: | ||||
|  |   - name: odavid | ||||
|  |     email: ohad.david@gmail.com | ||||
|  | home: https://github.com/odavid/my-bloody-jenkins | ||||
| @ -0,0 +1,192 @@ | |||||
|  | # My Bloody Jenkins | ||||
|  | 
 | ||||
|  | ## Prerequisites Details | ||||
|  | * Kubernetes 1.8+ | ||||
|  | 
 | ||||
|  | ## Chart Details | ||||
|  | The chart will do the following: | ||||
|  | * Deploy [My Bloody Jenkins](https://github.com/odavid/my-bloody-jenkins) | ||||
|  | * Manage Configuration in a dedicated ConfigMap | ||||
|  | * Configures Jenkins to use a default [k8s jenkins cloud](https://plugins.jenkins.io/kubernetes) | ||||
|  | * Optionally expose Jenkins with [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) | ||||
|  | * Manages a [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) for Jenkins Storage | ||||
|  | * Optionally mount extenral [secrets](https://kubernetes.io/docs/concepts/configuration/secret/) as volumes to be used within the configuration [See docs](https://github.com/odavid/my-bloody-jenkins/pull/102) | ||||
|  | * Optionally mount external [configMaps](https://kubernetes-v1-4.github.io/docs/user-guide/configmap/) to be used as configuration data sources [See docs](https://github.com/odavid/my-bloody-jenkins/pull/102) | ||||
|  | * Optionally configures [rbac](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) and a dedicated [service account](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | ## Installing the Chart | ||||
|  | First add the following repo: | ||||
|  | 
 | ||||
|  | ```shell | ||||
|  | helm repo add odavid https://odavid.github.io/k8s-helm-charts | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | To install the chart with the release name `jenkins`: | ||||
|  | ```shell | ||||
|  | helm install --name jenkins odavid/my-bloody-jenkins | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | To install the chart with a custom configuration values.yml | ||||
|  | ```shell | ||||
|  | helm install --name jenkins odavid/my-bloody-jenkins -f <valueFiles> | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | ## Upgrading the Release | ||||
|  | To install the chart with a custom configuration values.yml | ||||
|  | ```shell | ||||
|  | helm upgrade jenkins odavid/my-bloody-jenkins -f <valueFiles> | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | ## Deleting the Chart | ||||
|  | ```shell | ||||
|  | helm delete jenkins | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | ## Docker Image | ||||
|  | By default the chart uses the [latest release of `odavid/my-bloody-jenkins`](https://hub.docker.com/r/odavid/my-bloody-jenkins/tags/) image. | ||||
|  | The Helm Chart provides a way to use different repo or tags: | ||||
|  | * `image.repository` - by default `odavid/my-bloody-jenkins` | ||||
|  | * `image.tag` | ||||
|  | * `image.pullPolicy` - by default `IfNotPresent` | ||||
|  | * `image.imagePullSecret` - not set by default | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | ## CPU and Memory Resources | ||||
|  | The Helm chart comes with support for configured resource requests and limits. | ||||
|  | By default these values are commented out. | ||||
|  | It is __highly__ recommended to change this behavior on a production deployment. Also the Helm Chart provides a way to control Jenkins Java Memory Opts. When using Jenkins in production, you will need to set the values that suites your needs. | ||||
|  | 
 | ||||
|  | ## Persistence | ||||
|  | By default the helm chart allocates a 20gb volume for jenkins storage. | ||||
|  | The chart provides the ability to control: | ||||
|  | * `persistence.jenkinsHome.enabled` - if set to false, jenkins home will be using empty{} volume instead of persistentVolumeClaim. Default is `true` | ||||
|  | * `persistence.jenkinsHome.size` - the managed volume size | ||||
|  | * `persistence.jenkinsHome.storageClass` - If set to `"-"`, then storageClass: `""`, which disables dynamic provisioning. If undefined (the default) or set to null, no storageClass spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) | ||||
|  | * `persistence.jenkinsHome.existingClaim` - if provided, jenkins storage will be stored on an manually managed persistentVolumeClaim | ||||
|  | * `persistence.jenkinsHome.annotations` - annotations that will be added to the managed persistentVolumeClaim | ||||
|  | 
 | ||||
|  | ## Secrets | ||||
|  | My Bloody Jenkins natively supports [environment variable substitution](https://github.com/odavid/my-bloody-jenkins#environment-variable-substitution-and-remove-master-env-vars) within its configuration files. | ||||
|  | The Helm Chart provides a simple way to map [k8s secrets] in dedicated folders that will be later on used as environment variables datasource. | ||||
|  | 
 | ||||
|  | In order to use this feature, you will need to create external secrets and then use: `envSecrets` property to add these secrets to the search order. | ||||
|  | For example: | ||||
|  | ```shell | ||||
|  | echo -n 'admin' > ./username | ||||
|  | echo -n 'password' > ./password | ||||
|  | kubectl create secret generic my-jenkins-secret --from-file=./username --from-file=./password | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | Then add this secret to values.yml: | ||||
|  | ```yaml | ||||
|  | envSecrets: | ||||
|  |     - my-jenkins-secret | ||||
|  | ``` | ||||
|  | Now, you can refer these secrets as environmnet variables: | ||||
|  | * `MY_JENKINS_SECRET_USERNAME` | ||||
|  | * `MY_JENKINS_SECRET_PASSWORD` | ||||
|  | 
 | ||||
|  | See [Support multiple data sources and secrets from files](https://github.com/odavid/my-bloody-jenkins/pull/102) for more details | ||||
|  | 
 | ||||
|  | The chart also support creating a dedicated k8s secret, which all its keys will become `JENKINS_SECRET_<KEY>`. In order to use it, you will need to provided a key/value dict under the `secrets` value | ||||
|  | 
 | ||||
|  | ## Managed Configuration and additional ConfigMaps | ||||
|  | My Bloody Jenkins natively supports watching multiple config data sources and merge them into one config top to bottom | ||||
|  | The Helm Chart provides a way to define a `managedConfig` yaml within the chart values.yml as well as add additional external `configMaps` that will be merged/override the default configuration. | ||||
|  | 
 | ||||
|  | See [Support multiple data sources and secrets from files](https://github.com/odavid/my-bloody-jenkins/pull/102) for more details | ||||
|  | The `managedConfig` is mounted as `/var/jenkins_managed_config/jenkins-config.yml` and contains the `managedConfig` yaml contents | ||||
|  | 
 | ||||
|  | Additional `configMaps` list are mounted as `/var/jenkins_config/<ConfigMapName>` within the container and are merged with the `managedConfig` | ||||
|  | 
 | ||||
|  | ## Default K8S Jenkins Cloud for provisioning slaves within k8s | ||||
|  | By default the Helm Chart Configures a [kubernetes cloud](https://plugins.jenkins.io/kubernetes) with a simple jnlp slave template. | ||||
|  | For disabling this behavior, you need to set `defaultK8sCloud.enabled` to `false` | ||||
|  | The following attributes can control the default template: | ||||
|  | * `defaultK8sCloud.name` - the name of the k8s cloud - default (`k8s`) | ||||
|  | * `defaultK8sCloud.labels` - list of agent labels that are used to provision the node - e.g. ```node(labels){}``` pipeline step - default (`["generic"]`) | ||||
|  | * `defaultK8sCloud.jvmArgs` - JVM Args for the JNLP Slave - default (`"-Xmx1g"`) | ||||
|  | * `defaultK8sCloud.remoteFs` - JNLP Remote FS - default (`"/home/jenkins"`) | ||||
|  | * `defaultK8sCloud.image` - JNLP Slave Image - default (`"odavid/jenkins-jnlp-slave:latest"`) | ||||
|  | 
 | ||||
|  | ## Configuration | ||||
|  | 
 | ||||
|  | The following table lists the configurable parameters of the chart and their default values. | ||||
|  | 
 | ||||
|  | |         Parameter         |           Description             |                         Default                          | | ||||
|  | |---------------------------|-----------------------------------|----------------------------------------------------------| | ||||
|  | | `managedConfig` | `My Bloody Jenkins` Configuration yaml - See [Configuration Reference](https://github.com/odavid/my-bloody-jenkins#configuration-reference) | | ||||
|  | | `defaultK8sCloud.enabled` | If `true` a default k8s jenkins cloud will be configured to enable automatic slave provisioning | `true` | ||||
|  | | `defaultK8sCloud.name` | The name of the default k8s cloud | `k8s` | ||||
|  | | `defaultK8sCloud.labels` | List of labels that mark the k8s provisioned slaves, use `node(label){}` within pipeline | `["generic"]` | ||||
|  | | `defaultK8sCloud.jvmArgs` | Default JVM Args to pass to the jnlp slave of the k8s cloud | `-Xmx1g` | ||||
|  | | `defaultK8sCloud.remoteFs` | The remoteFS of the JNLP Slave | `/home/jenkins` | ||||
|  | | `defaultK8sCloud.image` | The docker image of the JNLP Slave | `odavid/jenkins-jnlp-slave:latest` | ||||
|  | | `image.repository`        | `My Bloody Jenkins` Docker Image       | `odavid/my-bloody-jenkins` | ||||
|  | | `image.tag`               | `My Bloody Jenkins` Docker Image Tag       | `2.121.1-62` | ||||
|  | | `image.pullPolicy`        | Image Pull Policy                 | `IfNotPresent` | ||||
|  | | `image.imagePullSecrets`        | Docker registry pull secret       | | ||||
|  | | `service.type`            | Service Type   | `LoadBalanacer` | ||||
|  | | `service.externalTrafficPolicy` | externalTrafficPolicy | | ||||
|  | | `service.annotations`        | Service Annotations       | `{}` | ||||
|  | | `service.loadBalancerSourceRanges`        | Array Of IP CIDR ranges to whitelist (Only if service type is `LoadBalancer`) | | ||||
|  | | `service.loadBalancerIP`        | Service Load Balancer IP Address (Only if service type is `LoadBalancer`) | | ||||
|  | | `ingress.enabled`        | If `true` Ingress will be created      | `false` | ||||
|  | | `ingress.httpProtocol`  |  Change to https if the ingress uses tls or you are using external tls termination using annotations | `http` | ||||
|  | | `ingress.path`        | Ingress Path (Only if ingress is enabled)| `/` | ||||
|  | | `ingress.additionalRules`        | Additional Ingress Rules| `[]` that will be appended to the actual ingress rule. | ||||
|  | | `ingress.preAdditionalRules`        | Additional Ingress Rules| `[]` that will be pre-appended to the actual ingress rule. Useful when using alb ingress class with [actions](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | ||||
|  | | `ingress.annotations`        | Ingress Annoations| `{}` | ||||
|  | | `ingress.labels`        | Ingress Labels| `{}` | ||||
|  | | `ingress.hostname`        | Ingress Hostname | | ||||
|  | | `ingress.ingressClassName`        | Ingress Class Name |  | ||||
|  | | `ingress.pathType`        | Ingress Path Type | `Prefix` | ||||
|  | | `ingress.tls.secretName`        | Ingress TLS Secret Name - if provided, the ingress will terminate TLS using the certificate and private key in this secret. This setting is mutually exclusive with ingress.tls.certificate and ingress.tls.privateKey| | ||||
|  | | `ingress.tls.certificate`        | Ingress TLS Certificate - if provided, the ingress will use this certificate. Use in conjunction with ingress.tls.privateKey| | ||||
|  | | `ingress.tls.privateKey`        | Ingress TLS private key - if provided, the ingress will use this private key. Use in conjunction with ingress.tls.certificate | | ||||
|  | | `rbac.create`        | If `true` - a ServiceAccount, and a Role will be created| `true` | ||||
|  | | `rbac.createServiceAccount`        | If `createServiceAccount` = `false`, and `rbac.create` = `true`, the chart will only use the `rbac.serviceAaccountName` within RoleBindings | true | ||||
|  | | `rbac.serviceAccountName`        | Ignored if createServiceAccount = true | `default` | ||||
|  | | `rbac.serviceAccount.annotations`        | Specify ServiceAccount annotations | {} | ||||
|  | | `rbac.clusterWideAccess`        | If `true` - A ClusterRole will be created instead of Role - relevant only if `rbac.create` is `true`| `false` | ||||
|  | | `resources.requests.cpu` | Initial CPU Request  | | ||||
|  | | `resources.requests.memory` | Initial Memory Request  | | ||||
|  | | `resources.limits.cpu` | CPU Limit | | ||||
|  | | `resources.limits.memory` | Memory Limit | | ||||
|  | | `readinessProbe.timeoutSeconds` | Readiness Probe Timeout in seconds | `5` | ||||
|  | | `readinessProbe.initialDelaySeconds` | Readiness Probe Initial Delay in seconds | `5` | ||||
|  | | `readinessProbe.periodSeconds` | Readiness Probe - check for readiess every `X` seconds | `5` | ||||
|  | | `readinessProbe.failureThreshold` | Readiness Probe - Mark the pod as not ready for traffic after `X` consecutive failures | `3` | ||||
|  | | `livenessProbe.timeoutSeconds` | Liveness Probe Timeout in seconds | `5` | ||||
|  | | `livenessProbe.initialDelaySeconds` | Liveness Probe Initial Delay in seconds - a high value since it takes time to start| `600` | ||||
|  | | `livenessProbe.periodSeconds` | Liveness  Probe - check for liveness every `X` seconds | `5` | ||||
|  | | `livenessProbe.failureThreshold` | Liveness Probe - Kill the pod after `X` consecutive failures | `3` | ||||
|  | | `persistence.mountDockerSocket` | If `true` - `/var/run/docker.sock` will be mounted | `true` | ||||
|  | | `persistence.jenkinsHome.enabled` | If `true` - Jenkins Storage will be persistent | `true` | ||||
|  | | `persistence.jenkinsHome.existingClaim` | External Jenkins Storage PesistentVolumeClaim - if set, then no volume claim will be created by the Helm Chart| | ||||
|  | | `persistence.jenkinsHome.annotations` | Jenkins Storage PesistentVolumeClaim annotations | `{}` | ||||
|  | | `persistence.jenkinsHome.accessMode` | Jenkins Storage PesistentVolumeClaim accessMode | `ReadWriteOnce` | ||||
|  | | `persistence.jenkinsHome.size` | Jenkins Storage PesistentVolumeClaim size | `20Gi` | ||||
|  | | `persistence.jenkinsHome.storageClass` | External Jenkins Storage PesistentVolumeClaim | If set to `"-"`, then storageClass: `""`, which disables dynamic provisioning. If undefined (the default) or set to null, no storageClass spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) | ||||
|  | | `persistence.jenkinsWorkspace.enabled` | If `true` - Jenkins Workspace Storage will be persistent | `false` | ||||
|  | | `persistence.jenkinsWorkspace.existingClaim` | External Jenkins Workspace Storage PesistentVolumeClaim - if set, then no volume claim will be created by the Helm Chart| | ||||
|  | | `persistence.jenkinsWorkspace.annotations` | Jenkins Workspace Storage PesistentVolumeClaim annotations | `{}` | ||||
|  | | `persistence.jenkinsWorkspace.accessMode` | Jenkins Workspace Storage PesistentVolumeClaim accessMode | `ReadWriteOnce` | ||||
|  | | `persistence.jenkinsWorkspace.size` | Jenkins Workspace Storage PesistentVolumeClaim size | `8Gi` | ||||
|  | | `persistence.jenkinsWorkspace.storageClass` | External Jenkins Workspace Storage PesistentVolumeClaim | If set to `"-"`, then storageClass: `""`, which disables dynamic provisioning. If undefined (the default) or set to null, no storageClass spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) | ||||
|  | | `podAnnotations` | Additional Pod Annotations | `{}` | ||||
|  | | `persistence.volumes` | Additional volumes to be included within the Deployments | | ||||
|  | | `persistence.mounts` | Additional mounts to be mounted to the container | | ||||
|  | | `nodeSelector` | Node Selector | `{}` | ||||
|  | | `tolerations` | Tolerations | `[]` | ||||
|  | | `securityContxet` | Security Context for jenkins pod | `{}` | ||||
|  | | `affinity` | Affinity | `{}` | ||||
|  | | `env` | Additional Environment Variables to be passed to the container - format `key`: `value` | | ||||
|  | | `secret` | A dict containing KEY/VALUE pairs. Each pair will become an environment variable `JENKINS_SECRET_<KEY>`, if the `secrets` dict is not empty a k8s secret will be created| | ||||
|  | | `envSecrets` | List of external secret names to be mounted as env secrets - see [Docs](https://github.com/odavid/my-bloody-jenkins/pull/102) | | ||||
|  | | `configMaps` | List of external config maps to be used as configuration files - see [Docs](https://github.com/odavid/my-bloody-jenkins/pull/102) | | ||||
|  | | `jenkinsAdminUser` | The name of the admin user - must be a valid user within the [Jenkins Security Realm](https://github.com/odavid/my-bloody-jenkins#security-section)| `admin` | ||||
|  | | `javaMemoryOpts` | Jenkins Java Memory Opts | `-Xmx256m` | ||||
|  | | `useHostNetwork` | If true, jenkins master will use hostNetwork | `false` | ||||
|  | | `jenkinsURL` | Set the jenkinsURL configuration. If not set and ingress is enabled, then jenkins URL is {{ .Values.ingress.httpProtocol }}://{{ .Values.ingress.hostname }}{{ .Values.ingress.path }} | | ||||
| After Width: | Height: | Size: 28 KiB | 
| @ -0,0 +1,39 @@ | |||||
|  | 1. Get Jenkins URL by running these commands: | ||||
|  | {{- if .Values.jenkinsURL }} | ||||
|  |   {{ .Values.jenkinsURL | quote }} | ||||
|  | {{- else if .Values.ingress.enabled }} | ||||
|  |   {{ .Values.ingress.httpProtocol }}://{{ .Values.ingress.hostname }}{{ .Values.ingress.path }} | ||||
|  | {{- else if contains "NodePort" .Values.service.type }} | ||||
|  |   export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "my-bloody-jenkins.fullname" . }}) | ||||
|  |   export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") | ||||
|  |   echo http://$NODE_IP:$NODE_PORT | ||||
|  | {{- else if contains "LoadBalancer" .Values.service.type }} | ||||
|  |      NOTE: It may take a few minutes for the LoadBalancer IP to be available. | ||||
|  |            You can watch the status of by running 'kubectl get svc -w --namespace {{ .Release.Namespace }} {{ template "my-bloody-jenkins.fullname" . }}' | ||||
|  |   export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "my-bloody-jenkins.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') | ||||
|  |   echo http://$SERVICE_IP:{{ default (include "my-bloody-jenkins.httpPort" .) .Values.service.httpPort }} | ||||
|  | {{- else if contains "ClusterIP" .Values.service.type }} | ||||
|  |   export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "my-bloody-jenkins.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") | ||||
|  |   echo "Visit http://127.0.0.1:8080 to use your application" | ||||
|  |   kubectl port-forward $POD_NAME 8080:8080 | ||||
|  | {{- end }} | ||||
|  | 
 | ||||
|  | 2. To watch Jenkins logs, run the following command: | ||||
|  | export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "my-bloody-jenkins.name" . }},release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") | ||||
|  | kubectl logs -f --namespace {{ .Release.Namespace }} $POD_NAME | ||||
|  | 
 | ||||
|  | {{- if not .Values.persistence.jenkinsHome.enabled }} | ||||
|  | 
 | ||||
|  | #################################################################################### | ||||
|  | # WARNING: Persistent is not enabled!!! | ||||
|  | # In order to enable persistent, please set persistence.jenkinsHome.enabled to 'true' | ||||
|  | #################################################################################### | ||||
|  | {{- end}} | ||||
|  | 
 | ||||
|  | {{- if not .Values.rbac.create }} | ||||
|  | 
 | ||||
|  | #################################################################################### | ||||
|  | # WARNING: RBAC is not enabled | ||||
|  | # In order to enable RBAC, please set rbac.create to 'true' | ||||
|  | #################################################################################### | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,67 @@ | |||||
|  | {{/* vim: set filetype=mustache: */}} | ||||
|  | {{/* | ||||
|  | Expand the name of the chart. | ||||
|  | */}} | ||||
|  | {{- define "my-bloody-jenkins.name" -}} | ||||
|  | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{/* | ||||
|  | Create a default fully qualified app name. | ||||
|  | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). | ||||
|  | If release name contains chart name it will be used as a full name. | ||||
|  | */}} | ||||
|  | {{- define "my-bloody-jenkins.fullname" -}} | ||||
|  | {{- if .Values.fullnameOverride -}} | ||||
|  | {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- else -}} | ||||
|  | {{- $name := default .Chart.Name .Values.nameOverride -}} | ||||
|  | {{- if contains $name .Release.Name -}} | ||||
|  | {{- .Release.Name | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- else -}} | ||||
|  | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- end -}} | ||||
|  | {{- end -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{/* | ||||
|  | Create chart name and version as used by the chart label. | ||||
|  | */}} | ||||
|  | {{- define "my-bloody-jenkins.chart" -}} | ||||
|  | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{/* | ||||
|  | Create pvc claim names | ||||
|  | */}} | ||||
|  | {{- define "my-bloody-jenkins.jenkinsHome.claimName" -}} | ||||
|  | {{- printf "%s-jenkins-home" (include "my-bloody-jenkins.fullname" .) | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{- define "my-bloody-jenkins.jenkinsWorkspace.claimName" -}} | ||||
|  | {{- printf "%s-jenkins-workspace" (include "my-bloody-jenkins.fullname" .) | trunc 63 | trimSuffix "-" -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | {{/* | ||||
|  | Define default values | ||||
|  | */}} | ||||
|  | {{- define "my-bloody-jenkins.httpPort" -}} | ||||
|  | {{- 8080 -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{- define "my-bloody-jenkins.jnlpPort" -}} | ||||
|  | {{- 50000 -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{- define "my-bloody-jenkins.sshdPort" -}} | ||||
|  | {{- 16022 -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{- define "my-bloody-jenkins.persistentVolumeClaimName" -}} | ||||
|  | {{- .Values.persistenceExistingClaim | default (include "my-bloody-jenkins.fullname" .) -}} | ||||
|  | {{- end -}} | ||||
|  | 
 | ||||
|  | {{- define "my-bloody-jenkins.tlsSecretName" -}} | ||||
|  | {{- printf "%s-tls-secret" (include "my-bloody-jenkins.fullname" .) -}} | ||||
|  | {{- end -}} | ||||
| @ -0,0 +1,32 @@ | |||||
|  | apiVersion: v1 | ||||
|  | kind: ConfigMap | ||||
|  | metadata: | ||||
|  |   name: {{ template "my-bloody-jenkins.fullname" . }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |     chart: {{ template "my-bloody-jenkins.chart" . }} | ||||
|  |     release: {{ .Release.Name }} | ||||
|  |     heritage: {{ .Release.Service }} | ||||
|  | data: | ||||
|  |   jenkins-config.yml: |- | ||||
|  | {{- if .Values.managedConfig }} | ||||
|  | {{ toYaml .Values.managedConfig | indent 4 }} | ||||
|  | {{- end }} | ||||
|  | 
 | ||||
|  |   k8s-default-cloud.yml: |- | ||||
|  | {{- if and (.Values.defaultK8sCloud) (.Values.defaultK8sCloud.enabled) }} | ||||
|  |     clouds: | ||||
|  |       {{ .Values.defaultK8sCloud.name | default "k8s" }}: | ||||
|  |         type: kubernetes | ||||
|  |         jenkinsUrl: http://{{ include "my-bloody-jenkins.fullname" . }}:8080 | ||||
|  |         namespace: {{ .Release.Namespace }} | ||||
|  |         templates: | ||||
|  |           - name: kubeslave | ||||
|  |             image: {{ .Values.defaultK8sCloud.slaveImage | default "odavid/jenkins-jnlp-slave:latest" }} | ||||
|  |             labels: | ||||
|  | {{ toYaml (default .Values.defaultK8sCloud.labels) | indent 14 }} | ||||
|  |             remoteFs: {{ .Values.defaultK8sCloud.remoteFs | default "/home/jenkins" }} | ||||
|  |             jvmArgs: {{ .Values.defaultK8sCloud.jvmArgs | default "-Xmx1g" }} | ||||
|  |             volumes: | ||||
|  |               - '/var/run/docker.sock:/var/run/docker.sock' | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,224 @@ | |||||
|  | apiVersion: apps/v1 | ||||
|  | kind: Deployment | ||||
|  | metadata: | ||||
|  |   name: {{ template "my-bloody-jenkins.fullname" . }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |     chart: {{ template "my-bloody-jenkins.chart" . }} | ||||
|  |     release: {{ .Release.Name }} | ||||
|  |     heritage: {{ .Release.Service }} | ||||
|  | spec: | ||||
|  |   replicas: 1 | ||||
|  |   strategy: | ||||
|  |     type: Recreate | ||||
|  |     rollingUpdate: null | ||||
|  |   selector: | ||||
|  |     matchLabels: | ||||
|  |       app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |       release: {{ .Release.Name }} | ||||
|  |   template: | ||||
|  |     metadata: | ||||
|  |       labels: | ||||
|  |         app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |         release: {{ .Release.Name }} | ||||
|  |     {{- if .Values.podAnnotations }} | ||||
|  |       annotations: | ||||
|  | {{ toYaml .Values.podAnnotations | indent 8 }} | ||||
|  |     {{- end }} | ||||
|  |     spec: | ||||
|  |       {{- if and .Values.useHostNetwork }} | ||||
|  |       hostNetwork: true | ||||
|  |       {{- end }} | ||||
|  |       {{- with .Values.securityContext }} | ||||
|  |       securityContext: | ||||
|  | {{ toYaml . | indent 8 }} | ||||
|  |       {{- end }} | ||||
|  |       {{- if and .Values.rbac .Values.rbac.create }} | ||||
|  |       serviceAccountName: {{ if .Values.rbac.createServiceAccount }}{{ (include "my-bloody-jenkins.fullname" .) | quote }}{{ else }}{{ .Values.rbac.serviceAccountName | quote }}{{ end }} | ||||
|  |       {{- end }} | ||||
|  |     {{- with .Values.image.imagePullSecrets }} | ||||
|  |       imagePullSecrets: | ||||
|  | {{ toYaml . | indent 8 }} | ||||
|  |     {{- end }} | ||||
|  |       containers: | ||||
|  |         - name: {{ .Chart.Name }} | ||||
|  |           image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | ||||
|  |           imagePullPolicy: {{ .Values.image.pullPolicy }} | ||||
|  |           ports: | ||||
|  |             - name: http | ||||
|  |               containerPort: {{ template "my-bloody-jenkins.httpPort" . }} | ||||
|  |               protocol: TCP | ||||
|  |             - name: jnlp | ||||
|  |               containerPort: {{ template "my-bloody-jenkins.jnlpPort" . }} | ||||
|  |               protocol: TCP | ||||
|  |             - name: sshd | ||||
|  |               containerPort: {{ template "my-bloody-jenkins.sshdPort" . }} | ||||
|  |               protocol: TCP | ||||
|  | 
 | ||||
|  |           {{- if .Values.livenessProbe }} | ||||
|  |           livenessProbe: | ||||
|  |             httpGet: | ||||
|  |               path: /login | ||||
|  |               port: http | ||||
|  |             initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} | ||||
|  |             periodSeconds: {{ .Values.livenessProbe.periodSeconds }} | ||||
|  |             timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }} | ||||
|  |             failureThreshold: {{ .Values.livenessProbe.failureThreshold }} | ||||
|  | 
 | ||||
|  |           {{- end }} | ||||
|  | 
 | ||||
|  |           {{- if .Values.readinessProbe }} | ||||
|  |           readinessProbe: | ||||
|  |             httpGet: | ||||
|  |               path: /login | ||||
|  |               port: http | ||||
|  |             initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} | ||||
|  |             periodSeconds: {{ .Values.readinessProbe.periodSeconds }} | ||||
|  |             timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }} | ||||
|  |             failureThreshold: {{ .Values.readinessProbe.failureThreshold }} | ||||
|  |           {{- end }} | ||||
|  | 
 | ||||
|  |           {{- if .Values.resources }} | ||||
|  |           resources: | ||||
|  | {{ toYaml .Values.resources | indent 12 }} | ||||
|  |           {{- end }} | ||||
|  | 
 | ||||
|  |           env: | ||||
|  |             - name: K8S_NAMESPACE | ||||
|  |               value: "{{ .Release.Namespace }}" | ||||
|  |           {{- if .Values.javaMemoryOpts }} | ||||
|  |             - name: JAVA_OPTS_MEMORY | ||||
|  |               value: {{ .Values.javaMemoryOpts | quote }} | ||||
|  |           {{- end }} | ||||
|  |           {{- if .Values.jenkinsAdminUser }} | ||||
|  |             - name: JENKINS_ENV_ADMIN_USER | ||||
|  |               value: {{ .Values.jenkinsAdminUser | quote }} | ||||
|  |           {{- end }} | ||||
|  |             - name: JENKINS_ENV_CONFIG_YML_URL | ||||
|  |               value: file:///var/jenkins_managed_config/k8s-default-cloud.yml,file:///var/jenkins_managed_config/jenkins-config.yml{{ range $i, $configMapName := .Values.configMaps }},file:///var/jenkins_config/{{ $configMapName }}{{ end }} | ||||
|  |           {{- range $key, $value := .Values.env }} | ||||
|  |             - name: {{ $key }} | ||||
|  |               value: {{ $value | quote }} | ||||
|  |           {{- end }} | ||||
|  |           {{- if .Values.jenkinsURL }} | ||||
|  |             - name: JENKINS_ENV_JENKINS_URL | ||||
|  |               value: {{ .Values.jenkinsURL | quote }} | ||||
|  |           {{- else if .Values.ingress.enabled }} | ||||
|  |             - name: JENKINS_ENV_JENKINS_URL | ||||
|  |               value: {{ .Values.ingress.httpProtocol }}://{{ .Values.ingress.hostname }}{{ .Values.ingress.path }} | ||||
|  |           {{- end }} | ||||
|  |             - name: ENVVARS_DIRS | ||||
|  |               value: /var/jenkins_secrets/JENKINS_SECRET{{ range $i, $name := .Values.envSecrets }},/var/jenkins_secrets/{{ $name }}{{ end }} | ||||
|  |             - name: JENKINS_ENV_HOST_IP | ||||
|  |               valueFrom: | ||||
|  |                 fieldRef: | ||||
|  |                   fieldPath: status.podIP | ||||
|  | 
 | ||||
|  |           volumeMounts: | ||||
|  | {{- if and .Values.persistence .Values.persistence.mounts }} | ||||
|  | {{ toYaml .Values.persistence.mounts | indent 12 }} | ||||
|  | {{- end }} | ||||
|  |             - mountPath: /var/jenkins_home | ||||
|  |               name: jenkins-home | ||||
|  |               readOnly: false | ||||
|  | 
 | ||||
|  |             - mountPath: /jenkins-workspace-home | ||||
|  |               name: jenkins-workspace-home | ||||
|  |               readOnly: false | ||||
|  |             {{- if .Values.persistence.mountDockerSocket }} | ||||
|  | 
 | ||||
|  |             - mountPath: /var/run/docker.sock | ||||
|  |               name: docker-socket | ||||
|  |               readOnly: false | ||||
|  |             {{- end }} | ||||
|  | 
 | ||||
|  |             {{/* Using internal secret - each key will become JENKINS_SECRET_${key} */}} | ||||
|  |             {{- if .Values.secrets }} | ||||
|  |             - mountPath: /var/jenkins_secrets/JENKINS_SECRET | ||||
|  |               name: {{ printf "%s-%s" (include "my-bloody-jenkins.fullname" .) "secrets" | quote }} | ||||
|  |               readOnly: true | ||||
|  |             {{- end }} | ||||
|  | 
 | ||||
|  |             {{/* Using external secret - each key will become ${SECRET_NAME}_${key} */}} | ||||
|  |             {{- if .Values.envSecrets }} | ||||
|  |             {{- range .Values.envSecrets }} | ||||
|  | 
 | ||||
|  |             - mountPath: /var/jenkins_secrets/{{ . }} | ||||
|  |               name: {{ . | quote }} | ||||
|  |               readOnly: true | ||||
|  |             {{- end }} | ||||
|  |             {{- end }} | ||||
|  |             {{- if .Values.configMaps }} | ||||
|  |             {{- range .Values.configMaps }} | ||||
|  | 
 | ||||
|  |             - mountPath: /var/jenkins_config/{{ . }} | ||||
|  |               name: {{ . | quote }} | ||||
|  |               readOnly: true | ||||
|  |             {{- end }} | ||||
|  |             {{- end }} | ||||
|  | 
 | ||||
|  |             - mountPath: /var/jenkins_managed_config | ||||
|  |               name: {{ (include "my-bloody-jenkins.fullname" .) | quote }} | ||||
|  |               readOnly: true | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |       volumes: | ||||
|  | {{- if and .Values.persistence .Values.persistence.volumes }} | ||||
|  | {{ toYaml .Values.persistence.volumes | indent 8 }} | ||||
|  | {{- end }} | ||||
|  |         {{- if .Values.persistence.mountDockerSocket }} | ||||
|  |         - name: docker-socket | ||||
|  |           hostPath: | ||||
|  |             path: /var/run/docker.sock | ||||
|  |         {{- end }} | ||||
|  |         - name: jenkins-home | ||||
|  |         {{- if and .Values.persistence .Values.persistence.jenkinsHome .Values.persistence.jenkinsHome.enabled }} | ||||
|  |           persistentVolumeClaim: | ||||
|  |             claimName: {{ .Values.persistence.jenkinsHome.existingClaim | default (include "my-bloody-jenkins.jenkinsHome.claimName" .) }} | ||||
|  |         {{- else }} | ||||
|  |           emptyDir: {} | ||||
|  |         {{- end }} | ||||
|  | 
 | ||||
|  |         - name: jenkins-workspace-home | ||||
|  |         {{- if and .Values.persistence .Values.persistence.jenkinsWorkspace .Values.persistence.jenkinsWorkspace.enabled }} | ||||
|  |           persistentVolumeClaim: | ||||
|  |             claimName: {{ .Values.persistence.jenkinsWorkspace.existingClaim | default (include "my-bloody-jenkins.jenkinsWorkspace.claimName" .) }} | ||||
|  |         {{- else }} | ||||
|  |           emptyDir: {} | ||||
|  |         {{- end }} | ||||
|  |         {{- if .Values.envSecrets }} | ||||
|  |         {{- range .Values.envSecrets }} | ||||
|  |         - name: {{ . | quote }} | ||||
|  |           secret: | ||||
|  |             secretName: {{ . }} | ||||
|  |         {{- end }} | ||||
|  |         {{- end }} | ||||
|  |         {{- if .Values.configMaps }} | ||||
|  |         {{- range .Values.configMaps }} | ||||
|  |         - name: {{ . | quote }} | ||||
|  |           configMap: | ||||
|  |             name: {{ . | quote }} | ||||
|  |         {{- end }} | ||||
|  |         {{- end }} | ||||
|  |         - name: {{ (include "my-bloody-jenkins.fullname" .) | quote }} | ||||
|  |           configMap: | ||||
|  |             name: {{ (include "my-bloody-jenkins.fullname" .) | quote }} | ||||
|  |         {{- if .Values.secrets }} | ||||
|  |         - name: {{ printf "%s-%s" (include "my-bloody-jenkins.fullname" .) "secrets" | quote }} | ||||
|  |           secret: | ||||
|  |             secretName: {{ (include "my-bloody-jenkins.fullname" .) | quote }} | ||||
|  |         {{- end }} | ||||
|  | 
 | ||||
|  |     {{- with .Values.nodeSelector }} | ||||
|  |       nodeSelector: | ||||
|  | {{ toYaml . | indent 8 }} | ||||
|  |     {{- end }} | ||||
|  |     {{- with .Values.affinity }} | ||||
|  |       affinity: | ||||
|  | {{ toYaml . | indent 8 }} | ||||
|  |     {{- end }} | ||||
|  |     {{- with .Values.tolerations }} | ||||
|  |       tolerations: | ||||
|  | {{ toYaml . | indent 8 }} | ||||
|  |     {{- end }} | ||||
| @ -0,0 +1,17 @@ | |||||
|  | {{- with .Values.ingress.tls }} | ||||
|  | {{- if and .privateKey .certificate }} | ||||
|  | apiVersion: v1 | ||||
|  | kind: Secret | ||||
|  | metadata: | ||||
|  |   name: {{ template "my-bloody-jenkins.tlsSecretName" $ }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" $ }} | ||||
|  |     chart: {{ template "my-bloody-jenkins.chart" $ }} | ||||
|  |     release: {{ $.Release.Name }} | ||||
|  |     heritage: {{ $.Release.Service }} | ||||
|  | type: kubernetes.io/tls | ||||
|  | data: | ||||
|  |   tls.crt: {{ .certificate | b64enc }} | ||||
|  |   tls.key: {{ .privateKey | b64enc }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,64 @@ | |||||
|  | {{- if .Values.ingress.enabled -}} | ||||
|  | {{- $fullName := include "my-bloody-jenkins.fullname" . -}} | ||||
|  | {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} | ||||
|  | apiVersion: networking.k8s.io/v1 | ||||
|  | {{ else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} | ||||
|  | apiVersion: networking.k8s.io/v1beta1 | ||||
|  | {{ else }} | ||||
|  | apiVersion: extensions/v1beta1 | ||||
|  | {{ end -}} | ||||
|  | kind: Ingress | ||||
|  | metadata: | ||||
|  |   name: {{ $fullName }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |     chart: {{ template "my-bloody-jenkins.chart" . }} | ||||
|  |     release: {{ .Release.Name }} | ||||
|  |     heritage: {{ .Release.Service }} | ||||
|  | {{- with .Values.ingress.labels }} | ||||
|  | {{ toYaml . | indent 4 }} | ||||
|  | {{- end }} | ||||
|  | {{- with .Values.ingress.annotations }} | ||||
|  |   annotations: | ||||
|  | {{ toYaml . | indent 4 }} | ||||
|  | {{- end }} | ||||
|  | spec: | ||||
|  | {{- if .Values.ingress.ingressClassName }} | ||||
|  |   ingressClassName: {{ .Values.ingress.ingressClassName }} | ||||
|  | {{- end }} | ||||
|  | {{- if .Values.ingress.tls }} | ||||
|  |   tls: | ||||
|  |     - hosts: | ||||
|  |       - {{ .Values.ingress.hostname }} | ||||
|  | {{- if .Values.ingress.tls.secretName }} | ||||
|  |       secretName: {{ .Values.ingress.tls.secretName }} | ||||
|  | {{- else if (and .Values.ingress.tls.certificate .Values.ingress.tls.privateKey) }} | ||||
|  |       secretName: {{ template "my-bloody-jenkins.tlsSecretName" . }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
|  |   rules: | ||||
|  | {{- if .Values.ingress.preAdditionalRules }} | ||||
|  | {{ toYaml .Values.ingress.preAdditionalRules | indent 2 }} | ||||
|  | {{- end }} | ||||
|  |   - http: | ||||
|  |       paths: | ||||
|  |         - path: {{ .Values.ingress.path }} | ||||
|  |         {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" }} | ||||
|  |           pathType: {{ .Values.ingress.pathType }} | ||||
|  |           backend: | ||||
|  |             service: | ||||
|  |               name: {{ $fullName }} | ||||
|  |               port: | ||||
|  |                 name: http | ||||
|  |         {{ else }} | ||||
|  |           backend: | ||||
|  |             serviceName: {{ $fullName }} | ||||
|  |             servicePort: http | ||||
|  |         {{- end }} | ||||
|  | {{-  if .Values.ingress.hostname }} | ||||
|  |     host: {{ .Values.ingress.hostname }} | ||||
|  | {{- end }} | ||||
|  | {{- if .Values.ingress.additionalRules }} | ||||
|  | {{ toYaml .Values.ingress.additionalRules | indent 2 }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,59 @@ | |||||
|  | --- | ||||
|  | {{- if and .Values.persistence .Values.persistence.jenkinsHome  .Values.persistence.jenkinsHome.enabled (not .Values.persistence.jenkinsHome.existingClaim) }} | ||||
|  | kind: PersistentVolumeClaim | ||||
|  | apiVersion: v1 | ||||
|  | metadata: | ||||
|  | {{- if .Values.persistence.jenkinsHome.annotations }} | ||||
|  |   annotations: | ||||
|  | {{ toYaml .Values.persistence.jenkinsHome.annotations | indent 4 }} | ||||
|  | {{- end }} | ||||
|  |   name: {{ template "my-bloody-jenkins.jenkinsHome.claimName" . }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.fullname" . }} | ||||
|  |     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" | ||||
|  |     release: "{{ .Release.Name }}" | ||||
|  |     heritage: "{{ .Release.Service }}" | ||||
|  | spec: | ||||
|  |   accessModes: | ||||
|  |     - {{ .Values.persistence.jenkinsHome.accessMode | quote }} | ||||
|  |   resources: | ||||
|  |     requests: | ||||
|  |       storage: {{ .Values.persistence.jenkinsHome.size | quote }} | ||||
|  | {{- if .Values.persistence.jenkinsHome.storageClass }} | ||||
|  | {{- if (eq "-" .Values.persistence.jenkinsHome.storageClass) }} | ||||
|  |   storageClassName: "" | ||||
|  | {{- else }} | ||||
|  |   storageClassName: "{{ .Values.persistence.jenkinsHome.storageClass }}" | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
|  | 
 | ||||
|  | --- | ||||
|  | {{- if and .Values.persistence .Values.persistence.jenkinsWorkspace  .Values.persistence.jenkinsWorkspace.enabled (not .Values.persistence.jenkinsWorkspace.existingClaim) }} | ||||
|  | kind: PersistentVolumeClaim | ||||
|  | apiVersion: v1 | ||||
|  | metadata: | ||||
|  | {{- if .Values.persistence.jenkinsWorkspace.annotations }} | ||||
|  |   annotations: | ||||
|  | {{ toYaml .Values.persistence.jenkinsWorkspace.annotations | indent 4 }} | ||||
|  | {{- end }} | ||||
|  |   name: {{ template "my-bloody-jenkins.jenkinsWorkspace.claimName" . }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.fullname" . }} | ||||
|  |     chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" | ||||
|  |     release: "{{ .Release.Name }}" | ||||
|  |     heritage: "{{ .Release.Service }}" | ||||
|  | spec: | ||||
|  |   accessModes: | ||||
|  |     - {{ .Values.persistence.jenkinsWorkspace.accessMode | quote }} | ||||
|  |   resources: | ||||
|  |     requests: | ||||
|  |       storage: {{ .Values.persistence.jenkinsWorkspace.size | quote }} | ||||
|  | {{- if .Values.persistence.jenkinsWorkspace.storageClass }} | ||||
|  | {{- if (eq "-" .Values.persistence.jenkinsWorkspace.storageClass) }} | ||||
|  |   storageClassName: "" | ||||
|  | {{- else }} | ||||
|  |   storageClassName: "{{ .Values.persistence.jenkinsWorkspace.storageClass }}" | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,58 @@ | |||||
|  | {{- if .Values.rbac.create }} | ||||
|  | {{- $fullName := include "my-bloody-jenkins.fullname" . }} | ||||
|  | {{- if .Values.rbac.createServiceAccount }} | ||||
|  | --- | ||||
|  | apiVersion: v1 | ||||
|  | kind: ServiceAccount | ||||
|  | metadata: | ||||
|  |   name: {{ $fullName }} | ||||
|  | {{- with .Values.rbac.serviceAccount.annotations }} | ||||
|  |   annotations: | ||||
|  | {{ toYaml . | indent 4 }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
|  | 
 | ||||
|  | --- | ||||
|  | kind: {{ if .Values.rbac.clusterWideAccess }}"ClusterRole"{{ else }}"Role"{{ end }} | ||||
|  | {{- if .Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }} | ||||
|  | apiVersion: rbac.authorization.k8s.io/v1 | ||||
|  | {{ else }} | ||||
|  | apiVersion: rbac.authorization.k8s.io/v1beta1 | ||||
|  | {{- end }} | ||||
|  | metadata: | ||||
|  |   name: {{ $fullName }} | ||||
|  | rules: | ||||
|  | - apiGroups: [""] | ||||
|  |   resources: ["pods"] | ||||
|  |   verbs: ["create","delete","get","list","patch","update","watch"] | ||||
|  | - apiGroups: [""] | ||||
|  |   resources: ["pods/exec"] | ||||
|  |   verbs: ["create","delete","get","list","patch","update","watch"] | ||||
|  | - apiGroups: [""] | ||||
|  |   resources: ["pods/log"] | ||||
|  |   verbs: ["get","list","watch"] | ||||
|  | - apiGroups: [""] | ||||
|  |   resources: ["events"] | ||||
|  |   verbs: ["watch"] | ||||
|  | - apiGroups: [""] | ||||
|  |   resources: ["secrets"] | ||||
|  |   verbs: ["get"] | ||||
|  | 
 | ||||
|  | --- | ||||
|  | {{- if .Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }} | ||||
|  | apiVersion: rbac.authorization.k8s.io/v1 | ||||
|  | {{ else }} | ||||
|  | apiVersion: rbac.authorization.k8s.io/v1beta1 | ||||
|  | {{- end }} | ||||
|  | kind: {{ if .Values.rbac.clusterWideAccess }}"ClusterRoleBinding"{{ else }}"RoleBinding"{{ end }} | ||||
|  | metadata: | ||||
|  |   name: {{ $fullName }} | ||||
|  | roleRef: | ||||
|  |   apiGroup: rbac.authorization.k8s.io | ||||
|  |   kind: {{ if .Values.rbac.clusterWideAccess }}"ClusterRole"{{ else }}"Role"{{ end }} | ||||
|  |   name: {{ $fullName }} | ||||
|  | subjects: | ||||
|  | - kind: ServiceAccount | ||||
|  |   name: {{ if .Values.rbac.createServiceAccount }}{{ $fullName }}{{ else }}{{ .Values.rbac.serviceAccountName }}{{ end }} | ||||
|  |   namespace: "{{ .Release.Namespace }}" | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,16 @@ | |||||
|  | {{- if .Values.secrets }} | ||||
|  | apiVersion: v1 | ||||
|  | kind: Secret | ||||
|  | metadata: | ||||
|  |   name: {{ template "my-bloody-jenkins.fullname" . }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |     chart: {{ template "my-bloody-jenkins.chart" . }} | ||||
|  |     release: {{ .Release.Name }} | ||||
|  |     heritage: {{ .Release.Service }} | ||||
|  | type: Opaque | ||||
|  | data: | ||||
|  | {{- range $key, $value := .Values.secrets }} | ||||
|  |   {{ $key }}: {{ $value | b64enc | quote }} | ||||
|  | {{- end }} | ||||
|  | {{- end }} | ||||
| @ -0,0 +1,40 @@ | |||||
|  | apiVersion: v1 | ||||
|  | kind: Service | ||||
|  | metadata: | ||||
|  |   name: {{ template "my-bloody-jenkins.fullname" . }} | ||||
|  |   labels: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |     chart: {{ template "my-bloody-jenkins.chart" . }} | ||||
|  |     release: {{ .Release.Name }} | ||||
|  |     heritage: {{ .Release.Service }} | ||||
|  | {{- with .Values.service.annotations }} | ||||
|  |   annotations: | ||||
|  | {{ toYaml . | indent 4 }} | ||||
|  | {{- end }} | ||||
|  | spec: | ||||
|  |   type: {{ .Values.service.type }} | ||||
|  | {{- with .Values.service.externalTrafficPolicy }} | ||||
|  |   externalTrafficPolicy: {{ . | quote }} | ||||
|  | {{- end }} | ||||
|  |   selector: | ||||
|  |     app: {{ template "my-bloody-jenkins.name" . }} | ||||
|  |     release: {{ .Release.Name }} | ||||
|  |   ports: | ||||
|  |     - port: {{ default (include "my-bloody-jenkins.httpPort" .) .Values.service.httpPort }} | ||||
|  |       targetPort: http | ||||
|  |       protocol: TCP | ||||
|  |       name: http | ||||
|  |     - port: {{ default (include "my-bloody-jenkins.jnlpPort" .) .Values.service.jnlpPort }} | ||||
|  |       targetPort: jnlp | ||||
|  |       protocol: TCP | ||||
|  |       name: jnlp | ||||
|  |     - port: {{ default (include "my-bloody-jenkins.sshdPort" .) .Values.service.sshdPort }} | ||||
|  |       targetPort: sshd | ||||
|  |       protocol: TCP | ||||
|  |       name: sshd | ||||
|  |   {{- if eq .Values.service.type "LoadBalancer" }} | ||||
|  |   loadBalancerSourceRanges: {{ .Values.service.loadBalancerSourceRanges }} | ||||
|  |   {{- if .Values.service.loadBalancerIP }} | ||||
|  |   loadBalancerIP: {{ .Values.service.loadBalancerIP }} | ||||
|  |   {{end}} | ||||
|  |   {{end}} | ||||
| @ -0,0 +1,254 @@ | |||||
|  | --- | ||||
|  | ######################################################## | ||||
|  | ## Override image | ||||
|  | image: | ||||
|  |   repository: odavid/my-bloody-jenkins | ||||
|  |   tag: 2.332.3-277 | ||||
|  |   pullPolicy: IfNotPresent | ||||
|  |   imagePullSecrets: | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Exposing service | ||||
|  | service: | ||||
|  |   # type: ClusterIP | ||||
|  |   type: ClusterIP | ||||
|  |   annotations: {} | ||||
|  |   # httpPort: 8080 | ||||
|  |   # jnlpPort: 50000 | ||||
|  |   # sshdPort: 16022 | ||||
|  |   # loadBalancerSourceRanges: 0.0.0.0/0 | ||||
|  |   # loadBalancerIP: | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Exposing ingress | ||||
|  | ## | ||||
|  | ## Set the jenkinsURL configuration. | ||||
|  | ## If not set and ingress is enabled, then jenkins URL is | ||||
|  | ## {{ .Values.ingress.httpProtocol }}://{{ .Values.ingress.hostname }}{{ .Values.ingress.path }} | ||||
|  | # jenkinsURL: https://jenkins.host.name | ||||
|  | ingress: | ||||
|  |   ## Change to https if the ingress uses tls or you are using external | ||||
|  |   ## tls termination using annotations | ||||
|  |   httpProtocol: http | ||||
|  |   enabled: true | ||||
|  |   path: / | ||||
|  |   pathType: Prefix | ||||
|  |   ingressClassName: "nginx" | ||||
|  |   hostname: jenkins.172-18-0-241.nip.io | ||||
|  |   # annotations: {} | ||||
|  |   # labels: {} | ||||
|  |   # tls: | ||||
|  |   #   secretName: | ||||
|  |   #   certificate: | ||||
|  |   #   privateKey: | ||||
|  | 
 | ||||
|  |   ## Ability to add more ingress rules | ||||
|  |   additionalRules: | ||||
|  |   # - http: | ||||
|  |   #     paths: | ||||
|  |   #     - path: path | ||||
|  |   #       backend: | ||||
|  |   preAdditionalRules: | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## By default rbac are not used and default service account | ||||
|  | ## is being used. | ||||
|  | rbac: | ||||
|  |   ## Create serviceAccount, Eole and RoleBindings | ||||
|  |   create: true | ||||
|  |   ## If createServiceAccount = false, and rbac.create = true, the chart will only use the rbac.serviceAaccountName within RoleBindings | ||||
|  |   createServiceAccount: true | ||||
|  |   ## Ignored if createServiceAccount = true | ||||
|  |   serviceAaccountName: "default" | ||||
|  |   serviceAccount: | ||||
|  |     annotations: {} | ||||
|  |   ## Instead of Role, create a ClusterRole and ClusterRoleBindings | ||||
|  |   clusterWideAccess: false | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Control requests limit | ||||
|  | ## It is highly recommended to give jenkins the amount of | ||||
|  | ## cpu and memory in production usage | ||||
|  | resources: | ||||
|  | # requests: | ||||
|  | #   cpu: 200m | ||||
|  | #   memory: 256Mi | ||||
|  | # limits: | ||||
|  | #   cpu: 200m | ||||
|  | #   memory: 256Mi | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## It can take a lot of time for jenkins to be started | ||||
|  | ## This is why the livenessProbe.initialDelaySeconds is high | ||||
|  | readinessProbe: | ||||
|  |   timeoutSeconds: 5 | ||||
|  |   initialDelaySeconds: 5 | ||||
|  |   periodSeconds: 5 | ||||
|  |   failureThreshold: 3 | ||||
|  | 
 | ||||
|  | livenessProbe: | ||||
|  |   timeoutSeconds: 5 | ||||
|  |   initialDelaySeconds: 600 | ||||
|  |   periodSeconds: 5 | ||||
|  |   failureThreshold: 3 | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Control peristence of jenkins data: | ||||
|  | ## By default, the master workspace and master home are separated | ||||
|  | ## Since master should be used as executer, the workspace directory is | ||||
|  | ## mainly used for fetching pipeline libraries and some initial clone of | ||||
|  | ## projects. Therefore, the jenkinsWorkspace can be left as emptyDir (enabled=false). | ||||
|  | ## On the other hand, jenkinsHome must be persistent! | ||||
|  | persistence: | ||||
|  |   mountDockerSocket: true | ||||
|  |   jenkinsHome: | ||||
|  |     enabled: true | ||||
|  |     annotations: {} | ||||
|  |     accessMode: ReadWriteOnce | ||||
|  |     size: 20Gi | ||||
|  |     ## A manually managed Persistent Volume and Claim | ||||
|  |     ## Requires persistence.jenkinsHome.enabled: true | ||||
|  |     ## If defined, PVC must be created manually before volume will be bound | ||||
|  |     existingClaim: | ||||
|  |     ## If defined, storageClass: <storageClass> | ||||
|  |     ## If set to "-", storageClass: "", which disables dynamic provisioning | ||||
|  |     ## If undefined (the default) or set to null, no storageClass spec is | ||||
|  |     ##   set, choosing the default provisioner.  (gp2 on AWS, standard on | ||||
|  |     ##   GKE, AWS & OpenStack) | ||||
|  |     ## | ||||
|  |     storageClass: "local-path" | ||||
|  |   jenkinsWorkspace: | ||||
|  |     enabled: false | ||||
|  |     annotations: {} | ||||
|  |     accessMode: ReadWriteOnce | ||||
|  |     size: 8Gi | ||||
|  |     ## A manually managed Persistent Volume and Claim | ||||
|  |     ## Requires persistence.jenkinsWorkspace.enabled: true | ||||
|  |     ## If defined, PVC must be created manually before volume will be bound | ||||
|  |     existingClaim: | ||||
|  |     ## If defined, storageClass: <storageClass> | ||||
|  |     ## If set to "-", storageClass: "", which disables dynamic provisioning | ||||
|  |     ## If undefined (the default) or set to null, no storageClass spec is | ||||
|  |     ##   set, choosing the default provisioner.  (gp2 on AWS, standard on | ||||
|  |     ##   GKE, AWS & OpenStack) | ||||
|  |     ## | ||||
|  |     storageClass: "local-path" | ||||
|  | 
 | ||||
|  |   ## Additional volumes and mounts that will be attached to the container. e.g. secrets | ||||
|  |   volumes: | ||||
|  |   #  - name: nothing | ||||
|  |   #    emptyDir: {} | ||||
|  |   mounts: | ||||
|  |   #  - mountPath: /var/nothing | ||||
|  |   #    name: nothing | ||||
|  |   #    readOnly: true | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## See: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ | ||||
|  | nodeSelector: {} | ||||
|  | tolerations: [] | ||||
|  | affinity: {} | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Add more annotations to pod | ||||
|  | podAnnotations: {} | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Security Context for jenkins pod | ||||
|  | securityContext: {} | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## If true, will set the jenkins master to use hostNetwork=true | ||||
|  | useHostNetwork: false | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Additional Environment variables to be provided to the container | ||||
|  | env: | ||||
|  | #   ENVIRONMENT_VARIABLE_NAME: VALUE | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## If specified, an internal secret will be created. | ||||
|  | ## Each key will become JENKINS_SECRET_<KEY> environment variable | ||||
|  | secrets: | ||||
|  | # MY_PASSWORD: Very Secret | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Use external secrets as environment variables | ||||
|  | ## Each item in the list represents an existing secret name | ||||
|  | ## All its keys will be transformed to environment variables | ||||
|  | ## See https://github.com/odavid/my-bloody-jenkins/pull/102 | ||||
|  | envSecrets: | ||||
|  | #   - my-jenkins-external-secret | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## List of ConfigMaps that will be mounted as configuration files | ||||
|  | ## All configuration files will be deep merged into single config | ||||
|  | ## See https://github.com/odavid/my-bloody-jenkins/pull/102 | ||||
|  | configMaps: | ||||
|  | #  - my-config-map | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## The jenkins Admin Username - must be a valid username | ||||
|  | ## within the Jenkins Security Realm | ||||
|  | jenkinsAdminUser: admin | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## Java Options for Jenkins Master. Make sure | ||||
|  | ## resource limits and requests are defined accordingly | ||||
|  | javaMemoryOpts: "-Xmx256m" | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## If enabled = 'true', then | ||||
|  | ## a Default k8s Jenkins cloud will be configured to | ||||
|  | ## provision slaves automatically based on labels | ||||
|  | defaultK8sCloud: | ||||
|  |   enabled: true | ||||
|  |   name: "k8s" | ||||
|  |   labels: | ||||
|  |     - "generic" | ||||
|  |   jvmArgs: "-Xmx1g" | ||||
|  |   remoteFs: "/home/jenkins" | ||||
|  |   image: "odavid/jenkins-jnlp-slave:latest" | ||||
|  | ######################################################## | ||||
|  | 
 | ||||
|  | ######################################################## | ||||
|  | ## A managed configuration based on | ||||
|  | ## My Bloody Jenkins YAML config. | ||||
|  | ## See: https://github.com/odavid/my-bloody-jenkins#configuration-reference | ||||
|  | managedConfig: {} | ||||
|  | ## Configure Security - https://github.com/odavid/my-bloody-jenkins#security-section | ||||
|  | # security: | ||||
|  | ## Configure tools - https://github.com/odavid/my-bloody-jenkins#tools-section | ||||
|  | # tools: | ||||
|  | ## Configure credentials - https://github.com/odavid/my-bloody-jenkins#credentials-section | ||||
|  | # credentials: | ||||
|  | ## Configure notifiers - https://github.com/odavid/my-bloody-jenkins#notifiers-section | ||||
|  | # notifiers: | ||||
|  | ## Configure notifiers - https://github.com/odavid/my-bloody-jenkins#pipeline-libraries-section | ||||
|  | # pipeline_libraries: | ||||
|  | ## Script Approvals - https://github.com/odavid/my-bloody-jenkins#script-approval-section | ||||
|  | # script_approval: | ||||
|  | ## Configure Clouds - https://github.com/odavid/my-bloody-jenkins#clouds-section | ||||
|  | # clouds: | ||||
|  | ## Configure Seed Jobs - https://github.com/odavid/my-bloody-jenkins#seed-jobs-section | ||||
|  | # seed_jobs: | ||||
|  | ## Configure Job DSL Scripts - https://github.com/odavid/my-bloody-jenkins#jobdsl-scripts-section | ||||
|  | # job_dsl_scripts: | ||||
|  | ######################################################## | ||||
					Loading…
					
					
				
		Reference in new issue