feat: convert jenkins to Helm chart (helm/jenkins/) #6
13
helm/jenkins/Chart.yaml
Normal file
13
helm/jenkins/Chart.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
apiVersion: v2
|
||||||
|
name: jenkins
|
||||||
|
description: Jenkins CI/CD — Helm chart for thedevops.dev cluster
|
||||||
|
type: application
|
||||||
|
version: 0.1.0
|
||||||
|
appVersion: "lts-jdk17"
|
||||||
|
keywords:
|
||||||
|
- jenkins
|
||||||
|
- ci
|
||||||
|
- cd
|
||||||
|
maintainers:
|
||||||
|
- name: admin
|
||||||
|
url: https://thedevops.dev
|
||||||
28
helm/jenkins/argocd-application.yaml
Normal file
28
helm/jenkins/argocd-application.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
apiVersion: argoproj.io/v1alpha1
|
||||||
|
kind: Application
|
||||||
|
metadata:
|
||||||
|
name: jenkins
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
project: default
|
||||||
|
source:
|
||||||
|
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
|
||||||
|
path: helm/jenkins # Helm chart directory
|
||||||
|
targetRevision: HEAD
|
||||||
|
helm:
|
||||||
|
valueFiles:
|
||||||
|
- values.yaml # default values
|
||||||
|
# To override per-environment add values here:
|
||||||
|
# values: |
|
||||||
|
# replicaCount: 2
|
||||||
|
# persistence:
|
||||||
|
# size: 50Gi
|
||||||
|
destination:
|
||||||
|
server: https://kubernetes.default.svc
|
||||||
|
namespace: jenkins
|
||||||
|
syncPolicy:
|
||||||
|
automated:
|
||||||
|
prune: true
|
||||||
|
selfHeal: true
|
||||||
|
syncOptions:
|
||||||
|
- CreateNamespace=true
|
||||||
43
helm/jenkins/templates/_helpers.tpl
Normal file
43
helm/jenkins/templates/_helpers.tpl
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "jenkins.name" -}}
|
||||||
|
{{- .Chart.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Full name: release + chart name (trimmed to 63 chars)
|
||||||
|
*/}}
|
||||||
|
{{- define "jenkins.fullname" -}}
|
||||||
|
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Common labels applied to all resources
|
||||||
|
*/}}
|
||||||
|
{{- define "jenkins.labels" -}}
|
||||||
|
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
|
||||||
|
app.kubernetes.io/name: {{ include "jenkins.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Selector labels used in Deployment + Service matchLabels
|
||||||
|
*/}}
|
||||||
|
{{- define "jenkins.selectorLabels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "jenkins.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
ServiceAccount name
|
||||||
|
*/}}
|
||||||
|
{{- define "jenkins.serviceAccountName" -}}
|
||||||
|
{{- if .Values.rbac.enabled }}
|
||||||
|
{{- .Values.rbac.serviceAccountName }}
|
||||||
|
{{- else }}
|
||||||
|
default
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
100
helm/jenkins/templates/deployment.yaml
Normal file
100
helm/jenkins/templates/deployment.yaml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{ include "jenkins.name" . }}
|
||||||
|
namespace: {{ .Values.namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
replicas: {{ .Values.replicaCount }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "jenkins.selectorLabels" . | nindent 6 }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.selectorLabels" . | nindent 8 }}
|
||||||
|
spec:
|
||||||
|
serviceAccountName: {{ include "jenkins.serviceAccountName" . }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||||
|
initContainers:
|
||||||
|
{{- if .Values.initContainers.installDocker.enabled }}
|
||||||
|
- name: install-docker
|
||||||
|
image: {{ .Values.initContainers.installDocker.image }}
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
echo "Installing Docker CLI..."
|
||||||
|
cp /usr/local/bin/docker /tmp/tools-bin/
|
||||||
|
chmod +x /tmp/tools-bin/docker
|
||||||
|
echo "Docker CLI installed"
|
||||||
|
volumeMounts:
|
||||||
|
- name: tools-bin
|
||||||
|
mountPath: /tmp/tools-bin
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.initContainers.installKubectl.enabled }}
|
||||||
|
- name: install-kubectl
|
||||||
|
image: {{ .Values.initContainers.installKubectl.image }}
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
echo "Installing kubectl {{ .Values.initContainers.installKubectl.kubectlVersion }}..."
|
||||||
|
wget -q -O /tmp/tools-bin/kubectl \
|
||||||
|
"https://dl.k8s.io/release/{{ .Values.initContainers.installKubectl.kubectlVersion }}/bin/linux/amd64/kubectl"
|
||||||
|
chmod +x /tmp/tools-bin/kubectl
|
||||||
|
echo "kubectl installed"
|
||||||
|
volumeMounts:
|
||||||
|
- name: tools-bin
|
||||||
|
mountPath: /tmp/tools-bin
|
||||||
|
{{- end }}
|
||||||
|
containers:
|
||||||
|
- name: {{ include "jenkins.name" . }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: {{ .Values.service.httpPort }}
|
||||||
|
- name: agent
|
||||||
|
containerPort: {{ .Values.service.agentPort }}
|
||||||
|
env:
|
||||||
|
{{- toYaml .Values.extraEnv | nindent 12 }}
|
||||||
|
{{- if .Values.containerd.enabled }}
|
||||||
|
- name: DOCKER_HOST
|
||||||
|
value: "unix:///var/run/containerd.sock"
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
export PATH="/tmp/tools-bin:$PATH"
|
||||||
|
exec /usr/local/bin/jenkins.sh
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: jenkins-home
|
||||||
|
mountPath: /var/jenkins_home
|
||||||
|
{{- if .Values.containerd.enabled }}
|
||||||
|
- name: docker-sock
|
||||||
|
mountPath: /var/run/containerd.sock
|
||||||
|
{{- end }}
|
||||||
|
- name: tools-bin
|
||||||
|
mountPath: /tmp/tools-bin
|
||||||
|
volumes:
|
||||||
|
- name: jenkins-home
|
||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ .Values.persistence.claimName }}
|
||||||
|
{{- else }}
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.containerd.enabled }}
|
||||||
|
- name: docker-sock
|
||||||
|
hostPath:
|
||||||
|
path: {{ .Values.containerd.socketPath }}
|
||||||
|
type: Socket
|
||||||
|
{{- end }}
|
||||||
|
- name: tools-bin
|
||||||
|
emptyDir: {}
|
||||||
28
helm/jenkins/templates/ingress.yaml
Normal file
28
helm/jenkins/templates/ingress.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: {{ include "jenkins.name" . }}
|
||||||
|
namespace: {{ .Values.namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: traefik
|
||||||
|
cert-manager.io/cluster-issuer: {{ .Values.ingress.certIssuer }}
|
||||||
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- {{ .Values.ingress.host }}
|
||||||
|
secretName: {{ .Values.ingress.tlsSecretName }}
|
||||||
|
rules:
|
||||||
|
- host: {{ .Values.ingress.host }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: {{ include "jenkins.name" . }}
|
||||||
|
port:
|
||||||
|
number: {{ .Values.service.httpPort }}
|
||||||
|
{{- end }}
|
||||||
6
helm/jenkins/templates/namespace.yaml
Normal file
6
helm/jenkins/templates/namespace.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
16
helm/jenkins/templates/pvc.yaml
Normal file
16
helm/jenkins/templates/pvc.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{{- if .Values.persistence.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.persistence.claimName }}
|
||||||
|
namespace: {{ .Values.namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.persistence.accessMode }}
|
||||||
|
storageClassName: {{ .Values.persistence.storageClass }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.size }}
|
||||||
|
{{- end }}
|
||||||
47
helm/jenkins/templates/rbac.yaml
Normal file
47
helm/jenkins/templates/rbac.yaml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{{- if .Values.rbac.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.rbac.serviceAccountName }}
|
||||||
|
namespace: {{ .Values.namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRole
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.rbac.clusterRoleName }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["pods", "services", "configmaps", "secrets"]
|
||||||
|
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["pods/exec", "pods/log"]
|
||||||
|
verbs: ["create", "get"]
|
||||||
|
- apiGroups: ["apps"]
|
||||||
|
resources: ["deployments", "statefulsets", "daemonsets", "replicasets"]
|
||||||
|
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: ["networking.k8s.io"]
|
||||||
|
resources: ["ingresses"]
|
||||||
|
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
|
||||||
|
- apiGroups: ["argoproj.io"]
|
||||||
|
resources: ["applications"]
|
||||||
|
verbs: ["get", "list", "watch", "update", "patch"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
metadata:
|
||||||
|
name: {{ .Values.rbac.clusterRoleName }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: ClusterRole
|
||||||
|
name: {{ .Values.rbac.clusterRoleName }}
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: {{ .Values.rbac.serviceAccountName }}
|
||||||
|
namespace: {{ .Values.namespace }}
|
||||||
|
{{- end }}
|
||||||
18
helm/jenkins/templates/service.yaml
Normal file
18
helm/jenkins/templates/service.yaml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "jenkins.name" . }}
|
||||||
|
namespace: {{ .Values.namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "jenkins.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
selector:
|
||||||
|
{{- include "jenkins.selectorLabels" . | nindent 4 }}
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: {{ .Values.service.httpPort }}
|
||||||
|
targetPort: {{ .Values.service.httpPort }}
|
||||||
|
- name: agent
|
||||||
|
port: {{ .Values.service.agentPort }}
|
||||||
|
targetPort: {{ .Values.service.agentPort }}
|
||||||
79
helm/jenkins/values.yaml
Normal file
79
helm/jenkins/values.yaml
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# Jenkins Helm Chart — default values
|
||||||
|
# All tuneable parameters are here.
|
||||||
|
# Override per-environment with: helm install -f values-prod.yaml
|
||||||
|
|
||||||
|
# -- Namespace where Jenkins is deployed
|
||||||
|
namespace: jenkins
|
||||||
|
|
||||||
|
# -- Number of Jenkins pods (should stay 1 — Jenkins is stateful)
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
image:
|
||||||
|
# -- Jenkins image
|
||||||
|
repository: jenkins/jenkins
|
||||||
|
tag: lts-jdk17
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
# -- Jenkins web UI port
|
||||||
|
httpPort: 8080
|
||||||
|
# -- Jenkins agent JNLP port
|
||||||
|
agentPort: 50000
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
# -- Hostname for Jenkins web UI
|
||||||
|
host: jenkins.thedevops.dev
|
||||||
|
# -- cert-manager ClusterIssuer name
|
||||||
|
certIssuer: letsencrypt-http
|
||||||
|
# -- TLS secret name
|
||||||
|
tlsSecretName: jenkins-tls
|
||||||
|
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
# -- Storage class (longhorn, local-path, etc.)
|
||||||
|
storageClass: longhorn
|
||||||
|
# -- PVC size for jenkins_home
|
||||||
|
size: 20Gi
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
claimName: jenkins-home
|
||||||
|
|
||||||
|
# -- Security context — fsGroup 1000 required for jenkins_home permissions
|
||||||
|
securityContext:
|
||||||
|
fsGroup: 1000
|
||||||
|
|
||||||
|
# -- RBAC — creates ServiceAccount, ClusterRole, ClusterRoleBinding
|
||||||
|
rbac:
|
||||||
|
enabled: true
|
||||||
|
serviceAccountName: jenkins
|
||||||
|
clusterRoleName: jenkins-deployer
|
||||||
|
|
||||||
|
# -- Resource limits/requests
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 200m
|
||||||
|
memory: 512Mi
|
||||||
|
limits:
|
||||||
|
cpu: 1000m
|
||||||
|
memory: 2Gi
|
||||||
|
|
||||||
|
# -- Mount containerd socket for Docker CLI access
|
||||||
|
containerd:
|
||||||
|
enabled: true
|
||||||
|
socketPath: /run/k3s/containerd/containerd.sock
|
||||||
|
|
||||||
|
# -- initContainers install Docker CLI and kubectl into shared volume
|
||||||
|
initContainers:
|
||||||
|
installDocker:
|
||||||
|
enabled: true
|
||||||
|
image: docker:24-cli
|
||||||
|
installKubectl:
|
||||||
|
enabled: true
|
||||||
|
image: alpine:3.19
|
||||||
|
kubectlVersion: v1.28.0
|
||||||
|
|
||||||
|
# -- Extra environment variables for Jenkins container
|
||||||
|
extraEnv:
|
||||||
|
- name: JENKINS_OPTS
|
||||||
|
value: "--httpPort=8080"
|
||||||
Reference in New Issue
Block a user