Trazendo seu próprio aplicativo para DevSecOps

Existem várias maneiras de trazer seu próprio aplicativo para uma cadeia de ferramentas de integração contínua e implantação contínua ( DevSecOps ).

Usar amostras

Para integrar seu próprio aplicativo em uma cadeia de ferramentas DevSecOps para integração e implantação contínuas e perfeitas, comece com nossas configurações de amostra.

Node.js exemplo

Crie sua cadeia de ferramentas DevSecOps usando o aplicativo de amostra padrão fornecido. O hello-compliance-app hospeda um servidor Node.js que fornece uma página da web estática

Outras amostras

Como alternativa, você pode começar usando uma dessas amostras:

  • Code-engine-compliance-app: esse repositório contém um aplicativo Node.js que ilustra as estratégias de criação do Code Engine e pode ser implantado como um aplicativo Code Engine ou um trabalho Code Engine.
  • Go-compliance-app: esse repositório contém um microsserviço Go usando o Gin, implantado usando helm.
  • Python-compliance-app: este repositório contém um microsserviço Python usando o Flask, implantado usando helm.
  • Node-cloudant-compliance-app: esse repositório contém um aplicativo Node.js implantado usando kubectl, que interage com uma instância Cloudant criada por meio do Terraform (Infrastructure-As-Code).

Use a configuração inferida do DevSecOps

Depois de adicionar seu próprio repositório de código-fonte de aplicativo à cadeia de ferramentas de CI do DevSecOps, você poderá usar o recurso Inferred DevSecOps Pipeline Configuration para começar imediatamente. Esse recurso:

  • Não requer nenhuma personalização inicial.
  • Infere o conteúdo do arquivo de configuração do pipeline .pipeline-config.yaml DevSecOps.
  • Identifica os scripts necessários para criar, testar e implantar o código.
  • Fornece o código para esses scripts.

Use esse recurso para integrar de forma fácil e rápida seus microsserviços ou aplicativos aos pipelines do DevSecOps e simplificar a adoção do DevSecOps.

Gerar o arquivo yaml de configuração do pipeline de CI para um determinado repositório de código-fonte (configuração inferida do DevSecOps no modo autônomo)

Você pode gerar um arquivo de configuração de pipeline para um determinado repositório de código-fonte de forma estática/modo autônomo. Esse recurso se baseia na mesma lógica da configuração inferida do DevSecOps e é fornecido por meio de um script específico na imagem base de conformidade do DevSecOps.

Pré-requisitos

  • Tenha um mecanismo de docker instalado e em execução em seu ambiente local
  • yq para executar os seguintes comandos

Uso

O script está localizado no seguinte caminho na imagem base de conformidade: /opt/one-pipeline/polyglot/tools/enable-devsecops.sh.

O uso do script é enable-devsecops.sh [--configuration <key>=value]* [--configuration-file <filename>] [--version <v9|v10|v11>]* <path to source code directory>

Os snippets a seguir ilustram como usar esse script.

# clone the source code repository that you want to generate CI pipeline config for
git clone https://us-south.git.cloud.ibm.com/open-toolchain/hello-containers
cd hello-containers

