> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diversion.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# CI/CD

> CI/CD プラットフォームを Diversion で利用できるように設定する

## API トークンを生成する

<Steps>
  <Step title="Integrations ページに移動する">
    アバターをクリックし、*Integrations* を選択します。設定内の **Integrations** ページが開きます。

    <img alt="Drop Down Menu" style={{width: 'auto', maxWidth: '90%', borderRadius: '1.5rem', border: '.3rem solid #555', boxShadow: '0 0 1rem #888' }} src="https://mintcdn.com/diversion-2/Yky3RnSpHJMXzWF0/images/nav-integrations.png?fit=max&auto=format&n=Yky3RnSpHJMXzWF0&q=85&s=5878352dc7cdcda2afe3538bc20e79d1" width="179" height="359" data-path="images/nav-integrations.png" />
  </Step>

  <Step title="新しいトークンを生成する">
    *Generate a new API token* ボタンをクリックし、トークンの名前を入力してから *Generate token* をクリックします。

    <img alt="Generate Token" style={{width: '90%', borderRadius: '1.5rem', border: '.3rem solid #555', boxShadow: '0 0 1rem #888' }} src="https://mintcdn.com/diversion-2/108HFuSbQUmxVjWe/images/api-token-create.png?fit=max&auto=format&n=108HFuSbQUmxVjWe&q=85&s=0196ecb8dcf06536bd6a172eadab3d7b" width="1057" height="540" data-path="images/api-token-create.png" />

    *Copy* アイコンを使ってトークンをコピーし、安全な場所に保管してください。

    <img alt="Copy API Token" style={{width: '90%', borderRadius: '1.5rem', border: '.3rem solid #555', boxShadow: '0 0 1rem #888' }} src="https://mintcdn.com/diversion-2/108HFuSbQUmxVjWe/images/api-token-created.png?fit=max&auto=format&n=108HFuSbQUmxVjWe&q=85&s=8e44a1fc4aaaf9563825db7d55e99b41" width="1534" height="1025" data-path="images/api-token-created.png" />

    <Note>ここでトークンが表示されるのはこの一度きりで、後から取得する方法はありません。
    紛失した場合は、そのトークンを取り消して新しいものを生成してください。</Note>
  </Step>
</Steps>

## CI/CD プラットフォームをセットアップする

