

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: CodeBuild がホストする GitLab ランナーを設定
<a name="sample-gitlab-runners"></a>

このチュートリアルでは、GitLab CI/CD パイプラインジョブを実行するように CodeBuild プロジェクトを設定する方法について説明します。CodeBuild で GitLab または GitLab セルフマネージドを使用する方法の詳細については、「[のセルフマネージド型 GitLab ランナー AWS CodeBuild](gitlab-runner.md)」を参照してください。<a name="sample-gitlab-runners-prerequisites"></a>

このチュートリアルを完了するには、まず以下を行う必要があります。
+ CodeConnections を使用して OAuth アプリに接続します。OAuth アプリに接続する場合は、CodeBuild コンソールを使用して接続する必要があることに注意してください。詳細な手順については、「[CodeBuild での GitLab アクセス](access-tokens-gitlab-overview.md)」を参照してください。
+ CodeBuild を GitLab アカウントに接続します。これを行うには、コンソールで GitLab をソースプロバイダとして追加できます。手順については、「[CodeBuild での GitLab アクセス](access-tokens-gitlab-overview.md)」を参照してください。
**注記**  
これを行う必要があるのは、アカウントで GitLab に接続していない場合のみです。  
この機能では、CodeBuild に GitLab OAuth アプリからの `create_runner` や `manage_runner` などの追加のアクセス許可が必要です。特定の GitLab アカウントに既存の CodeConnections がある場合、アクセス許可の更新は自動的にリクエストされません。これを行うには、CodeConnections コンソールに移動し、同じ GitLab アカウントへのダミー接続を作成して、追加のアクセス許可を取得するための再認証をトリガーします。これにより、すべての既存の接続でランナー機能を使用できます。完了したら、ダミー接続を削除できます。

## ステップ 1: ウェブフックを使用して CodeBuild プロジェクトを作成
<a name="sample-gitlab-runners-create-project"></a>

このステップでは、ウェブフックを使用して CodeBuild プロジェクトを作成し、GitLab コンソールで確認します。

**ウェブフックを使用して CodeBuild プロジェクトを作成するには**

1. [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) で AWS CodeBuild コンソールを開きます。

