IBM Cloud Docs
Personalización de DevSecOps pipelines para principiantes

Personalización de DevSecOps pipelines para principiantes

Conozca los conceptos básicos para adoptar DevSecOps e incorporar su primera aplicación o microservicio.

Acerca de las cadenas de herramientas de DevSecops

Ha descubierto y probado las cadenas de herramientas IBM Cloud DevSecOps Continuous Integration (CI), Continuous Deployment (CD) y Continuous Compliance (CC) que implementan las mejores prácticas y herramientas de seguridad de DevSecOps.

Ahora, está preparado para incorporar su propia aplicación o microservicio y adoptar DevSecOps.

Antes de empezar

Necesita los recursos siguientes para incorporar una aplicación en una cadena de herramientas DevSecOps:

  • Un repositorio de código fuente de aplicación Git que contiene el código de la aplicación, a menudo denominado "app repo".
  • Un archivo .pipeline-config.yaml. Este archivo es el archivo de configuración principal que utilizan las interconexiones CI, CD y CC para personalizar cualquiera de las etapas del proceso de ejecución de interconexión. Empiece con un archivo .pipeline-config.yaml de ejemplo, que puede descargar y personalizar para que se ajuste a sus necesidades. Todas las etapas excepto la etapa de inicio se pueden personalizar utilizando el archivo .pipeline-config.yaml. El archivo desencadena y ejecuta los scripts personalizados para crear, probar y desplegar la aplicación. Puede cambiar el nombre del archivo .pipeline-config.yaml o utilizar archivos diferentes para distintas interconexiones o desencadenantes. Asegúrese de que los valores de parámetro en la interconexión o desencadenante coinciden con el archivo de configuración. Para obtener más información, consulte Parámetros de interconexión.

IBM Cloud tiene las plantillas de operaciones DevSecsiguientes para empezar:

Cómo DevSecOps pipelines utilizan repositorios

Para crear, probar y desplegar la aplicación, los conductos de DevSecOps utilizan dos repositorios:

  • app-repo: el repositorio de aplicaciones, que contiene el código fuente de la aplicación.
  • config-repo: el repositorio de configuración, que contiene los archivos y scripts YAML de configuración de interconexión.

En la app de ejemplo deDevSecOps, estos dos repositorios son iguales. La mayoría de los usuarios que adoptan DevSecOps empiezan con este patrón. Pero, a medida que incorpore más microservicios, es posible que sea necesario un repositorio de configuración de interconexión dedicado y separado. Puesto que el repositorio de aplicaciones y el repositorio de configuración son los mismos en la app de ejemplo, el repositorio se clona dos veces cuando se ejecutan las interconexiones, lo que puede provocar errores. Por lo tanto, se recomienda tener un repositorio de configuración independiente para alojar archivos de configuración y scripts que se pueden compartir y reutilizar entre distintas cadenas de herramientas y pipelines de DevSecOps. Para obtener más información sobre cómo personalizar el repositorio de configuración, consulte los pasos de personalización avanzados.

Los scripts de operaciones de DevSecconsideran que app-repo y config-repo son dos repositorios independientes. Los scripts clonan los repositorios dos veces durante la etapa de inicio de la interconexión. Estos clones se conocen como app-repo y one-pipeline-config-repo. Cada etapa se ejecuta en el contexto de config repo.

Incorporación de una aplicación

Para mayor simplicidad, cree y pruebe una cadena de herramientas DevSecOps CI con la aplicación Node de ejemplo antes de continuar.

Existen tres formas principales de incorporar la primera aplicación en una cadena de herramientas de Ops CI DevSecexistente:

  • Opción 1: añada el repositorio de aplicaciones a la cadena de herramientas y utilice el repositorio de aplicaciones de ejemplo como repositorio de configuración.
  • Opción 2: Sustituya el repositorio de la aplicación de ejemplo por el repositorio de la aplicación.
  • Opción 3: Añada el repositorio de aplicaciones a la cadena de herramientas y utilice un repositorio de configuración dedicado. Para obtener más información sobre esta opción, consulte los pasos de personalización avanzada.

Las cadenas de herramientas de DevSecOps utilizan repositorios Gitlab gestionados por IBM, también conocido como GRIT. En su lugar, se pueden utilizar otros proveedores de Git. El repositorio de la app puede estar alojado en GitHub o Gitlab, por ejemplo.

Opción 1: Añadir el repositorio de aplicaciones y utilizar el repositorio de aplicaciones de ejemplo como repositorio de configuración

Para añadir el repositorio de aplicaciones a la cadena de herramientas y utilizar el repositorio de aplicaciones de ejemplo como repositorio de configuración, realice los pasos siguientes:

  1. En la consola de IBM Cloud, pulse el icono Menú icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas que desea editar.
  2. Pulse Añadir.
  3. Seleccione dónde se aloja el repositorio de la app, ya sea Gitlab o GitHub.
  4. Utilice el servidor predeterminado o añada uno nuevo.
  5. Especifique el URL del servidor personalizado y la señal de acceso personal.
  6. Pulse Crear integración.
  7. Especifique el URL del repositorio de código fuente de la aplicación.
  8. Pulse Crear integración.

A continuación, especifique el repositorio de aplicación de ejemplo como repositorio de configuración completando los pasos siguientes:

  1. En la consola de IBM Cloud, pulse el icono Menú icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas que desea editar.
  2. Pulse pr-pipeline.
  3. Pulse Valores y vaya a la pestaña Propiedades de entorno.
  4. Edite el valor de la propiedad pipeline-config-repo para que apunte al URL del repositorio de aplicaciones de ejemplo.
  5. Vuelva a la cadena de herramientas de AC.
  6. Pulse ci-pipeline.
  7. Pulse Valores y vaya a la pestaña Propiedades de entorno.
  8. Edite el valor de la propiedad pipeline-config-repo para que apunte al URL del repositorio de aplicaciones de ejemplo.

Las interconexiones de AC ahora utilizan el repositorio de apps de ejemplo pipeline-config como repositorio de configuración.

Opción 2: Sustituir el repositorio de aplicaciones de ejemplo por su propio repositorio de aplicaciones

Para sustituir el repositorio de apps de ejemplo por su propio repositorio de apps, realice los pasos siguientes:

  1. En la consola de IBM Cloud, pulse el icono Menú icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas de AC que desea editar.
  2. Busque el repositorio de código fuente de aplicación de ejemplo y seleccione Configurar.
  3. Sustituya el URL del repositorio por el URL del repositorio de código fuente de la aplicación.
  4. Pulse Guardar integración.

Después de sustituir el repositorio de la app de ejemplo, asegúrese de que el nuevo repositorio de la app contiene un archivo .pipeline-config.yaml y los scripts correspondientes. Copie el archivo .pipeline-config.yaml y los scripts del repositorio de aplicaciones de ejemplo en el repositorio de aplicaciones o utilice este archivo de configuración de ejemplo.

Configuración de las interconexiones de AC

Después de añadir el repositorio de aplicaciones, debe configurar las interconexiones de AC para que funcionen con el nuevo repositorio.

Configuración de los desencadenantes de interconexión

Los desencadenantes predeterminados utilizan el repositorio de aplicaciones de ejemplo, por lo que debe actualizarlos para utilizar el repositorio de apps. Verifique los valores del desencadenante y modifíquelos si es necesario para asegurarse de que todos los desencadenantes apuntan al repositorio de la app. Complete los pasossiguientes:

  1. En la consola de IBM Cloud, pulse el icono Menú icono Menú > DevOps > Cadenas de herramientas y seleccione la cadena de herramientas de AC que desea editar.
  2. Pulse pr-pipeline.
  3. Edite el Git PR Trigger y proporcione el URL y la rama del repositorio de aplicaciones.
  4. Pulse Guardar.
  5. Vuelva a la cadena de herramientas de AC y pulse ci-pipeline.
  6. Edite el desencadenante de ACGit y proporcione el URL y la rama del repositorio de aplicaciones. Asegúrese de que el nombre de la aplicación sea correcto en la sección Propiedades.
  7. Pulse Guardar.
  8. Edite el Desencadenante manual. En la sección Propiedades, asegúrese de que el nombre de la aplicación sea correcto.
  9. Asegúrese de que las propiedades del repositorio y de la rama sean correctas y apunten al repositorio de la app.

Configuración del archivo .pipeline-config.yaml

Copie el archivo .pipeline-config.yaml del repositorio de aplicaciones de ejemplo en el repositorio de aplicaciones o utilice este archivo de configuración de ejemplo.

