開発中の機能
コード管理
運用例
3ブランチ運用

3ブランチ運用

mainstgprdの3つのブランチで、開発環境・検証環境・本番環境を管理する運用例です。

本番環境への同期前に検証環境での動作確認を挟むため、より安全な運用フローを実現できます。

ブランチと環境の対応

ブランチベースマキナの環境説明
main開発環境日常的な開発を行なうブランチ
stg検証環境本番環境への同期前に動作を検証するブランチ
prd本番環境本番環境用のブランチ

開発環境への変更

1. featureブランチで開発

mainからfeature/xxxブランチを作成し、アクションやビューの設定を編集してPRを作成します。

2. CIで差分を確認

PRが作成されると、CIでbm sync --dryが実行され、設定の差分がPRにコメントされます。

3. マージして開発環境に反映

PRをマージすると、CDでbm syncが実行され、アクションの変更がベースマキナの開発環境に反映されます。新しいバージョンが作成され、開発環境では常に最新バージョンが使用されるため即時反映されます。設定ファイルから削除されたアクションは、--with-disable指定時のみ開発環境で無効化されます。

ビューのコードを同じリポジトリで管理している場合は、ワークフローにビューのビルド・アップロード処理を追加します。詳細はコード取得設定との連携をご参照ください。レビュー設定やデータソースなど、コード管理対象外の設定は引き続きベースマキナの画面から設定してください。

検証環境への変更

開発環境で確認が取れたら、検証環境に同期します。

1. PRの作成

stgブランチにmainをマージするPRを作成します。

2. マージして検証環境に同期

PRをマージすると、CDでbm sync <検証環境のID>が実行され、検証環境のすべてのアクションのバージョンと有効化設定が開発環境の状態に合わせて同期されます。

ビューのコードも同じリポジトリで管理している場合は、同じワークフローで検証環境用のストレージへのアップロードも行なえます。

本番環境への変更

検証環境で確認が取れたら、本番環境に同期します。

1. PRの作成

prdブランチにstgをマージするPRを作成します。

2. マージして本番環境に同期

PRをマージすると、CDでbm sync <本番環境のID> --from <検証環境のID>が実行され、本番環境のすべてのアクションのバージョンと有効化設定が検証環境の状態に合わせて同期されます。

ビューのコードも同じリポジトリで管理している場合は、同じワークフローで本番環境用のストレージへのアップロードも行なえます。

コード管理した設定のWeb上での変更

コード管理している設定は、引き続きWeb上(ベースマキナの管理画面)からも変更できます。

Web上で変更すると、そのアクションの管理方法は一時的に「Web管理」に戻ります。次回のbm syncで、設定ファイルに差分があれば「コード管理に移行(設定変更あり)」として設定を上書きし、差分がなければ「コード管理に移行(設定変更なし)」として管理方法だけを戻します。

コード管理を開始した後は、設定の変更はコードで行なうことを推奨します。

⚠️

Web上での変更時には、コード管理されている設定であることを示す警告が表示されます。

CI/CDの設定例

トリガー対象ブランチ実行内容説明
PR作成時mainbm sync --dry設定の差分をPRにコメント
PRマージ時mainbm sync設定の差分を開発環境に反映
PRマージ時stgbm sync <stg環境ID>開発環境のバージョンを検証環境に同期
PR作成時prdbm sync --dry <prd環境ID>本番環境への同期の差分をPRにコメント
PRマージ時prdbm sync <prd環境ID> --from <stg環境ID>検証環境のバージョンを本番環境に同期

GitHub Actionsの設定ファイル例

以下は.github/workflows/に配置するワークフローファイルの例です。認証の詳細はCI/CDの設定をご参照ください。

開発環境への反映(.github/workflows/sync-dev.yml

name: Sync to dev
on:
  pull_request:
    branches: [main]
  push:
    branches: [main]
 
permissions:
  id-token: write
  contents: read
  pull-requests: write
 
jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - name: Fetch OIDC ID Token
        id: oidc
        uses: actions/github-script@v7
        with:
          script: |
            const token = await core.getIDToken("https://basemachina.com")
            core.setSecret(token)
            core.setOutput("token", token)
      - name: Dry run
        if: github.event_name == 'pull_request'
        run: npx bm sync --dry
        env:
          BM_OIDC_TOKEN: ${{ steps.oidc.outputs.token }}
      - name: Sync
        if: github.event_name == 'push'
        run: npx bm sync
        env:
          BM_OIDC_TOKEN: ${{ steps.oidc.outputs.token }}

検証環境への同期(.github/workflows/sync-stg.yml

name: Sync to stg
on:
  push:
    branches: [stg]
 
permissions:
  id-token: write
  contents: read
 
jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - name: Fetch OIDC ID Token
        id: oidc
        uses: actions/github-script@v7
        with:
          script: |
            const token = await core.getIDToken("https://basemachina.com")
            core.setSecret(token)
            core.setOutput("token", token)
      - name: Sync
        run: npx bm sync <stg環境ID>
        env:
          BM_OIDC_TOKEN: ${{ steps.oidc.outputs.token }}

本番環境への同期(.github/workflows/sync-prd.yml

name: Sync to prd
on:
  pull_request:
    branches: [prd]
  push:
    branches: [prd]
 
permissions:
  id-token: write
  contents: read
  pull-requests: write
 
jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - name: Fetch OIDC ID Token
        id: oidc
        uses: actions/github-script@v7
        with:
          script: |
            const token = await core.getIDToken("https://basemachina.com")
            core.setSecret(token)
            core.setOutput("token", token)
      - name: Dry run
        if: github.event_name == 'pull_request'
        run: npx bm sync --dry <prd環境ID> --from <stg環境ID>
        env:
          BM_OIDC_TOKEN: ${{ steps.oidc.outputs.token }}
      - name: Sync
        if: github.event_name == 'push'
        run: npx bm sync <prd環境ID> --from <stg環境ID>
        env:
          BM_OIDC_TOKEN: ${{ steps.oidc.outputs.token }}