自分のアプリを 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.yamlDevSecOps パイプライン構成ファイルの内容を推測します。- コードの構築、テスト、デプロイに必要なスクリプトを特定します。
- これらのスクリプトのコードを提供します。
この機能を使用して、マイクロサービスやアプリケーションを 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.yamlCIパイプラインで使用される
これで、 .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."ステージについて詳しくは、 カスタム・スクリプト を参照してください。