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

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *