Agradeceríamos tu apoyo para difundir nuestros tutoriales con relación a las ciencias de la computación.
Solución:
Primero permítanme comenzar diciendo: ¡Gracias por hacer esta pregunta! Me impulsó a buscar una solución (nuevamente) después de preguntarme a menudo si esto era posible. También tenemos como 20 – 30 proyectos que son bastante idénticos y tienen .gitlab-ci.yml
archivos de alrededor de 400 – 500 loc que deben cambiarse cada uno si algo cambia.
Así que encontré una solución de trabajo:
Inspirado en la plantilla Auto DevOps .gitlab-ci.yml creada por Gitlab, y donde usan un trabajo de plantilla para definir todas las funciones utilizadas y llamar a cada before_script
para cargarlos, se me ocurrió la siguiente configuración.
- Múltiples repositorios de proyectos (proyecto-1, proyecto-2) que requieren un conjunto compartido de trabajos/funciones de CI
- Script de funciones que contiene todas las funciones compartidas en un repositorio separado
archivos
Entonces, usando un scipt de trabajos de ci compartido:
#!/bin/bash
function list_files
ls -lah
function current_job_info
echo "Running job $CI_JOB_ID on runner $CI_RUNNER_ID ($CI_RUNNER_DESCRIPTION) for pipeline $CI_PIPELINE_ID"
Un común y genérico .gitlab-ci.yml
:
image: ubuntu:latest
before_script:
# Install curl
- apt-get update -qqq && apt-get install -qqqy curl
# Get shared functions script
- curl -s -o functions.sh https://gitlab.com/giix/demo-shared-ci-functions/raw/master/functions.sh
# Set permissions
- chmod +x functions.sh
# Run script and load functions
- . ./functions.sh
job1:
script:
- current_job_info
- list_files
Puede copiar y pegar su archivo del proyecto 1 al proyecto 2 y estaría usando las mismas funciones compartidas de Gitlab CI.
Estos ejemplos son bastante detallados para propósitos de ejemplo, optimícelos de la forma que desee.
Lecciones aprendidas
Entonces, después de aplicar la construcción anterior a gran escala (más de 40 proyectos), quiero compartir algunas lecciones aprendidas para que no tenga que averiguarlo por las malas:
- Versión (etiqueta/liberación) de su secuencia de comandos de funciones ci compartidas. Cambiar una cosa ahora puede hacer que todas las canalizaciones fallen.
- El uso de diferentes imágenes de Docker podría causar un problema en el requisito de bash para cargar las funciones (por ejemplo, uso algunas imágenes basadas en Alpine para trabajos basados en herramientas CLI que tienen
sh
por defecto) - Utilice variables secretas de CI/CD basadas en proyectos para personalizar trabajos de compilación para proyectos. Como URL de entorno, etc.
GitLab 11.7
introduce nuevo include
métodos, tales como include:file
: https://docs.gitlab.com/ee/ci/yaml/#includefile
include:
- project: 'my-group/my-project'
ref: master
file: '/templates/.gitlab-ci-template.yml'
Esto le permitirá crear un nuevo proyecto en la misma instancia de GitLab que contiene un .gitlab-ci.yml
.
Usar include
función (disponible en GitLab 10.6): https://docs.gitlab.com/ee/ci/yaml/#include