<Steps>
  <Step title="API トークンを安全に保管する">
    <Note>API トークンをプレーンな環境変数として保存しないでください!CI/CD プラットフォームが安全な
    シークレットストレージを提供している場合は、それを使用してください。</Note>
    人気のある CI/CD プラットフォームでのシークレット保存に関するドキュメントは以下のとおりです:

    * [<span>Jenkins <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://www.jenkins.io/doc/developer/security/secrets/#storing-secrets-on-disk)
    * [<span>CircleCI <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://circleci.com/docs/security-recommendations/)
    * [<span>TravisCI <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://docs.travis-ci.com/user/environment-variables/#defining-variables-in-repository-settings)
    * [<span>TeamCity <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://www.jetbrains.com/help/teamcity/hashicorp-vault.html)
    * [<span>Bitrise <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://devcenter.bitrise.io/en/builds/secrets.html)

    プラットフォームが安全なシークレットの取り扱いをサポートしていない場合は、外部のシークレット管理ツールを使用できます:

    * [<span>Hashicorp Vault <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://www.vaultproject.io/)(TeamCity 用プラグインあり)
    * [<span>Akeyless <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://docs.akeyless.io/docs/akeyless-overview)(TeamCity 用プラグインあり)
    * [<span>Azure Key Vault <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://azure.microsoft.com/en-us/products/key-vault)(TeamCity 用プラグインあり)
    * [<span>Google Secret Manager <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://cloud.google.com/security/products/secret-manager)
    * [<span>AWS Secrets Manager <Icon icon="arrow-up-right-from-square" iconType="solid" /></span>](https://aws.amazon.com/secrets-manager/)
  </Step>
</Steps>

## CI/CD ワークフローにビルドステップを作成する

### Diversion クライアントのインストール、認証、リポジトリのクローン

CI/CD のステップエディタまたは `yml` ファイルで、次の内容の新しい *Shell* ビルドステップを作成します:

<CodeGroup>
  ```bash Mac/Linux theme={null}
  # Diversion クライアントのダウンロード
  curl -sL https://get.diversion.dev/unix | bash ; export PATH="$HOME/.diversion/bin:$PATH"
  # Diversion エージェントをバックグラウンドで起動し、起動を待つ
  dv --agent --bkg
  sleep 2
  # Diversion の認証
  dv authenticate $API_TOKEN
  # リポジトリをクローンし、同期完了を待つ
  dv clone -new-workspace my-repository
  cd my-repository
  dv status
  ```

  ```powershell Windows theme={null}
  # Diversion クライアントのダウンロード
  . ([Scriptblock]::Create((([System.Text.Encoding]::ASCII).getString((Invoke-WebRequest -Uri "https://get.diversion.dev/win-ci").Content))))
  # Diversion エージェントをバックグラウンドで起動し、起動を待つ
  dv --agent --bkg
  Start-Sleep -Seconds 2
  # Diversion の認証
  dv authenticate $env:API_TOKEN
  # リポジトリをクローンし、同期完了を待つ
  dv clone -new-workspace my-repository
  cd my-repository
  dv status
  ```
</CodeGroup>

<Note>`$API_TOKEN` を、安全なストレージからシークレットを参照する適切な方法に置き換えてください。
プラットフォームのドキュメントとセキュアストレージのドキュメントを参照してください。</Note>
<Note>`my-repository` をリポジトリの名前に置き換えてください。</Note>
<Note>`dv status` はすべてのファイルのダウンロードが完了するまで待機します。作業を開始する前にこの確認が重要です。
また、次の実行で再利用するためや Web アプリで確認するためのワークスペース ID も出力されます。</Note>
<Note>`-new-workspace` は、CI/CD ワークフローの実行ごとに新しいワークスペースを作成します。ここでワークスペース引数を渡すことは
重要で、そうしないと clone コマンドがユーザー入力を求めてブロックします。詳細は `dv help clone` を参照してください。</Note>

## CI/CD ワークフローの残りを追加する

これで完了です。CI/CD ワークフローで Diversion のリポジトリを使用する準備ができました。ローカルで `dv` を実行するときに使う CLI コマンドは、どれもそのまま使用できます。

## Jenkins の例

プレースホルダを実際の値に置き換えてください。また、この構文は Windows ノード用なので、特定のセットアップに合わせて調整が必要な場合があります。

```groovy theme={null}
pipeline 
{
    agent 
    {
        any
    }

    environment
    {
        DV_WORKSPACE = "<Workspace ID>" //Found in Diversion using 'dv workspace' command
        DV_REPO = "<Diversion Repository Name>" //Your repository name
    }

    stages
    {
        stage('Sync Repository')
        {
            steps
            {
                script
                {
                    // Checking if Diversion CLI is installed and installing from API if not
                    if (!fileExists("${USERPROFILE}\\.diversion\\bin\\dv.exe"))
                    {
                        echo "Diversion not installed at ${USERPROFILE}\\.diversion\\bin\\dv.exe, installing..."
                        powershell 'iwr https://get.diversion.dev/win-ci | iex'
                    }

                    //Authenticating Diversion CLI
                    withCredentials([string(credentialsId: '<Jenkins Credential ID>', variable: 'API_TOKEN')]) //Insert your credential ID found in Jenkins Credentials
                    {
                        echo "Diversion CLI installed, authenticating..."
                        bat "dv authenticate %API_TOKEN%"
                    }

                    //Cloning repository if it is not already cloned
                    if (!fileExists("${WORKSPACE}\\${DV_REPO}\\.diversion"))
                    {                           
                        echo "Diversion authenticated, empty folder found, cloning repository..."
                        bat "dv clone ${DV_REPO} -workspace ${DV_WORKSPACE}"
                    }

                    //Pulling latest changes if repository is already cloned
                    else
                    {
                        echo "Diversion repository already cloned, pulling latest changes..."
                        bat "cd ${WORKSPACE}\\${DV_REPO} && dv update"
                    }

                    //Displaying status of repository until tasks complete (so we do not start more tasks until it is done)
                    bat "cd ${WORKSPACE}\\${DV_REPO} && dv status"
                }
            }
        }
    }
}
```
