個人的な備忘録：GitHub Actionsを使ったCI/CDの仕組みと基本設定からECRプッシュまでの流れ

## はじめに
最近、GitHub Actionsを使う練習をする中で、自分が少し忘れていることがあると感じたため、記事として体系的に整理してみることにしました。

:::note info
**今回の記事は技術的な新しい検証ではなく、過去に成功したコードを深く分析し、復習を目的とした内容になっています。**
:::

***この内容がどなたかの技術の支えになれば幸いです。***

## GitHub Actionsとは？
GitHub Actionsは、GitHub上でコードのビルド、テスト、デプロイなどのタスクを自動化できるCI/CDプラットフォームです。

![スクリーンショット 2024-10-25 12.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f48e04c0-122d-684d-3717-671fcf4e3bdd.png)
引用画像：https://blog.studysapuri.jp/entry/2024/07/09/101443

GitHubリポジトリにワークフローファイルを設定するだけで、プルリクエストやプッシュ時に指定されたアクションがトリガーされ、ワークフローが自動的に実行されます。

***これにより、手作業で行っていた一連の作業を自動化し、開発スピードと効率を大幅に向上させることができます。***

## そもそも、CI/CDとは？
CI（Continuous Integration） は、コードの変更をリポジトリに継続的に統合し、バグやエラーを早期に発見することを目的としたプロセスです。

![スクリーンショット 2024-10-25 12.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/84e67eb8-2c5b-dbd7-f3f9-5d505da89457.png)
引用画像：https://codezine.jp/article/detail/11083

CD（Continuous DeploymentまたはContinuous Delivery） は、CIでテストされたコードを自動的にデプロイするプロセスを指し、迅速かつ効率的なリリースを可能にします。

### 1. 継続的インテグレーション（CI）
GitHub Actionsを使うと、コードの変更に応じてテストやビルドを自動化できます。

- **コードのテスト**  
  - プルリクエストやコミット時に、自動でユニットテストや統合テストを実行します。

- **ビルドの自動化**  
  - アプリケーションをコンパイルし、動作可能な状態にします。

- **静的コード解析**  
  - コード品質やセキュリティチェックを自動で実行します。（例: ESLint、SonarQube）

---

### 2. 継続的デリバリー/デプロイ（CD）
CIの後に、アプリケーションのデプロイを自動化できます。

- **クラウド環境へのデプロイ**  
  - AWS、Azure、Google Cloud Platformなどのクラウド環境に自動でデプロイします。

- **コンテナのデプロイ**  
  - DockerイメージをECRやDocker Hubに自動でプッシュします。

- **サーバーへの直接デプロイ**  
  - SSHやFTPを使用して、サーバーにアプリケーションを展開します。

## 実際にコードを深掘りしてみた
ここでは、過去の記事で紹介した内容をより詳しく解説していきます。

https://qiita.com/free-honda/items/da83c5dd44650c883164#github-actions%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E8%A8%AD%E5%AE%9A

このYAMLファイルは、GitHub Actionsを使用して、GitHubリポジトリのコードをAWSのElastic Container Registry（ECR）に自動デプロイするためのワークフローを定義しています。

### 全体の構造
**1. ワークフロー名**

```.github/workflows/ecr-push.yml
name: Push to ECR
```

ワークフロー名を「Push to ECR」と定義しています。

**2. トリガー設定**

```.github/workflows/ecr-push.yml
on:
  push:
    branches:
      - main
```

`main`ブランチに変更がプッシュされると、このワークフローが自動的に実行されます。

**3. ジョブの定義**

```.github/workflows/ecr-push.yml
jobs:
  build-and-push:
    runs-on: ubuntu-latest
```

ジョブ名は `build-and-push`で、このジョブは `ubuntu-latest` 環境で実行されます。

### ジョブ内のステップ
**(1) リポジトリのクローン**

```.github/workflows/ecr-push.yml
- name: Checkout code
  uses: actions/checkout@v3
```

GitHubリポジトリのコードをクローン（チェックアウト）して、ローカル環境に取得します。

**(2) AWS CLIのセットアップ**

```.github/workflows/ecr-push.yml
- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v3
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ${{ secrets.AWS_REGION }}
```

***GitHub Secretsで管理されているAWS認証情報を使って、AWS CLIを設定します。*** ここでは、AWSリソース（ECR）にアクセスするための認証をしています。

**設定方法の詳細については、以下の記事をご参照ください：**

https://qiita.com/free-honda/items/da83c5dd44650c883164#github-secrets%E3%81%AE%E8%A8%AD%E5%AE%9A

**(3) Amazon ECRへのログイン**

```.github/workflows/ecr-push.yml
- name: Log in to Amazon ECR
  run: |
    aws ecr get-login-password --region ${{ secrets.AWS_REGION }} \
      | docker login --username AWS --password-stdin \
        $(aws sts get-caller-identity --query 'Account' --output text).dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com
```

AWS CLIを使用してECRにログインし、Dockerで必要な認証情報を取得して設定します。

**(4) Dockerイメージのビルド**

```.github/workflows/ecr-push.yml
- name: Build Docker image
  run: |
    docker build -t ${{ secrets.ECR_REPOSITORY }}:${{ secrets.IMAGE_TAG }} -f Dockerfile .
```

リポジトリ内の `Dockerfile` を使ってDockerイメージをビルドします。イメージ名やタグはGitHub Secretsで指定された値を使用します。

**(5) Dockerイメージのタグ付け**

```.github/workflows/ecr-push.yml
- name: Tag Docker image
  run: |
    docker tag ${{ secrets.ECR_REPOSITORY }}:${{ secrets.IMAGE_TAG }} \
    $(aws sts get-caller-identity --query 'Account' --output text).dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.ECR_REPOSITORY }}:${{ secrets.IMAGE_TAG }}
```

ビルドしたDockerイメージにECR用のタグを付けます。***このタグにはECRリポジトリのURLが含まれ、ECRで管理可能な形式となります。***

**(6) Dockerイメージのプッシュ**

```.github/workflows/ecr-push.yml
- name: Push Docker image to Amazon ECR
  run: |
    docker push \
    $(aws sts get-caller-identity --query 'Account' --output text).dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.ECR_REPOSITORY }}:${{ secrets.IMAGE_TAG }}
```

タグ付けされたDockerイメージをECRにプッシュします。***このステップにより、イメージがECRにアップロードされ、他のAWSリソースから使用可能となります。***

## 簡単なまとめ

### トリガー
- `main`ブランチへのプッシュ時にワークフローが実行されます。

### 主な処理
1. **AWS認証の設定**
2. **Dockerイメージのビルド**
3. **Dockerイメージのタグ付け**
4. **ECRへのプッシュ**

### 自動化のメリット
- コードの変更に応じて、最新のDockerイメージをECRにデプロイする作業を自動化。
- これにより、効率的かつ安全にサーバーレスアプリケーションの更新が可能になります。

## まとめ
ここまでお読みいただき、ありがとうございました。
今回、過去に使用したGitHub Actionsのコードを分析し、自分の理解を深める良い機会となりました。

:::note warn
**振り返りを通じて、非常に良い復習になったと感じています。**
:::

***今後はさらに積極的にGitHub Actionsを活用し、CI/CDの実現に向けてスキルを磨いていきたいと考えています。***

## 参考記事

https://qiita.com/s3i7h/items/b50ceb0008edc3c0312e

https://zenn.dev/kiwichan101kg/articles/2d6850ff72bc98