自分のアプリを DevSecOps に持ち込む

継続的インテグレーションおよび継続的デプロイメントのために、独自のアプリケーションを DevSecOps ツールチェーンに組み込む方法は複数存在します。

サンプルを使用する

独自のアプリケーションを DevSecOps のツールチェーンに統合して、シームレスな継続的インテグレーションとデプロイメントを実現するには、サンプルセットアップから始めてください。

Node.js サンプル

提供されているデフォルトのサンプル・アプリを使用して、DevSecOps ツールチェーンを作成します。 hello-compliance-app は、静的 Web ページを提供する Node.js サーバーをホストします。

その他のサンプル

あるいは、これらのサンプルのいずれかを使用して始めることもできます

  • Code-engine-compliance-app: このリポジトリには、 Code Engine のビルド戦略を示す Node.js アプリケーションが含まれており、 Code Engine アプリケーションまたは Code Engine ジョブとしてデプロイできます。
  • go-compliance-app: このリポジトリには、 helm でデプロイされたGinを使用するGoマイクロサービスが含まれています。
  • Python-compliance-app: このリポジトリには、 helm を使用してデプロイされた、Flask を使用する Python マイクロサービスが含まれています。
  • Node-cloudant-compliance-app: このリポジトリには、 kubectl を使用してデプロイされた Node.js アプリケーションが含まれています。このアプリケーションは、Infrastructure-As-Code(Terraform)で作成された Cloudant インスタンスと連携します。

推論された DevSecOps 構成を使用する

DevSecOps CIツールチェーンに独自のアプリケーションソースコードリポジトリを追加したら、 推測された DevSecOps パイプライン構成 機能を使用して、すぐに作業を開始できます。 この機能:

  • 初期カスタマイズは不要です。
  • .pipeline-config.yaml DevSecOps パイプライン構成ファイルの内容を推測します。
  • コードの構築、テスト、デプロイに必要なスクリプトを特定します。
  • これらのスクリプトのコードを提供します。

この機能を使用して、マイクロサービスやアプリケーションを DevSecOps のパイプラインに簡単に素早く導入し、 DevSecOps の採用を合理化してください。

指定されたソースコードリポジトリのCIパイプライン設定yamlファイルを生成する(スタンドアロンモードでは推論された DevSecOps の設定)

指定したソースコードリポジトリのパイプライン設定ファイルを、静的な方法/スタンドアロンモードで生成できます。 この機能は、推測される DevSecOps 設定と同じロジックに依存し、 DevSecOps 準拠ベースイメージ内の特定のスクリプトを通じて提供されます。

前提条件

  • ローカル環境でドッカーエンジンを立ち上げて動かす
  • yqは 以下のコマンドを実行するために使う

使用法

スクリプトは、コンプライアンス・ベース・イメージの次のパスにあります: /opt/one-pipeline/polyglot/tools/enable-devsecops.sh.

スクリプトの使い方は enable-devsecops.sh [--configuration <key>=value]* [--configuration-file <filename>] [--version <v9|v10|v11>]* <path to source code directory>

以下のスニペットは、このスクリプトの使い方を示している。

# 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

--configuration オプション(または --configuration-file <file path> キーと値のペアを持つファイル)を使って、特定のパラメーターを指定することができる。

提供されたパラメータは DevSecOps 抽出プロセスを構成し、利用可能なパラメータは以下の通りです: 抽出スポット構成

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

結果

polyglot-spots.json と のファイルがソースコード・リポジトリのルート・ディレクトリに追加される。 .pipeline-config.yaml

  • polyglot-spots.json は、ソースコードの検査で見つかった特定のスポットを地図化したもので、破棄することができる。
  • .pipeline-config.yaml CIパイプラインで使用される

これで、 .pipeline-config.yaml をソースコードの git リポジトリにプッシュして、アプリケーションの オンボーディングで 説明したように、アプリケーションのリポジトリとして使うことができます。

ステージ・パラメーターの追加

各サンプルアプリのソースコードには、 .pipeline-config.yaml ファイルが含まれています。 .pipeline-config.yaml ファイルは、パイプライン実行プロセスの全段階において、継続的インテグレーションおよび継続的デプロイメントのツールチェーンで使用される中核となる設定ファイルです。

各ステージで必要な以下のプロパティーを設定した .pipeline-config.yaml 構成ファイルを追加します。

image
ステージの実行に使用される Docker の画像名。 例えば、イメージに署名するには以下のコードを使用します。
image: icr.io/continuous-delivery/pipeline/image-signing:1.0.   0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
abort_on_failure

ステージの実行に失敗した場合にパイプラインの実行を停止するには、このプロパティを「 true 」に設定してください。 このプロパティーが false に設定されている場合、ステップは警告状態 (オレンジ色の状態とも呼ばれます) で成功としてマークされ、パイプラインの実行が続行されます。

script

そのステージで必要な処理を実行するスクリプト。 アプリのリポジトリ内のスクリプトディレクトリにスクリプトを作成し、この場所からスクリプトを呼び出してください。 例えば、以下のコード・スニペットは、イメージに署名するときの script セクションの内容を示しています。

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

実行中のパイプラインで docker の機能を有効にする場合は、このプロパティを true に設定してください。 必要なパラメータを特定したら、パイプライン内のさまざまなステップを定義できます。

setup

このステージを定義して、セットアップ前のスクリプトを実行します。

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

このステージを定義して、アプリのテストケースを実行します。

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

コードに対して静的スキャンを実行するには、このステージを定義します。

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

このステージを定義して、アプリをビルドし、コンテナ化します。

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

このステージを定義して、アプリをターゲット環境にデプロイします。

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

デフォルトでは、DevSecOps CI ツールチェーンは、コンテナ化段階でビルドされるすべてのイメージに署名します。 ツールチェーンのセットアップ中に提供される GPG キーは、 イメージに署名 するために使用されます。 イメージ署名プロセスをカスタマイズする場合は、 .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

デプロイ後に受け入れテストを実行するように、このステージを定義してください。

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

このフェーズを定義し、前のフェーズで生成された証拠や成果物をアップロードします。

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

生成された成果物の脆弱性のスキャンを実行するには、このステージを定義します。

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

デプロイされたアプリケーションで動的スキャンを実行するには、このステージを定義します。

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."

ステージについて詳しくは、 カスタム・スクリプト を参照してください。