Una vez tenemos código en el repositorio de Gogs, para poder avanzar tenemos que definir y configurar el pipeline en Jenkins.

  1. Accedemos a Jenkins y pulsamos sobre el enlace New item en el panel lateral.
  2. Especificamos un nombre para el nuevo job; por ejemplo Hello World.
  3. Seleccionamos Pipeline en la lista de tipos de proyectos.
  4. Pulsamos Ok para crear el job.

No configuramos nada y pulsamos Save.

Hemos creado un job en Jenkins, aunque todavía no hace nada.

Configuración de credenciales

Primero configuramos las credenciales que necesitamos para conectar con Gogs (se trata de un repositorio privado).

  1. Desde la página principal de Jenkins, pulsamos sobre Credentials en el panel lateral.
  2. Pulsamos sobre el almacén global de credencials (llamado Jenkins).
  3. Pulsamos sobre Global credentials (unrestricted) y seleccionamos la opción Add credentials.
    1. En el desplegable para el tipo de credencial, seleccionamos Username with password (es la opción por defecto).
    2. En el scope, seleccionamos Global.
    3. En el campo Username, especificamos el usuario con permisos de acceso al repositorio donde se encuentra el código. En nuestro caso, el usuario operador.
    4. En el campo Password, introducimos la contraseña del usuario.
    5. Podemos dejar el campo ID en blanco; Jenkins genera un ID aleatorio. Para facilitarnos la tarea de identificar las credenciales guardadas -para su uso en scripts, por ejemplo, podemos especificar un ID específico (siempre que sea único en Jenkins).
    6. En el campo Description podemos dar una descripción detallada de las credenciales, normas de uso, etc.
  4. Tras especificar los campos necesarios para definir las credenciales, pulsamos el botón Ok. Esta descripción se muestra junto al nombre de usuario de las credenciales guardadas.

Borrador del pipeline

En el job, pulsamos sobre Configure en el panel lateral y vamos a la sección Pipeline.

Para empezar con un armazón de pipeline como referencia, usamos el ejemplo de la página de Jenkins Using a Jenkinsfile:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

Copiamos esta pipeline en el apartado Pipeline del job Hello World y pulsamos Apply para guardar los cambios.

Puedes ejecutar este job para comprobar que funciona mediante la opción Build Now:

Job - First run

Job - First run

Checkout del código desde Jenkins

Para generar el artefacto a partir del código, el primer paso es que Jenkins descargue el código desde el repositorio. Para ello, definimos el primer paso en el pipeline como checkout: General SCM.

Seleccionamos el job Hello World y pulsamos sobre el enlace Pipeline Syntax en el panel lateral. Usaremos la herramienta Snipper Generator de Jenkins para ayudarnos a construir el pipeline.

Como SCM (source control method) especificamos Git. En el campo Repository URL indicamos la URL al repositorio en Gogs: http://192.168.1.209:10080/operador/gs-maven.git. En Credentials, seleccionamos las credenciales definidas en el apartado anterior para el usuario operador.

Al pulsar sobre Generate Pipeline Script, se genera el código a incluir en el pipeline:

checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'e49daa75-9d6a-4f7b-8ccc-d85288708053', url: 'http://192.168.1.209:10080/operador/gs-maven.git']]])

En nuestro pipeline, incluimos un nuevo stage para hacer el checkout del código. También podríamos haberlo añadido como un step adicional en el stage Build.

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'e49daa75-9d6a-4f7b-8ccc-d85288708053', url: 'http://192.168.1.209:10080/operador/gs-maven.git']]])
            }
        }
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

Fichero `Jenkinsfile``

En vez de editar el pipeline directamente desde Jenkins, es una buena práctica crear el fichero Jenkinsfile y tenerlo controlado en un repositorio; en nuestro caso, lo colocamos en la raíz del repositorio de código Java.

Accedemos a la máquina de desarrollo y creamos el fichero Jenkinsfile con el contenido del campo Pipeline del job en Jenkins:

vi Jenkinsfile

Pegamos el contenido en el fichero y lo guardamos.

Para obtener el pipeline contenido en el fichero Jenkinsfile, Jenkins hace un checkout del repositorio, por lo que eliminamos del Jenkinsfile el paso de checkout introducido anteriormente.

Finalmente, lo guardamos en el repositorio:

$ git add Jenkinsfile
$ git commit Jenkinsfile -m "Añadido Jenkinsfile al repositorio."
$ git commit -m "Añadido Jenkinsfile al repositorio."
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean
$ git push gogs-origin master
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 598 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
Username for 'http://192.168.1.209:10080': operador
Password for 'http://operador@192.168.1.209:10080':
To http://192.168.1.209:10080/operador/gs-maven.git
   c2bf553..ec7fc8e  master -> master
$

Una vez modificado el Jenkinsfile y subido a Gogs, debemos modificar la configuración del job para indicar la ubicación del fichero.

En la sección de Pipeline del job, en el desplegable seleccionamos Pipeline script from SCM.

Indicamos que el SCM usado es Git y especificamos la URL y credenciales de acceso. En el campo Script Path, como hemos guardado el Jenkinsfile en la raíz del repositorio, dejamos Jenkinsfile.

Guardamos los cambios y comprobamos que el job se sigue ejecutando con éxito.