原文はこちら:https://blogs.oracle.com/developers/iac-in-the-cloud%3a-integrating-terraform-and-resource-manager-into-your-cicd-pipeline-building-with-the-oci-cli
Oracle Cloudでのインフラ管理をTerraformとResource Managerを使って実施する方法を学んでいくシリーズへおかえりなさい。前回のポストでは、GitHub Actionsを使って他の開発者に配布可能なリリースを作成し、'Deploy to Oracle Cloud'ボタンをリポジトリに追加する方法について学びました。今回のポストでは、ワークフローの中でTerraformスクリプトをGitHub ActionsからOCI CLIを使って実行する方法について紹介していきます。
パイプラインからインフラを構成する
このシリーズではここまで、インフラ構築を手動で始動する方法にフォーカスしてきましたが、今回のポストではついにCI/CDパイプラインにクラウドプロビジョニングを含めることによる自動化の方法について見ていきます。
Secretの作成
CI/CDパイプラインからTerraformスクリプトを実行するためには、GitHubリポジトリにいくつか必要なSecretをセットしておく必要があります。あなたのテナンシーから以下の値でSecretをセットしておきましょう。
OCI CLIからResource Managerを使って実行
Secretがセットできたら、GitHub Actionsを用いてOCI CLIでスタックをビルドするワークフローを作成していきます。ジョブステップで利用可能になるように環境変数を宣言しておきます。
注意:このシリーズで前に使ったコードと同じものを使って説明していきます。スタックやプロジェクトの全体を見たければ、OCI CLIを使って構築することにフォーカスしたこのGitHubブランチをチェックアウトしてください: https://github.com/recursivecodes/oci-resource-manager-demo/tree/github-actions-resource-manager
name: oci-resource-manager-build-demo |
| on: |
| push: |
| branches: |
| - github-actions-resource-manager |
| jobs: |
| build-resource-manager: |
| name: Build Resource Manager |
| runs-on: ubuntu-latest |
| env: |
| STACK_NAME: "OCI Resource Manager Demo Stack" |
| PROVIDER_NAME: "GitHub Source Provider" |
| BRANCH_NAME: "github-actions-resource-manager" |
| REPO_URL: "https://github.com/recursivecodes/oci-resource-manager-demo" |
| TF_VERSION: "0.13.x" |
| REGION: "us-phoenix-1" |
| BUCKET_NAME: "test_bucket" |
| steps: |
注意: We’ll need a GitHub token to use in our workflow so that we can use GitHub itself as a source provider, so see part 3 of this series if you haven’t created that token yet.GitHub自体をソースプロバイダーとして利用するために、ワークフローの中でGitHubトークンが必要になります。GitHubトークンをまだ作っていない場合は、このシリーズのパート3を参照ください。
GitHubリポジトリにGitHubトークンをSecretとして追加してください:
では、ビルドにいくつかのステップを追加していきましょう。最初のステップは、プロジェクトのコードベースをCI/CDパイプラインのワーキングディレクトリにチェックアウトします。次に、前述でセットしたSecretの値をOCI CLI用の設定ファイルに書き出して、CLI自体をインストールし、設定ファイルのパーミッションを修正します。
| - name: 'Checkout' |
| uses: actions/checkout@v2 |
|
|
| - name: 'Write Config & Key Files' |
| run: | |
| mkdir ~/.oci |
| echo "[DEFAULT]" >> ~/.oci/config |
| echo "user=${{secrets.OCI_USER_OCID}}" >> ~/.oci/config |
| echo "fingerprint=${{secrets.OCI_FINGERPRINT}}" >> ~/.oci/config |
| echo "pass_phrase=${{secrets.OCI_PASSPHRASE}}" >> ~/.oci/config |
| echo "region=${{secrets.OCI_REGION}}" >> ~/.oci/config |
| echo "tenancy=${{secrets.OCI_TENANCY_OCID}}" >> ~/.oci/config |
| echo "key_file=~/.oci/key.pem" >> ~/.oci/config |
| echo "${{secrets.OCI_KEY_FILE}}" >> ~/.oci/key.pem |
|
|
| - name: 'Install OCI CLI' |
| run: | |
| curl -L -O https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh |
| chmod +x install.sh |
| ./install.sh --accept-all-defaults |
| echo "/home/runner/bin" >> $GITHUB_PATH |
| exec -l $SHELL |
|
|
| - name: 'Fix OCI Config File Permissions' |
| run: | |
| oci setup repair-file-permissions --file /home/runner/.oci/config |
| oci setup repair-file-permissions --file /home/runner/.oci/key.pem |
And now we can start using the OCI CLI to perform the work that we manually performed in the previous posts in this series. Let’s look at a quick overview of the process as a refresher:
We can perform all of these tasks with the CLI in our workflow. First, let’s check for the source provider and stack - storing the OCID in environment variables if they are retrieved.
ここまででOCI CLIを使って前回のポストまででは手動でやっていた作業を実行できるようになりました。プロセスをちょっと振り返っておきましょう:
- GitHubソースプロバイダーの作成(必要な場合)
- スタックの作成(必要な場合)
- プランジョブの作成/実行
- 適用ジョブの作成/実行
これらのタスクをCLIを使ってすべてワークフローの中で実行できます。まず、ソースプロバイダーとスタックをチェックしておきましょう。取得できていればOCIDを環境変数として格納してみます。
| - name: 'Check Provider' |
| run: | |
| echo "SOURCE_PROVIDER_ID=$(oci resource-manager configuration-source-provider list \ |
| --compartment-id ${{secrets.OCI_COMPARTMENT_OCID}} | jq '.data.items[] | select(."display-name"==env.PROVIDER_NAME).id' -r)" >> $GITHUB_ENV |
|
|
| - name: 'Check Stack' |
| run: | |
| echo "STACK_ID=$(oci resource-manager stack list --all --compartment-id ${{secrets.OCI_COMPARTMENT_OCID}} | jq '.data[] | select(."display-name"==env.STACK_NAME).id' -r)" >> $GITHUB_ENV |
次に、ソースプロバイダーとスタックを存在していない場合には作成します(if制御文により正しい環境変数としてオブジェクトIDが既に存在していた場合はスキップされることに留意)。
| - name: 'Create Provider' |
| if: ${{env.SOURCE_PROVIDER_ID == ''}} |
| run: | |
| echo "SOURCE_PROVIDER_ID=$(oci resource-manager configuration-source-provider create-github-access-token-provider \ |
| --access-token ${{secrets.GITHUB_ACCESS_TOKEN}} \ |
| --api-endpoint https://github.com/ \ |
| --display-name $PROVIDER_NAME \ |
| --compartment-id ${{secrets.OCI_COMPARTMENT_OCID}} | jq '.data.id' -r)" >> $GITHUB_ENV |
|
|
| - name: 'Create Stack' |
| if: ${{env.STACK_ID == ''}} |
| run: | |
| echo "STACK_ID=$(oci resource-manager stack create-from-git-provider \ |
| --compartment-id ${{secrets.OCI_COMPARTMENT_OCID}} \ |
| --config-source-configuration-source-provider-id $SOURCE_PROVIDER_ID \ |
| --config-source-branch-name $BRANCH_NAME \ |
| --config-source-repository-url $REPO_URL \ |
| --display-name "$STACK_NAME" \ |
| --terraform-version $TF_VERSION \ |
| --variables '{"compartment_ocid": "${{secrets.OCI_COMPARTMENT_OCID}}", "region": "${{env.REGION}}", "bucket_name": "${{env.BUCKET_NAME}}"}' \ |
| --wait-for-state SUCCEEDED | jq '.data.id' -r)" >> $GITHUB_ENV |
最後に、プランを作成してジョブを適用します。
| - name: 'Create Plan Job' |
| if: ${{env.STACK_ID != ''}} |
| run: | |
| echo "PLAN_JOB_ID=$(oci resource-manager job create-plan-job \ |
| --stack-id $STACK_ID --wait-for-state SUCCEEDED | jq '.data.id' -r)" >> $GITHUB_ENV |
|
|
| - name: 'Apply Plan Job' |
| if: ${{env.PLAN_JOB_ID != ''}} |
| run: | |
| echo "APPLY_JOB_ID=$(oci resource-manager job create-apply-job \ |
| --execution-plan-strategy FROM_PLAN_JOB_ID \ |
| --execution-plan-job-id $PLAN_JOB_ID \ |
| --stack-id $STACK_ID \ |
| --wait-for-state SUCCEEDED | jq '.data.id' -r)" >> $GITHUB_ENV |
build.yamlファイルが完成したら、GitHubリポジトリにコミットしてプッシュすることでビルドをトリガーすることができます。ジョブが成功したら、ログを確認してみましょう。
まとめ
ソースプロバイダーおよびスタックの作成、ジョブの実行のプロセスをGitHub ActionsのCI/CDパイプラインで完全に自動化することができました!今回のケースでは、ジョブの実行に3分17秒かかっていることに注目してください。一番時間がかかっているのはCLIのインストール、プランの作成とジョブの適用です。もうちょっと時間を短縮できないものでしょうか?次の(そして最後の)ポストでその方法をお目にかけます!
0 件のコメント:
コメントを投稿