0
0

[CI CD] GithubActionでReactAppのCI CDを設定

Posted at

前提

本記事では、GitHub ActionsとAWSを組み合わせて、フロントエンドのCI/CDパイプラインを構築する方法について解説させて頂きます。フロントエンドのCI/CDとは、開発したコードの自動的なテストしたりビルドしたりリリースしたりするプロセスです。つまり、開発者がコードを変更した際に、それが自動的にテストされ、問題がなければ自動的にリリースされる仕組みです。

概要

Screenshot 2024-04-23 at 17.46.37.png

CI CD流れ
開発者はコード成果をアップロード→Github actionは lintやテストやビルドなどの再確認処理を自動的して→OKであればS3にアップロード。(つまりリリース)

以下に設定手順を詳しく説明させて頂きます。

1. S3バケット作成

AWSConsoleでS3サービスに入ってください。

1.1 S3バケット作成

  • バケットタイプはGeneral purposeです。
  • バケット名は任意ですが、唯一無二です。

Screenshot 2024-04-23 at 18.06.16.png

Screenshot 2024-04-23 at 18.06.21.png

公開アクセスのブロックをすべて解除
Screenshot 2024-04-23 at 18.06.36.png

残っているものをそのままにしてバケットを作成します。

1.2 静的ウェブサイトホスティング

作成したバケットに入ってPropertiesタブに入ってください

メモ:バケットARNがその後使用されます

Screenshot 2024-04-23 at 18.07.16.png
最下にスケロールして静的ウェブサイトホスティング設定が見えます。そして、「編集」を押します
Screenshot 2024-04-23 at 18.07.31.png
下の画像のように設定してください。

indexファイルとは、http://<公開url>へアクセスするとこちらファイルを表示します
errorファイルとは、何か問題が発生する時はこちらファイル表示します

Screenshot 2024-04-23 at 18.07.50.png

公開URLは赤枠で強調されています。

Screenshot 2024-04-25 at 6.57.47.png

テストためS3に以下のindex.htmlをアップロード

index.html
<h1> Hello world</h1>

バケット公開していないから、こちらリンクをアクセスしたら403Forbiddenエラーが出ます

Screenshot 2024-04-25 at 6.33.27.png

1.3 バケット公開

上記を解決ために「permision」タブに入って「Bucket policy」スケロールします
Screenshot 2024-04-25 at 6.37.02.png

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<貴方のS3 ARN>/*"
        }
    ]
}

設定した後に、バケットはpulicly accessible タグがあってS3に関する設定が完了します
Screenshot 2024-04-25 at 7.11.13.png

テスト:公開URLをアクセスすると以下の結果ができます
Screenshot 2024-04-25 at 7.12.59.png

2. IAMユーザー作成

IAMサービーに入ってユーザーグルプを作成します

2.1 ユーザーグループ作成

一旦ユーザーグルプ名を設定しておきます。パーミッションをその後設定してもいいです。
Screenshot 2024-04-25 at 7.19.28.png
私はgithub-action-user一旦作成して、詳細に入ってパーミッション設定しましょう。
Screenshot 2024-04-25 at 7.17.32.png
Screenshot 2024-04-25 at 10.37.25.png

簡単にデモをしたら、adminFullAccessを付与しても問題ないですが、実際では最小権限の規則として、必要な権限のみを付与します。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "githutaction",
			"Effect": "Allow",
			"Action": [
				"s3:PutObject",
				"s3:DeleteObject",
				"s3:ListBucket"
			],
			"Resource": [
				"arn:aws:s3:::<貴方のバケット名>",
				"arn:aws:s3:::<貴方のバケット名>/*"
			]
		}
	]
}

2.3 ユーザー作成・認証書ダウンロード

2.3.1 ユーザー作成

ユーザ画面に入って新しユーザーを作成しましょう
Screenshot 2024-04-25 at 7.35.02.png

こちらユーザはGithubActionに利用される意図で、AWSコンソルにアクセスするのは不要ですから、チェックを入れません。 (最小権利の規則)
Screenshot 2024-04-25 at 7.36.06.png
先ほど作ったユーザーグルプに配属させます。
Screenshot 2024-04-25 at 7.36.24.png

2.3.1 ユーザーの認証書ダウンロード

作成したユーザの詳細に入って「sercurity credentials」タブに選びます
Screenshot 2024-04-25 at 7.43.59.png

「Access keys」にスケロールして新しいアクセスキーを作成
Screenshot 2024-04-25 at 7.47.41.png

GithubActionに向けますから、サードパーティを選びます
Screenshot 2024-04-25 at 7.44.46.png

「Done」を押すと、「secret access key」が見えませんから。念の為、キーをダウンロードします
Screenshot 2024-04-25 at 7.45.21.png

3. リポジ設定

3.1コード作成

Reactを作成します

npx create-react-app github-action-ci-cd-iam-user

ci-cd.yamlファイルを作成 (パスは以下のようにします)
Screenshot 2024-04-25 at 8.16.47.png

ワークフロー作成

#ci-cd.yaml
name: CI CD
on:
  push: # プッシュするときこちらワークフォロー実施
    branches:
      - "main"
  pull_request: # プッシュするときこちらワークフォロー実施
    branches:
      - "main"
jobs:
  ci-cd:
    runs-on: ubuntu-latest # 実施環境はUbuntu
    environment: dev_env  # GithubUI上で設定した環境
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v4
      - name: Set up Node.js
        uses: actions/setup-node@v4 #Node環境設定
        with:
          node-version: 14
      - name: Install dependencies
        run: npm install #ライブライをダウンロード
      - name: Run unit test without prompt
        run: npm test -- --watchAll=false #Unit test 実施
     # .... eslintでコードを整理する処理を追加してもいいです。
      - name: Build React app 
        run: npm run build
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1 #IAMユーザーログインのような操作
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ vars.AWS_REGION }}
      - name: Remove all files
        run: aws s3 rm s3://${{ vars.AWS_S3_BUCKET }} --recursive
      - name: Upload build to s3
        run: aws s3 cp --recursive ./build s3://${{ vars.AWS_S3_BUCKET }}

3.2 環境変数を設定

Github上で「Settings」タブ→「Environment」に入って、「新環境」作成します

Screenshot 2024-04-25 at 12.09.38.png

dev_envを作成

上記のci-cd.yamlの environment: dev_env # GithubUI上で設定した環境と一緒です

Screenshot 2024-04-25 at 11.01.36.png

Screenshot 2024-04-25 at 11.04.28.png

AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEYは機密な情報ですから。secretsで保存します。これらは見られなくて更新だけです。

AWS_S3_BUCKETAWS_REGIONは機密な変数ではなく変数環境として作成して良いです。

3.3 テスト

ローカルでmainにコードをプッシュしてGithubActionUI上でログを検査できます
Screenshot 2024-04-25 at 12.18.21.png

S3に戻ってこちらリンクで結果を確認できます。

Screenshot 2024-04-25 at 12.20.49.png
こんな感じです
Screenshot 2024-04-25 at 12.21.52.png

最後

次の記事は同じテーマですが、IAMユーザを作成せずに、OIDCでGitHubActionにロールを付与する方向を共有させて頂きます。
最後まで読んで頂いて有り難うございます。:bow:
役に立つを感じしたらハートやコメントやを残ってください:bow:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0