6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actionsでsandboxを自動更新

Last updated at Posted at 2023-12-18

この記事はAteam LifeDesign Advent Calendar 2023の19日目の記事です。

はじめに

今回は、sfpowerkitというSalesforce CLIのプラグインを使ってsandoxを自動更新しようと思います。

sfpowerkitは現在非推奨でsfpowerscriptsに移行中ですが、
2023/12現在 sandbox refreshはsfpowerkitでしか対応していません。
なので今回はsfpowerkitを使用しています。

完成したもの

以下のようなスケジュールでSalesforceのsandboxを自動更新する
GitHub Actionsができました。

常に最新のsandboxが一つ存在するように、2つのsandboxの更新をローテーションしています。

月曜 火曜 水曜 木曜 金曜
latest latest2 latest latest2 latest
refresh-sandbox.yml
name: SNDBOX 自動更新 0時(latest(月・水・金), latest2(火・木))

on:
  schedule:
    - cron: "0 15 * * 1,3,5" # 月・水・金 JST 00:00 に latest sandbox更新
    - cron: "0 15 * * 2,4" # 火・木 JST 00:00 に latest2 sandbox更新

jobs:
  refresh_sandbox:
    runs-on: ubuntu-latest
    environment:
      name: schedule_production
    steps:
      - name: Make temporary directory
        run: |
          mkdir ./tmp
      - name: Install Salesforce CLI
        run: |
          wget https://developer.salesforce.com/media/salesforce-cli/sfdx/channels/stable/sfdx-linux-x64.tar.xz
          mkdir ./tmp/sfdx-cli
          tar xJf sfdx-linux-x64.tar.xz -C ./tmp/sfdx-cli --strip-components 1
          echo "./tmp/sfdx-cli/bin" >> $GITHUB_PATH
      - name: sfdx version
        run: sfdx version
      - name: set name latest
        if: github.event.schedule == '0 15 * * 1,3,5'
        run: echo "SANDBOX_NAME=latest" >> $GITHUB_ENV
      - name: set name latest2
        if: github.event.schedule == '0 15 * * 2,4'
        run: echo "SANDBOX_NAME=latest2" >> $GITHUB_ENV
      - name: echo sandbox name
        run: echo ${{ env.SANDBOX_NAME }}
      - name: install sfpowerkit
        run: echo y | sfdx plugins:install sfpowerkit
      - name: save into private-key
        run: echo -n "${{ secrets.SF_JWT_KEY_FILE }}" | base64 -d > ./tmp/server.key
      - name: auth
        run: sfdx auth:jwt:grant --instance-url ${{ vars.SF_INSTANCE_URL }} --client-id ${{ secrets.SF_CONSUMER_KEY }} --jwt-key-file ./tmp/server.key --username ${{ vars.SF_DEPLOY_USER }} --alias production
      - name: refresh sandbox
        run: echo y | sfdx sfpowerkit:org:sandbox:refresh -n ${{ env.SANDBOX_NAME }} -v production -l DEVELOPER

なぜ毎日最新のsandboxが必要なのか?

Salesforceのsandboxには、本番から作成更新ではなく
既存のsandboxをコピーして作成する方が早いという特徴があります。

sandboxを利用して開発するメンバーの開発体験を上げるためにも
最新のsandboxを用意して、コピーする運用は非常に大事です。
(じゃないとsandbox作成に1日かかるのはよくある)

※今自分が利用している本番組織は、Hyperforceに移行済み組織ではないです。

本番組織を送信元として使用するのではなく、既存の Sandbox をコピーして Sandbox を作成できます。一連のデータとメタデータで Sandbox をカスタマイズして、それを複製することで時間を節約できます。

この記事で詳しく説明しないこと

  • GitHub Actions自体の詳細な説明
  • Salesforce CLIについてや、セットアップ
  • 接続アプリケーションの詳細な設定

セットアップ

1. 接続アプリケーションの作成

今回はJWTを使った認証を使用します。

以下の記事がとてもわかりやすいです。

2. GitHub 環境変数のセット

Variables

Key Value
SF_INSTANCE_URL sandboxを作成する 本番組織のURL
SF_DEPLOY_USER Salesforce CLIを実行する Salesforceユーザー名

Secrets

Key Value
SF_CONSUMER_KEY 接続アプリケーションのコンシューマーキー
SF_JWT_KEY_FILE 接続アプリケーションに登録したJWTの秘密鍵(.pem)をBase64でエンコードしたもの

作成したGitHub Actionsについて

1. スケジュール実行

平日に2パターンでsandboxを更新する必要があるので、スケジュールは2つ登録しています

  • 月曜・水曜・金曜 00:00
  • 火曜・木曜 00:00
on:
  schedule:
    - cron: "0 15 * * 1,3,5" # 月・水・金 JST 00:00 に latest sandbox更新
    - cron: "0 15 * * 2,4" # 火・木 JST 00:00 に latest2 sandbox更新

2. 起動したスケジュールによって更新するsandboxを変える

スケジュールで起動した際に、どのスケジュールで起動したかがgithub.event.scheduleの値を見るとわかります。
スケジュールによって更新対象のsandbox名が入るSANDBOX_NAMEを動的に変更します。

  - name: set name latest
        if: github.event.schedule == '0 15 * * 1,3,5'
        run: echo "SANDBOX_NAME=latest" >> $GITHUB_ENV
      - name: set name latest2
        if: github.event.schedule == '0 15 * * 2,4'
        run: echo "SANDBOX_NAME=latest2" >> $GITHUB_ENV

3. 認証

更新前に本番組織へJWT認証を行います。

      - name: save into private-key
        run: echo -n "${{ secrets.SF_JWT_KEY_FILE }}" | base64 -d > ./tmp/server.key
      - name: auth
        run: sfdx auth:jwt:grant --instance-url ${{ vars.SF_INSTANCE_URL }} --client-id ${{ secrets.SF_CONSUMER_KEY }} --jwt-key-file ./tmp/server.key --username ${{ vars.SF_DEPLOY_USER }} --alias production

4. sandboxを更新

      - name: refresh sandbox
        run: echo y | sfdx sfpowerkit:org:sandbox:refresh -n ${{ env.SANDBOX_NAME }} -v production -l DEVELOPER
オプション 説明
-n 更新するsandbox名
-v 認証した際のalias名
-l 使用するsandboxのエディション('DEVELOPER', 'DEVELOPER_PRO', 'PARTIAL', 'FULL)

最後に

SalesforceのCLIプラグインは、開発者の作業効率を大幅に向上させるための便利なツールを数多く提供しています。今回の記事では、これらのツールの中から特にsfpowerkitを取り上げ、Salesforceのsandboxの自動更新について解説しました。sfpowerkitを活用することで、sandbox利用者は更新プロセスの時間短縮を実現し、全体の開発体験が格段に向上しました。また、常に最新のsandboxを維持することにより、小規模ながらも実質的なメタデータのバックアップとしての役割も果たしています。このような多面的な利点を考慮すると、sandboxの自動更新を検討している方々には、sfpowerkitの利用を強くお勧めします。

ただし、現在sfpowerkitは非推奨とされています。将来的には、Salesforce公式のSandbox操作コマンドやsfpowerscriptsにリフレッシュ機能が追加されることを期待しています。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?