export compliance_base_image=$(curl -L https://us-south.git.cloud.ibm.com/open-toolchain/compliance-pipelines/-/raw/open-v10/definitions/ci-trigger.yaml?ref_type=heads | yq '.spec.params[] | select(.name == "compliance-baseimage") | .default')

# environment variable compliance_base_image should contains a value like icr.io/continuous-delivery/toolchains/devsecops/devsecops-baseimage:3.109.7_commons-1.50.2 or upper

# define hint for unit-test and acceptance-test configuration properties as the hello-containers
# sample has specific npm script entries for it

docker run --platform linux/amd64 -v.:/src --rm -it $compliance_base_image /opt/one-pipeline/polyglot/tools/enable-devsecops.sh --configuration hint-npm-unit-testing-script=test-unit --configuration hint-npm-acceptance-testing-script=test-fvt /src

Você pode fornecer parâmetros específicos usando as opções do site --configuration (ou --configuration-file <file path> com o arquivo com o par de valores-chave).

Os parâmetros fornecidos configurarão o processo de extração do DevSecOps e os parâmetros disponíveis são descritos aqui: configuração do ponto de extração

docker run --platform linux/amd64 -v.:/src --rm -it $compliance_base_image /opt/one-pipeline/polyglot/tools/enable-devsecops.sh --configuration hint-npm-unit-testing-script=test-unit --configuration hint-npm-acceptance-testing-script=test-fvt /src

Resultados

polyglot-spots.json e os arquivos .pipeline-config.yaml são adicionados ao diretório raiz do repositório de código-fonte.

  • polyglot-spots.json é a cartografia de pontos específicos encontrados na inspeção do código-fonte e pode ser descartada.
  • .pipeline-config.yaml que será usado pelo pipeline de CI

Agora, você pode enviar o .pipeline-config.yaml para o repositório git do código-fonte e usá-lo como repositório do aplicativo, conforme descrito em Integração de um aplicativo.

Incluindo parâmetros de estágio

O código-fonte de cada aplicativo de exemplo contém um arquivo .pipeline-config.yaml . O arquivo .pipeline-config.yaml é o arquivo de configuração principal utilizado pelas cadeias de ferramentas de integração contínua e implantação contínua em todas as etapas do processo de execução do pipeline.

Inclua um arquivo de configuração .pipeline-config.yaml que contém as propriedades a seguir, necessárias para cada estágio:

image
O nome da imagem do Docker usado para executar o estágio. Por exemplo, use o código a seguir para assinar as imagens:
image: icr.io/continuous-delivery/pipeline/image-signing:1.0.   0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
abort_on_failure

Defina esta propriedade como “ true ” para interromper a execução do pipeline caso a etapa falhe. Se essa propriedade for configurada como false, a etapa será marcada como passada com um estado de aviso, também conhecido como um estado âmbar, e o pipeline continuará a ser executado

script

O script que executa as ações necessárias nessa etapa. Crie os scripts no diretório de scripts dentro do repositório do aplicativo e execute-os a partir desse local. Por exemplo, o fragmento de código a seguir mostra o conteúdo da seção script quando se deseja assinar as imagens:

script: |
   #!/usr/bin/env bash
   STAGE_DIND="true"
   STAGE_ABORT_ON_FAILURE="false"
   STAGE_IMAGE_PULL_POLICY="IfNotPresent"
   source scripts/sign_image.sh
dind

Defina esta propriedade como “ true ” se desejar habilitar as funções do “ docker ” no pipeline em execução. Depois de determinar quais parâmetros são necessários, você pode definir várias etapas no pipeline.

setup

Defina esta etapa para executar os scripts de pré-configuração.

setup:
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert any required pre-build tasks in this stage."
test

Defina esta etapa para executar os casos de teste do aplicativo.

test:
   abort_on_failure: false
image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
script: |
   #!/usr/bin/env bash
   cd ../"$(load_repo app-repo path)"
   #npm ci
   #npm test
   source test/test.sh
static-scan

Defina esse estágio para executar uma varredura estática sobre o código

static-scan:
   dind: true
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert script to invoke/execute static scan tool like SonarQube on the application source code."
containerize

Defina esta etapa para compilar e contêinerizar seu aplicativo.

containerize:
   dind: true
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash

   if [[ "$PIPELINE_DEBUG" == 1 ]]; then
   trap env EXIT
   env
   set -x
   fi
   source scripts/build_setup.sh
   source scripts/build.sh
deploy

Defina esta etapa para implantar seu aplicativo no ambiente de destino.

deploy:
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash

   if [[ "$PIPELINE_DEBUG" == 1 ]]; then
   trap env EXIT
   env
   set -x
   fi
   source scripts/deploy_setup.sh
   source scripts/deploy.sh
sign-artifact

Por padrão, a cadeia de ferramentas de CI DevSecOps assina todas as imagens criadas durante o estágio de conteinerização. As chaves GPG fornecidas durante a configuração da cadeia de ferramentas são usadas para assinar as imagens. Se desejar customizar o processo de assinatura de imagens, inclua a definição de estágio a seguir em seu .pipeline-config.yaml:

sign-artifact:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/image-signing:1.0.      0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
   script: |
   #!/usr/bin/env bash
   STAGE_DIND="true"
   STAGE_ABORT_ON_FAILURE="false"
   STAGE_IMAGE_PULL_POLICY="IfNotPresent"
   source scripts/sign_image.sh
acceptance-test

Defina esta etapa para executar seu teste de aceitação após a implantação.

acceptance-test:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   export APP_URL=$(cat ../app-url)
   source scripts/setup_go.sh
   echo "APP_URL :- ${APP_URL}"
   go run acceptance-test/acceptance-test.test.go
release

Defina esta etapa para enviar as evidências e os artefatos gerados nas etapas anteriores.

release:
   abort_on_failure: false
   image: icr.io/continuous-delivery/toolchains/devsecops/compliance-baseimage:2.26.      1@sha256:a780174a64474187b01b5e40a1721d8307f02897ac6f3eba2d482d4f4926edf1
   script: |
   #!/usr/bin/env bash
   source scripts/release.sh
scan-artifact

Defina esse estágio para executar uma varredura para vulnerabilidades nos artefatos gerados.

scan-artifact:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      6@sha256:7f588468622a981f89cf5e1212aaf75fface9da6169b5345ca52ab63d8215907
   script: |
   #!/usr/bin/env bash
   source scripts/va_scan.sh
dynamic-scan

Defina esse estágio para executar varredura dinâmica no aplicativo implementado.

dynamic-scan:
   dind: true
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert script to invoke/execute dynamic scan tool like OWASP ZAP on the built and deployed application."

Para obter mais informações sobre os estágios, consulte scripts customizados.