AWSとGitHubを組み合わせてCI環境を作成してみた

QAエンジニアとして、学習のためAWSとGitHubを組み合わせたCI環境の構築を実践してみました。本記事では、その手順を共有します。

## 1. GitHubリポジトリの準備

### ステップ 1: GitHubアカウントの作成
1. [GitHubの公式サイト](https://github.com/)にアクセスします。
2. 右上の「Sign up」をクリックします。
3. 必要な情報を入力してアカウントを作成します。

### ステップ 2: 新しいリポジトリの作成
1. GitHubにサインインします。
2. 右上の「+」アイコンをクリックし、「New repository」を選択します。
3. リポジトリ名を入力します（例: `ci-project`）。
4. リポジトリの説明を追加します（任意）。
5. 「Public」または「Private」を選択します。※今回は「Public」を指定しています。
   - **Public**: 誰でも見ることができる。
   - **Private**: 指定したユーザーのみがアクセスできる。
6. 「Initialize this repository with a README」にチェックを入れると、初期ファイルが作成されます（任意）。
7. 「Create repository」をクリックしてリポジトリを作成します。

### ステップ 3: リポジトリのクローン
1. 作成したリポジトリのページに移動します。
2. 「Code」ボタンをクリックし、HTTPSまたはSSHのURLをコピーします。
3. コマンドラインまたはターミナルを開き、次のコマンドを実行してリポジトリをクローンします：

    ```bash
    git clone https://github.com/username/ci-project.git
    ```

   （`username`をあなたのGitHubユーザー名に置き換えます。）

### ステップ 4: 必要なブランチの設定
1. クローンしたリポジトリのディレクトリに移動します：

    ```bash
    cd ci-project
    ```

2. 新しいブランチを作成します（例: `develop`）：

    ```bash
    git checkout -b develop
    ```

3. 新しいブランチをリモートリポジトリにプッシュします：

    ```bash
    git push -u origin develop
    ```

### ステップ 5: GitHubの準備完了
1. GitHubのリポジトリページに戻り、「Branches」タブをクリックします。
2. 作成した`develop`ブランチが表示されていることを確認します。

---

## 2. AWSアカウントの設定

AWSアカウントを作成し、CI/CDに必要な権限を持つユーザーを設定する手順については、以下のリンクを参照してください。

- [AWSアカウントの作成手順](https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-and-activate-aws-account/)
- [IAMユーザーの作成と権限の設定手順](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)

これらの手順に従って、AWSアカウントを設定してください。


## 3. AWS CodeBuildの設定

### S3バケットの作成
AWS CodeBuildのアーティファクトを保存するために、S3バケットを作成します。

#### ステップ 1: S3を開く
1. AWS Management Consoleにサインインします。
2. サービス一覧から「S3」を選択します。

#### ステップ 2: バケットの作成
1. 「Create bucket」をクリックします。
2. **バケット名**を入力します（例: `my-codebuild-artifacts`）。バケット名はユニークである必要があります。
3. **リージョン**を選択します。CodeBuildプロジェクトと同じリージョンを選ぶことをお勧めします。
4. オプションで、バケットの設定を調整します（例: パブリックアクセスのブロック、バージョニングなど）。
5. 「バケット作成」をクリックしてバケットを作成します。

### CodeBuildプロジェクトの作成

#### ステップ 1: CodeBuildを開く
1. AWS Management Consoleにサインインします。
2. サービス一覧から「CodeBuild」を検索して選択します。

#### ステップ 2: ビルドプロジェクトの作成
1. CodeBuildダッシュボードで「Create build project」をクリックします。

#### ステップ 3: プロジェクト設定
1. **プロジェクト名**を入力します（例: `ci-build-project`）。
2. **説明**を追加します（任意）。
3. **ソースプロバイダー**で「GitHub」を選択します。
4. GitHubアカウントへのアクセスを許可するため、最初に「Connect to GitHub」をクリックします。
5. GitHubにサインインし、AWS CodeBuildがリポジトリにアクセスできるように承認します。
6. 許可した後、リポジトリのリストが表示されるので、使用するリポジトリを選択します。

![スクリーンショット 2024-09-22 3.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/746b282b-bbd3-c810-7a70-fb8b2e21f67b.png)






#### ステップ 5: ビルド環境の設定
1. **環境イメージ**で「Managed image」を選択します。
2. **オペレーティングシステム**、**ランタイム**、**イメージのバージョン**を選択します。
   - 例: 
     - OS: `Amazon Linux`
     - Runtime: `Standard`
     - Image version: `aws/codebuild/amazonlinux2-x86_64-standard:5.0`（最新のバージョンを選択）

![スクリーンショット 2024-09-22 4.03.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/28db30bb-e259-cdb6-cfb6-f558844afc95.png)
3. **サービスロール**で「Create a new service role」を選択するか、既存のロールを選択します。
![スクリーンショット 2024-09-22 4.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/40aaeec3-5e2a-8515-e8cb-0d1deea4d657.png)



#### ステップ 6: ビルド仕様の設定
1. **Buildspec**の設定を行います。
   - **buildspecを選択します。
   - `buildspec.yml`をBuildspec名を入力します。


![スクリーンショット 2024-09-22 4.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/a7f05428-1813-d86d-2196-352e05e4da2c.png)


#### ステップ 7: アーティファクトの設定
1. アーティファクトの出力先を設定します。
   - アーティファクトの種類（例: `No artifacts`, `Amazon S3`など）を選択します。
   - S3を選択した場合、出力先のバケットを指定します。


![スクリーンショット 2024-09-22 4.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/7c08f9a9-21f7-a3db-4235-7a4bc1038025.png)

#### ステップ 8: CloudwatchとS3の設定
1. 「CloudWatch Logs」にチェックを入れる。
2. 「S3ログ」にチェックを入れる。
![スクリーンショット 2024-09-22 4.06.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/fe90ba78-a189-a580-217e-11357933fb76.png)

#### ステップ 9: 確認と作成
1. 「ビルドプロジェクトを作成する」をクリックします。

#### ステップ 10: プロジェクトの確認
1. 作成したプロジェクトがCodeBuildダッシュボードに表示されることを確認します。

---

## 4. AWS CodePipelineの設定

### CodePipelineの作成

#### ステップ 1: CodePipelineを開く
1. AWS Management Consoleにサインインします。
2. サービス一覧から「CodePipeline」を検索して選択します。

#### ステップ 2: パイプラインの作成
1. CodePipelineダッシュボードで「Create pipeline」をクリックします。

#### ステップ 3: パイプライン設定
1. **パイプライン名**を入力します（例: `ci-pipeline`）。
2. **サービスロール**を選択します。
   - 「新しいサービスロールを作成」を選択します。
3. **実行モード**を選択します。
   - 「キュー(パイプラインタイプV2が必須）」を選択します。
4. 「次に」をクリックします。

![スクリーンショット 2024-09-22 4.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/2383bda1-5c3c-eeeb-ea39-bee543049647.png)


#### ステップ 4: ソースステージの設定
1. **ソースプロバイダー**として「GitHub」を選択します。
2. GitHubアカウントへのアクセスを許可するため、「Connect to GitHub」をクリックします。
3. リポジトリの一覧から使用するリポジトリを選択します。
4. **ブランチ名**を指定します（例: `develop`）。
5. トリガータイプ「フィルターを指定」イベントタイプ「プッシュ」フィルタータイプ「ブランチ」、含める「develop」

![スクリーンショット 2024-09-22 4.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/b7caffaa-50d5-f89e-25de-c42227c6c5d0.png)


6. 「次に」をクリックします。

#### ステップ 5: ビルドステージの追加
1. **ビルドプロバイダー**として「AWS CodeBuild」を選択します。
2. 先ほど作成したCodeBuildプロジェクトを選択します。
3. 「次に」をクリックします。


![スクリーンショット 2024-09-22 4.20.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884092/adf49baf-00b7-82a9-bf36-3c68d1c07ca1.png)

今回はデプロイは考慮しないため。
デプロイステージは「導入段階をスキップ」にする。

#### ステップ 7: パイプラインの設定の確認
1. 「パイプラインを作成する」をクリックします。

#### ステップ 8: パイプラインの実行
1. パイプラインが作成されたら、「develop」をリポジトリにプッシュして、パイプラインが自動的にトリガーされることを確認します。
2. CodePipelineのダッシュボードで、各ステージが正しく実行されているか確認します。

---


## 5. テストの設定

AWS CodeBuildプロジェクトに自動テストを組み込むためには、`buildspec.yml`ファイルにテストフェーズを追加します。このファイルは、ビルドプロセス全体を管理する重要な設定ファイルです。

### テストフェーズの追加

以下は、テストを実行するための`buildspec.yml`です：

```yaml
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.x  # 使用するPythonのバージョンを指定します
    commands:
      - echo Installing dependencies...
      - pip install -r requirements.txt  # プロジェクトに必要な依存関係をインストールします

  pre_build:
    commands:
      - echo Running connectivity tests...  # テストを実行する準備をします

  build:
    commands:
      - python -m unittest discover tests/  # testsディレクトリ内の全テストを自動で実行します
      - echo Uploading duration to S3...  # S3にアップロードする準備をします
      - aws s3 cp test_duration.txt s3://cicd-kiki-bucket/test_duration.txt  # テスト結果ファイルを指定したS3バケットにアップロードします

  post_build:
    commands:
      - echo Tests completed  # テストが完了したことを表示します
```

### 各ファイルの説明

- **buildspec.yml**:
  - AWS CodeBuildの設定ファイルです。ビルドプロセス、テストの実行、アーティファクトの出力先などを定義します。

- **tests/**:
  - テストスクリプトを格納するディレクトリです。ここにテストを追加することで、CI/CDパイプライン内で自動的にテストを実行できます。

- **requirements.txt**:
  - プロジェクトに必要なPythonライブラリを定義するファイルです。`pip install -r requirements.txt`コマンドを使用して、ライブラリをインストールします。




---