Personalización de interconexiones utilizando scripts personalizados

Los scripts personalizados son personalizaciones añadidas en el conducto. Los adoptantes, equipos y usuarios proporcionan scripts para ejecutar tareas personalizadas para garantizar la integración continua y el despliegue continuo de estrategias.

Los scripts personalizados controlan las etapas de la interconexión. Puedes utilizar un archivo de configuración (.pipeline-config.yaml) para configurar el comportamiento de las etapas, el contenido de los scripts y la imagen base en la que se ejecutan los scripts. Los scripts y la configuración de las etapas de la interconexión se cargan desde un repositorio (repo) Git que puede ser el repositorio de la aplicación (app) (similar a .travis.yml o Jenkinsfile) o un repositorio personalizado.

Cuando se inicia cualquiera de los scripts personalizados, la dirección URL completa del archivo de script personalizado, incluido el nombre del archivo y el hash de confirmación, se imprime al principio de los registros del pipeline de la siguiente manera: The custom script can be viewed using the following link: 'https://<source repo url>/<organization name>/<repository name>/blob/<commit hash>/.pipeline-config.yaml'. Este posicionamiento mejora la trazabilidad.

Para obtener más información, consulte Personalización de canalizaciones DevSecOps para principiantes.

Configuración en .pipeline-config.yaml

Utiliza un archivo de configuración .pipeline-config.yaml para ampliar el comportamiento del pipeline.

Ubicación del archivo

Para las solicitudes de incorporación de cambios y los flujos de integración continua, guarda el archivo de configuración .pipeline-config.yaml en un repositorio de la aplicación del mismo modo que los archivos Jenkinsfile .travis.yml o. En el caso de los flujos de implementación continua, guarda este archivo en un repositorio específico.

Para todas las interconexiones, puede personalizar la ubicación y el origen del archivo .pipeline-config.yaml con los siguientes parámetros de la interfaz de usuario de la interconexión:

  • pipeline-config para establecer la vía de acceso del archivo de configuración. El valor predeterminado es .pipeline-config.yaml.
  • pipeline-config-repo para configurar el repositorio del que se obtendrán la configuración y los scripts. El valor predeterminado es el repositorio de aplicaciones de integración continua.
  • pipeline-config-branch para utilizarlo como rama para la configuración en el repositorio de configuración. El valor por defecto es la rama del repositorio de la aplicación de integración continua y la rama master en el despliegue continuo.

Parámetros de configuración

La configuración del archivo .pipeline-config.yaml da soporte a los parámetros siguientes:

Estos valores no son parámetros de la interconexión, deben formar parte del archivo .pipeline-config.yaml.

  • image: puede utilizar cualquier imagen de Docker a la que el trabajador de la interconexión pueda acceder como imagen base para la tarea.

  • script: el script que se va a ejecutar en la etapa. Dado que este campo se utiliza como archivo de script, asegúrate de que el contenido funcione como un archivo de script en la imagen base que has proporcionado. Puede incluir otros scripts junto con este archivo de configuración y hacer referencia a ellos desde este punto de entrada. Por ejemplo:

test:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.69
  script: |
    #!/bin/sh
    scripts/lint.sh
    scripts/unit-test.sh
  • dind: especifique si se debe habilitar docker-in-docker para el contexto del script. El valor predeterminado es false.

  • abort_on_failure: de forma predeterminada, la interconexión se detiene cuando falla el script. Si se establece en false, se marca la etapa en un aviso (estado ámbar) (se pasa con aviso), permite que la interconexión continúe y se hace referencia al trabajo fallido en las pruebas.

  • image_pull_policy: Configura el ImagePullPolicy parámetro del pod que se proporciona en la imagen para la imagen base. Los valores posibles son los mismos que los valores válidos para Kubernetes: Always o IfNotPresent. El valor predeterminado es IfNotPresent.

  • configmap: se extraen los pares clave-valor de un archivo configmap proporcionado al que puede acceder PipelineRun. Se admiten los valores siguientes:

    • config-name: la sintaxis del nombre del archivo configmap directa. El ejecutor de las etapas intenta acceder y montar el archivo configmap denominado config-name.
    • $prop-name: la sintaxis del nombre del archivo configmap indirecta. El nombre del archivo configmap se busca en la correlación de propiedades de entorno, que contiene todos los valores del entorno que se establecen en la interfaz de usuario de la interconexión. Por ejemplo, si hay una my-config entrada prop en las propiedades del entorno, entonces my-config se utiliza para $prop.
  • secret: se extraen los pares clave-valor de un archivo configmap proporcionado al que puede acceder PipelineRun. Se admiten los valores siguientes:

    • secret-name: la sintaxis del nombre de secreto directa. El ejecutor de la etapa intenta acceder y montar el secreto denominado secret-name.

    • $prop-name: la sintaxis del nombre de secreto indirecta. El nombre Secret se encuentra en el mapa de configuración environment-properties, que contiene todos los valores de entorno configurados en la interfaz de usuario del pipeline. Por ejemplo, si el archivo configmap de propiedades de entorno contiene la propiedad my-secret, se utiliza my-secret para $prop.

  • runAfter: Ejecute la etapa actual después de que se complete la etapa especificada en esta propiedad. Establezca el valor con el nombre de etapa que ha utilizado en .pipeline-config.yaml. Utilice esta propiedad con moderación y confirme que la etapa especificada por esta propiedad existe en el conducto. Si la etapa no existe, el conducto puede entrar en un punto muerto.

  • skip: Si se establece en true, omita la etapa actual, si es posible, en las interconexiones v10. No se pueden omitir todas las etapas. En la tabla siguiente se listan las etapas que se pueden omitir durante la ejecución del conducto.

Etapas que pueden omitirse en las canalizaciones
Conducto Etapas
Conducto PR code-unit-tests, code-compliance-tests y code-pr-finish
Conducto de AC code-unit-tests, code-static-scan, code-compliance-checks, build-scan-artifact, code-dynamic-scan, deploy-acceptance-tests, deploy-release y code-ci-finish
conducto cd prod-verify-artifact, prod-acceptance-tests y prod-finish
Interconexión CC cc-static-scan, cc-dynamic-scan, cc-compliance-checks, cc-scan-artifact y cc-finish
App-vista previa de conducto de PR code-unit-tests, code-static-scan, code-compliance-checks, build-scan-artifact, deploy-acceptance-tests y app-preview-pr-finish
Interconexión de CI de modalidad de desarrollo code-unit-tests, code-static-scan, deploy-release y code-ci-finish
Interconexión de CD de modalidad de desarrollo prod-acceptance-tests y prod-finish

Configuración de ejemplo

version: '1' # fixed, this value is used to track schema changes
# `setup` runs right after the app repo is cloned
setup:
  # the pipeline will break in case setup fails (default is true)
  abort_on_failure: true
  # any docker image can be used which is accessible by the private worker
  image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.69
  # you can reference configmaps, each key in the configmap is going to be available as `/config/{key}`
  configmap: my-config
    # `$prop` is the indirect config map syntax, the concrete configmap is looked
    # up from the `environment-properties` configmap
    #
    # Eg. if there's a `prop: my-config` entry in the environment properties,
    # then `my-config` is going to be used for `$prop`
  configmap: $prop
  # the mechanism described works for secrets as well!
  secret: $my-secrets
  # the script is executed inside the checked out app repo
  script: |
    #!/bin/sh
    ...
# `test` runs after `setup`, but before building the docker image
test:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.69
  script: |
    #!/bin/sh
    ...
# `static-scan` runs after `test`, but before building the docker image
static-scan:
  image: ibmcom/pipeline-base-image:2.12
  script: |
    #!/bin/sh
    ...
# `deploy` runs after building the docker image
deploy:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.69
  # the script has access to the built docker image, which is available at `/config/image`
  script: |
    #!/bin/sh
    cat /config/image
# `dynamic-scan` runs after `deploy`, but before the acceptance test run
dynamic-scan:
  image: ibmcom/pipeline-base-image:2.12
  script: |
    #!/bin/sh
    ...
# `acceptance-test` runs after `deploy`
acceptance-test:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.69
  script: |
    #!/bin/sh
    ...