Tanto para pr-pipeline como para ci-pipeline, asegúrese de que los parámetros pipeline-config, pipeline-config-branch y pipeline-config-repo se han establecido correctamente y coinciden con la configuración. Si estos parámetros no se establecen correctamente, es posible que confirme los cambios en la rama incorrecta, lo que genera un error en la interconexión.

Si la variable pipeline-config-repo no está establecida, las interconexiones de DevSecOps presuponen que es el mismo repositorio que el repositorio de código fuente de la aplicación.

Utilización de scripts personalizados con DevSecOps

El archivo pipeline-config.yaml es el componente clave que orquesta y personaliza el comportamiento de la interconexión de DevSecOps. El archivo utiliza scripts para crear, probar y desplegar la aplicación. El archivo define cómo se configuran las etapas y qué scripts se ejecutan. Para obtener más información, consulte scripts personalizados.

Hay dos categorías principales de scripts que utilizan las interconexiones de DevSecOps:

  • Scripts relacionados con la aplicación que se utilizan para crear, probar y desplegar la aplicación. Estos scripts son de su propia responsabilidad y están fuera del ámbito para el soporte de DevSecOps. Puesto que estos scripts no tienen una implementación predeterminada, debe añadirlos a la aplicación o al repositorio de configuración. Es posible que tenga que extraer los scripts de Jenkins u otro origen.
  • Scripts de seguridad y conformidad que ejecutan exploraciones de seguridad y conformidad. La mayoría se proporcionan con scripts predeterminados que puede alterar temporalmente para utilizar su propia implementación personalizada.

Excepto para la etapa de inicio, cada etapa de una interconexión de AC, CD o CC se puede personalizar con sus propios scripts para alterar temporalmente la implementación predeterminada de la etapa. La etapa de inicio no se puede personalizar con sus propios scripts.

Aunque los scripts Bash se proporcionan como ejemplos, puede crear, probar y desplegar la aplicación utilizando otros lenguajes como Python o Go. Asegúrese de que está utilizando el image correcto para cada etapa. Consulte las imágenes de Docker en la sección DevSecOps pipelines.

Consulte la tabla Etapas y tareas que resumen diversas etapas del conducto de AC. La tabla también proporciona una información consolidada sobre si la etapa tiene una implementación de referencia predeterminada, si se puede personalizar o omitir, o si hay una recopilación de pruebas explícita necesaria para la ejecución de la etapa.

Migración de Jenkins o Travis a DevSecOps

La mayoría de los adoptantes de Ops de DevSecno empiezan de la nada. La mayoría de los adoptantes ya cuentan con procesos continuos de integración y entrega continua, junto con una biblioteca de scripts correspondiente. Estos procesos normalmente se implementan utilizando Jenkins, Travis o alguna otra plataforma.

Puntos clave para migrar a DevSecOps:

  • El archivo de configuración pipeline-config.yaml debe reflejar cómo están orquestadas actualmente las interconexiones CI y CD. Las etapas y los pasos se deben correlacionar con DevSecetapas de conducto Ops.
  • Debe utilizar los mismos scripts, imágenes base y variables que ya están en su lugar.
  • Las propiedades de secreto deben migrarse a un almacén de secretos.
  • Es necesario añadir propiedades no secretas como propiedades de conducto o desencadenante.

Trabajo en modalidad de desarrollo

Puede utilizar la modalidad de desarrollo para interconexiones CI y CD para probar la implementación del archivo .pipeline-config.yaml y los scripts. La interconexión en modalidad de desarrollo no ejecuta ninguna tarea relacionada con la seguridad o la conformidad, lo que reduce el tiempo de ejecución para la interconexión. Para obtener más información, consulte ejecución de pipelines en modalidad de desarrollo.

Utilice la modalidad de desarrollo sólo para fines de desarrollo. La modalidad de desarrollo no sustituye a las interconexiones oficiales de CI y CD de DevSecOps, que siguen siendo las implementaciones de referencia.

Configuración de la interconexión de CD

En DevSecOps continuous integration, continuous deployment workflow, el conducto de AC envía actualizaciones al repositorio de inventario durante la etapa deploy-release del conducto de AC. Para obtener más información, consulte el script release.sh de ejemplo.

En este flujo de trabajo, varios desencadenantes de AC y distintas cadenas de herramientas de AC DevSecOps pueden contribuir al mismo repositorio de inventario.

