La tendencia ahora es hacer que las pipelines se ejecuten en contenedores que se crean y se destruyen dentro de un cluster kubernetes. Jenkins con el plugin Kuberentes cumple este objetivo.
En este post partimos de la base que contamos un cluster openshift y un registry docker para las imagenes y el objetivo sera crear una pipeline en la cual vamos buildear con kaniko un dockerfile y pushearlo a un registry docker.
Preparar el namespace
Lo primero sera loguearnos en el cluster y crear un namespace donde se levantataran los contendores donde se ejecutara el codigo de la pipeline.
Por defecto openshifh tiene activados contextos de seguridad que tenemos que desactivar para este ejemplo por lo que vamos a permitir cualquier uid dentro de los contenedores docker «oc adm policy add-scc-to-group anyuid system:authenticated»
oc login -u admin -p admin https://api.lab.okd.local:6443 --insecure-skip-tls-verify=true oc new-project jenkins oc project jenkins oc create sa jenkins oc policy add-role-to-user admin system:serviceaccount:jenkins:jenkins oc adm policy add-scc-to-group anyuid system:authenticated
Configurar los secretos para docker registry
Ahora tenemos que añadir las credenciales del registry para que puedan pushear imagenes.
oc create secret docker-registry credentials --docker-server=myregistry.piensoluegoinstalo.com:5000 --docker-username=admin --docker-password=admin --docker-email=user@hotmail.com -n jenkins oc secrets link default secrets/credentials oc secrets link jenkins secrets/credentials
Conectar Jenkins con el cluster
Es muy comun pillar la imagen de jenkins pero por defecto no viene con un cliente de oc integrado. Para este ejemplo uso un dockerfile de jenkins tuneado.Dejo el link del Dockerfile
https://hub.docker.com/repository/docker/akaronte/jenkins-okd45
Este seria un ejemplo del docker compose, hay que dar permisos a la carpeta jenkins_home para que el docker pueda escribir
version: '3' services: jenkins: image: akaronte/jenkins-okd45:latest container_name: "jenkins-okd45" restart: always privileged: true ports: - 8080:8080 - 50000:50000 volumes: - ./jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock
Una vez iniciado Jenkins e instalado el plugins de Kubernetes no queda mas que introducir el token jenkins pueda loguearse y crear contenedores dentro del namespace.
oc get sa oc describe sa jenkins oc serviceaccounts get-token jenkins
Pipeline
Cuando el nos funcione bien el «Test Conecction» ya podemos crear una nuevo Job con la siguiente pipeline.
pipeline { agent none stages { stage('Create Dokerfile') { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod metadata: name: debianpod spec: containers: - name: debianpod image: debian:buster-slim imagePullPolicy: Always command: ["sleep", "10000"] ''' } } steps { container("debianpod") { sh """ cat > Dockerfile <<(EOF) FROM debian:buster-slim RUN apt-get update && apt-get install git -y """ sh """ cat Dockerfile """ } } post{ success { stash name: "Dockerfile", includes: "Dockerfile" } cleanup { echo "CLEAN" cleanWs() } } } stage('Kaniko build') { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod metadata: name: kaniko spec: serviceAccount: jenkins containers: - name: kaniko image: gcr.io/kaniko-project/executor:debug command: - /busybox/cat imagePullPolicy: Always tty: true volumeMounts: - name: jenkins-docker-cfg mountPath: /kaniko/.docker volumes: - name: jenkins-docker-cfg projected: sources: - secret: name: credentials items: - key: .dockerconfigjson path: config.json ''' } } steps { script{ unstash "Dockerfile" container(name: 'kaniko', shell: '/busybox/sh') { sh """ cat /home/jenkins/agent/workspace/${JOB_NAME}/Dockerfile """ sh """ #!/busybox/sh /kaniko/executor --insecure -v debug --skip-tls-verify -c `pwd` -f `pwd`/Dockerfile --destination myregistry.piensoluegoinstalo.com:5000/kanikobuild:latest """ } } } post{ cleanup { echo "CLEAN" cleanWs() } } } } }
0 comentarios