クラウドでのIaC:TerraformとResource ManagerをCI/CDパイプラインに組み込む―OCI CLIを使った構成/IaC in the Cloud: Integrating Terraform and Resource Manager into your CI/CD Pipeline - Building with the OCI CLI

 原文はこちら: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:
view rawbuild.yaml hosted with ❤ by GitHub

注意: 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
view rawbuild.yaml hosted with ❤ by GitHub

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:

  • Create GitHub Source Provider (if necessary)

  • Create Stack (if necessary)

  • Create/Execute Plan Job

  • Create/Execute Apply Job

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
view rawbuild.yaml hosted with ❤ by GitHub

次に、ソースプロバイダーとスタックを存在していない場合には作成します(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
view rawbuild.yaml hosted with ❤ by GitHub

最後に、プランを作成してジョブを適用します。

- 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
view rawbuild.yaml hosted with ❤ by GitHub

build.yamlファイルが完成したら、GitHubリポジトリにコミットしてプッシュすることでビルドをトリガーすることができます。ジョブが成功したら、ログを確認してみましょう。


まとめ

ソースプロバイダーおよびスタックの作成、ジョブの実行のプロセスをGitHub ActionsのCI/CDパイプラインで完全に自動化することができました!今回のケースでは、ジョブの実行に3分17秒かかっていることに注目してください。一番時間がかかっているのはCLIのインストール、プランの作成とジョブの適用です。もうちょっと時間を短縮できないものでしょうか?次の(そして最後の)ポストでその方法をお目にかけます!


0 件のコメント:

コメントを投稿