Al contrario que la interconexión de AC, el script de despliegue que utiliza la interconexión de CD debe adaptarse de los scripts actuales en Jenkins, Travis o alguna otra plataforma para utilizar las entradas del repositorio de inventario.

Este código de ejemplo muestra cómo recuperar información del inventario y utilizarla para ejecutar un despliegue de Kubernetes.

Ubicación de los scripts de DevSecOps

Las interconexiones de DevSecOps se proporcionan con herramientas de seguridad y exploración predeterminadas y scripts asociados.

Por ejemplo, el inicio de un registro de etapa hace referencia al script predeterminado:

scan-artifact:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
  dind: true
  dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  script: |
    #!/bin/sh

    "/opt/commons/scan-artifact/scan.sh"

/opt/commons/scan-artifact/scan.sh es el script predeterminado.

La interconexión Ops DevSecproporciona la vía de acceso a la carpeta raíz de la biblioteca commons en una variable de entorno denominada COMMONS_PATH, que está disponible en todas las tareas y pasos. Para acceder a un script que está incorporado en la imagen base de conformidad, utilice la variable COMMONS_PATH con la carpeta de script que necesita:

source "${COMMONS_PATH}/<script folder in commons>/<script file name>

Consulte la tabla Etapas y tareas que resume varias etapas de la interconexión de CD. La tabla también proporciona una información consolidada sobre si la etapa tiene una implementación de referencia predeterminada, si se puede personalizar o omitir, o si hay una recopilación de pruebas explícita necesaria para la ejecución de la etapa.

Propiedades de entorno

Las interconexiones de DevSecOps se proporcionan con propiedades de entorno predefinidas, pero puede añadir tantas propiedades personalizadas como sea necesario. Puede acceder a estos valores de propiedades en los scripts utilizando Mandato get_env.

Después de añadir la propiedad y su valor predeterminado opcional al conducto o desencadenante, utilice el mandato get_env en el script para recuperar el valor de la propiedad. El ejemplo siguiente recupera el valor de la propiedad my-variable :

MY_VARIABLE=$(get_env my-variable "")

También puede alterar dinámicamente el valor de una propiedad en un script utilizando Mandato set_env. El ejemplo siguiente altera temporalmente el valor de la propiedad my-variable :

set_env my-variable new-value

Omitir etapas

Algunas etapas pueden ser irrelevantes. Por ejemplo, es posible que no esté creando ninguna imagen de Docker o que todavía no haya implementado pruebas de aceptación. Si desea omitir una etapa, puede editar el archivo .pipeline-config.yaml para incluir exit 0 o establecer la variable skip en true.

El ejemplo siguiente añade exit 0 para omitir una etapa:

scan-artifact:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
  dind: true
  dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
  abort_on_failure: false
  image_pull_policy: IfNotPresent
  skip: false
  runAfter: null
  script: |
    #!/bin/sh

    exit 0
    "/opt/commons/scan-artifact/scan.sh"

Imágenes de Docker en interconexiones de DevSecOps

De forma predeterminada, las interconexiones de DevSecOps utilizan imágenes de IBM Continuous Delivery. Estas imágenes contienen algunas de las herramientas más comunes como, por ejemplo, Node y Java para ejecutar los scripts. También puede utilizar imágenes de otros proveedores o sus propias imágenes personalizadas que contengan las herramientas que prefiera.

Las imágenes de Docker que utilizan las interconexiones de DevSecOps se especifican en el archivo .pipeline-config.yaml. Cada etapa puede utilizar una imagen diferente.

Cambio de la versión de la imagen

En función de sus requisitos, es posible que tenga que utilizar una versión diferente de una imagen. Para cambiar la versión de la imagen, edite el archivo .pipeline-config.yaml. Por ejemplo, si ha hecho referencia a la siguiente imagen en el archivo YAML icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24, si la cambia a icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.27 se utiliza la versión 3.27 de la imagen.

De la misma forma, cambie dind_image para la etapa:

scan-artifact:
  image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.24
  dind: true
  dind_image: icr.io/continuous-delivery/toolchains/devsecops/docker:20.10.21-dind
(...)

Obtención de soporte

A medida que personaliza los conductos de DevSecOps, obtenga ayuda directamente de los equipos de desarrollo de IBM Cloud uniéndose a nosotros en Slack.