1. ビルドプロジェクトを作成します。詳細については、「[ビルドプロジェクトの作成 (コンソール)](create-project.md#create-project-console)」および「[ビルドの実行 (コンソール)](run-build-console.md)」を参照してください。

   **[プロジェクトタイプ]** で、**[ランナープロジェクト]** を選択します。
   +  **[ランナー]** で、次のようにします。
     + **[ランナープロバイダ]** で **[GitLab]** を選択します。
     +  **[認証情報]** で、次のいずれかを選択します。
       + **[デフォルトソース認証情報]** を選択します。デフォルト接続は、すべてのプロジェクトにデフォルトの GitLab 接続を適用します。
       + **[カスタムソース認証情報]** を選択します。カスタム接続は、アカウントのデフォルト設定を上書きするカスタム GitLab 接続を適用します。
**注記**  
プロバイダへの接続をまだ作成していない場合は、新しい GitLab 接続を作成する必要があります。手順については、「[CodeBuild を GitLab に接続](access-tokens-gitlab-overview.md#connections-gitlab)」を参照してください。
     + **[ランナーの場所]** で、**[リポジトリ]** を選択します。
     +  **[リポジトリ]** で、プロジェクトのパスと名前空間を指定して、GitLab 内のプロジェクトの名前を選択します。
   +  [**環境**] で以下の操作を行います。
     + サポートされている **[環境イメージ]** と **[コンピューティング]** を選択します。GitLab CI/CD パイプライン YAML のラベルを使用して、イメージとインスタンスの設定を上書きするオプションがあることに注意してください。詳細については、「[ステップ 2: リポジトリに .gitlab-ci.yml ファイルを作成](#sample-gitlab-runners-gitlab-ci)」を参照してください。
   +  [**Buildspec (Buildspec)**] で、次のようにします。
     + `buildspec-override:true` がラベルとして追加されない限り、buildspec は無視されることに注意してください。代わりに、CodeBuild は、セルフマネージド型ランナーを設定するコマンドを使用するように上書きします。

1. デフォルト値のまま続行し、**[ビルドプロジェクトを作成する]** を選択します。

1. `https://gitlab.com/user-name/repository-name/-/hooks` で GitLab コンソールを開き、ウェブフックが作成され、**[ワークフロージョブ]** イベントの配信が有効になっていることを確認します。

## ステップ 2: リポジトリに .gitlab-ci.yml ファイルを作成
<a name="sample-gitlab-runners-gitlab-ci"></a>

このステップでは、[https://gitlab.com/](https://gitlab.com/) で `.gitlab-ci.yml` ファイルを作成してビルド環境を設定し、CodeBuild で GitLab セルフマネージド型ランナーを使用します。詳細については、「[Use self-managed runners](https://docs.gitlab.com/runner/#use-self-managed-runners)」を参照してください。

### GitLab CI/CD パイプライン YAML を更新
<a name="sample-gitlab-runners-update-yaml.setup"></a>

「`https://gitlab.com/user-name/project-name/-/tree/branch-name`」に移動して、リポジトリで `.gitlab-ci.yml` ファイルを作成します。ビルド環境を設定するには、次のいずれかを実行します。
+ CodeBuild プロジェクト名を指定できます。その場合、ビルドはコンピューティング、イメージ、イメージバージョン、インスタンスサイズに既存のプロジェクト設定を使用します。GitLab ジョブの AWS関連の設定を特定の CodeBuild プロジェクトにリンクするには、プロジェクト名が必要です。YAML にプロジェクト名を含めることで、CodeBuild は正しいプロジェクト設定でジョブを呼び出すことができます。

  ```
  tags:
      - codebuild-<codebuild-project-name>-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
  ```

  `$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME` は、ビルドを特定のパイプラインジョブの実行にマッピングし、パイプラインの実行がキャンセルされたときにビルドを停止するために必要です。
**注記**  
*<project-name>* が、CodeBuild で作成したプロジェクトの名前と一致していることを確認してください。一致しない場合、CodeBuild はウェブフックを処理せず、GitLab CI/CD パイプラインがハングする可能性があります。

  GitLab CI/CD パイプライン YAML の例を次に示します。

  ```
  workflow:
    name: HelloWorld
  stages:          # List of stages for jobs, and their order of execution
    - build
  
  build-job:       # This job runs in the build stage, which runs first.
    stage: build
    script:
      - echo "Hello World!"
    tags:
      - codebuild-myProject-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
  ```
+ タグ内のイメージとコンピューティングタイプを上書きすることもできます。選別されたイメージのリストについては、「[CodeBuild がホストする GitLab ランナーでサポートされているコンピューティングイメージ](sample-gitlab-runners-gitlab-ci.images.md)」を参照してください。カスタムイメージの使用については、「[CodeBuild がホストする GitLab ランナーでサポートされているラベルの上書き](gitlab-runners-update-labels.md)」を参照してください。タグ内のコンピューティングタイプとイメージは、プロジェクトの環境設定を上書きします。Amazon EC2 コンピューティングビルドの環境設定を上書きするには、次の構文を使用します。

  ```
  tags:
      - codebuild-<codebuild-project-name>-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
      - image:<environment-type>-<image-identifier>
      - instance-size:<instance-size>
  ```

  GitLab CI/CD パイプライン YAML の例を次に示します。

  ```
  stages:
    - build
  
  build-job:
    stage: build
    script:
      - echo "Hello World!"
    tags:
      - codebuild-myProject-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
      - image:arm-3.0
      - instance-size:small
  ```
+ タグ内のビルドに使用するフリートを上書きできます。これにより、プロジェクトで設定されたフリート設定が上書きされ、指定されたフリートが使用されます。詳細については、「[リザーブドキャパシティキャパシティフリートでビルドを実行](fleets.md)」を参照してください。Amazon EC2 コンピューティングビルドのフリート設定を上書きするには、次の構文を使用します。

  ```
  tags:
      - codebuild-<codebuild-project-name>-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
      - fleet:<fleet-name>
  ```

  ビルドに使用されるフリートとイメージの両方を上書きするには、次の構文を使用します。

  ```
  tags:
      - codebuild-<codebuild-project-name>-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
      - fleet:<fleet-name>                    
      - image:<environment-type>-<image-identifier>
  ```

  GitLab CI/CD パイプライン YAML の例を次に示します。

  ```
  stages:
    - build
  
  build-job:
    stage: build
    script:
      - echo "Hello World!"
    tags:
      - codebuild-myProject-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
      - fleet:myFleet
      - image:arm-3.0
  ```
+ カスタムイメージで GitLab CI/CD パイプラインジョブを実行するには、CodeBuild プロジェクトでカスタムイメージを設定し、イメージ上書きラベルを指定しないようにします。CodeBuild は、イメージ上書きラベルが指定されていない場合、プロジェクトで設定されたイメージを使用します。

`.gitlab-ci.yml` に変更をコミットすると、GitLab パイプラインがトリガーされ、`build-job` からウェブフック通知が送信され、CodeBuild でのビルドが開始されます。

### INSTALL、PRE\$1BUILD、POST\$1BUILD フェーズで buildspec コマンドを実行
<a name="sample-gitlab-runners-update-yaml.buildspec"></a>

デフォルトでは、CodeBuild はセルフマネージド型 GitLab ビルドを実行するときに buildspec コマンドを無視します。ビルド中に buildspec コマンドを実行するには、サフィックスとして `buildspec-override:true` を `tags` に追加できます。

```
tags:
    - codebuild-<codebuild-project-name>-$CI_PROJECT_ID-$CI_PIPELINE_IID-$CI_JOB_NAME
    - buildspec-override:true
```

このコマンドを使用すると、CodeBuild はコンテナのプライマリソースフォルダに `gitlab-runner` というフォルダを作成します。GitLab ランナーが `BUILD` フェーズ中に起動すると、ランナーはその `gitlab-runner` ディレクトリで実行されます。

セルフマネージド型 GitLab ビルドで buildspec の上書きを使用する場合、いくつかの制限があります。
+ CodeBuild は、セルフマネージド型ランナーが `BUILD` フェーズで実行されるため、`BUILD` フェーズ中は buildspec コマンドを実行しません。
+ CodeBuild は、`DOWNLOAD_SOURCE` フェーズ中はプライマリソースもセカンダリソースもダウンロードしません。buildspec ファイルが設定されている場合、プロジェクトのプライマリソースからそのファイルのみがダウンロードされます。
+ ビルドコマンドが `PRE_BUILD` または `INSTALL` フェーズで失敗した場合、CodeBuild はセルフマネージド型ランナーを起動せず、GitLab CI/CD パイプラインジョブは手動でキャンセルする必要があります。
+ CodeBuild は、`DOWNLOAD_SOURCE` フェーズ中にランナートークンを取得します。有効期限は 1 時間です。`PRE_BUILD` または `INSTALL` フェーズが 1 時間を超えると、GitLab セルフマネージド型ランナーが起動する前にランナートークンの有効期限が切れる可能性があります。

## ステップ 3: 結果を確認
<a name="sample-gitlab-runners-verify"></a>

GitLab CI/CD パイプラインの実行が発生するたびに、CodeBuild はウェブフックを介して CI/CD パイプラインジョブイベントを受信します。CI/CD パイプライン内のジョブごとに、CodeBuild はビルドを開始して一時的な GitLab ランナーを実行します。ランナーには、単一の CI/CD パイプラインジョブを実行する役割があります。ジョブが完了すると、ランナーおよび関連付けられたビルドプロセスは即座に終了します。

CI/CD パイプラインジョブのログを表示するには、GitLab のリポジトリに移動し、**[ビルド]**、**[ジョブ]** の順に選択し、ログを確認する特定の **[ジョブ]** を選択します。

ジョブが CodeBuild のセルフマネージド型ランナーによって取得されるのを待っている間に、リクエストされたラベルをログで確認できます。

## GitLab ウェブフックイベントのフィルタリング (CloudFormation)
<a name="sample-gitlab-runners-webhooks-cfn"></a>

 CloudFormation テンプレートの次の YAML 形式の部分は、true と評価されたときにビルドをトリガーするフィルタグループを作成します。次のフィルタグループは、正規表現 `\[CI-CodeBuild\]` に一致する CI/CD パイプライン名を持つ GitLab CI/CD パイプラインジョブリクエストを指定します。

```
CodeBuildProject:
  Type: AWS::CodeBuild::Project
  Properties:
    Name: MyProject
    ServiceRole: service-role
    Artifacts:
      Type: NO_ARTIFACTS
    Environment:
      Type: LINUX_CONTAINER
      ComputeType: BUILD_GENERAL1_SMALL
      Image: aws/codebuild/standard:5.0
    Source:
      Type: GITLAB
      Location: CODEBUILD_DEFAULT_WEBHOOK_SOURCE_LOCATION
    Triggers:
      Webhook: true
      ScopeConfiguration:
        Name: group-name
        Scope: GITLAB_GROUP
      FilterGroups:
        - - Type: EVENT
            Pattern: WORKFLOW_JOB_QUEUED
          - Type: WORKFLOW_NAME
            Pattern: \[CI-CodeBuild\]
```