【Codex使用】GCP Cloud RunにPython Flask Hello WorldをGithub Actionsでデプロイするまで - 3

前回までの記事
エイヤで作ったCodexのgithub actionsのワークフローは流石に動かなかった。
https://qiita.com/yuichiro-kawabata-fg/items/c8b8374cba2dce6d0313

対応していきます。
まずは足りていなかった権限を追加

```ruby:github用アカウントに権限追加
gcloud projects add-iam-policy-binding %PROJECT_ID% ^
  --member="serviceAccount:github-actions-deployer@%PROJECT_ID%.iam.gserviceaccount.com" ^
  --role="roles/artifactregistry.writer"
  ```

それでもまだ以下のエラーが発生中

:::note alert
denied: Unauthenticated request. Unauthenticated requests do not have permission "artifactregistry.repositories.uploadArtifacts" on resource "projects/***/locations/us/repositories/gcr.io" (or it may not exist)
Error: Process completed with exit code 1.
:::

そもそもCloud run側に最初ソースをデプロイする箱は用意してある必要がありそう。
以下からソースをデプロイ

```ruby:ソースを一旦デプロイ
gcloud run deploy %PROJECT_SOURCE_NAME% \
  --source . \
  --region=asia-northeast1 \
  --platform=managed \
  --allow-unauthenticated
  ```

  デプロイは成功。だがテストは失敗する。
  （デプロイ後のサービスURLにアクセスできるかをテストしている）

:::note alert
  Error: Process completed with exit code 1.
:::

  Cloud RunのポータルからサービスURLを確認してアクセスしたところ以下のような画面になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4109347/dd49f0a6-0b71-4460-8743-add695834a0a.png)

  Github Actionsからデプロイしたコンテナの、「未認証呼び出しの許可」がオフ（デフォルト）になっていることで誰もアクセスできない状態になっていた。
  まずアクセス確認したいので、未認証でもアクセスできるように変更

  ```ruby:ソースを一旦デプロイ
gcloud run services add-iam-policy-binding %PROJECT_NAME% \
  --member="allUsers" \
  --role="roles/run.invoker" \
  --region=asia-northeast1

  ```
  
  Codexにてんこ盛りのYamlを要求したせいで、Readmeの更新などにも失敗したが冷静に考えて別に更新しなくてもいのでこの辺りを整形して最終のYamlを作る

```ruby:Yaml
name: Deploy to Cloud Run

on:
  push:
    branches:
      - main

jobs:
  build-test-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'

      - name: Install dependencies
        run: |
          pip install -r requirements.txt

      - name: Run tests
        run: |
          pytest

      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v1
        with:
          credentials_json: ${{ secrets.GCP_SA_KEY }}

      - name: Configure Docker for Artifact Registry
        run: gcloud auth configure-docker asia-northeast1-docker.pkg.dev --quiet

      - name: Build and push container
        run: |
          IMAGE="asia-northeast1-docker.pkg.dev/${{ secrets.GCP_PROJECT }}/cloud-run-source-deploy/${{ secrets.SERVICE_NAME }}:${{ github.sha }}"
          docker build -t "$IMAGE" .
          docker push "$IMAGE"
          echo "image=$IMAGE" >> $GITHUB_OUTPUT
        id: build

      - name: Deploy to Cloud Run
        id: deploy
        uses: google-github-actions/deploy-cloudrun@v2
        with:
          service: ${{ secrets.SERVICE_NAME }}
          image: ${{ steps.build.outputs.image }}
          region: ${{ secrets.GCP_REGION }}
          project_id: ${{ secrets.GCP_PROJECT }}

      - name: Test deployed service
        run: |
          curl -sSL -f ${{ steps.deploy.outputs.url }}

 ```

ワークフロー正常終了！:airplane:

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4109347/0369afa1-d0eb-4c1d-ac56-7b3998cc58e0.png)


概念しか知らない私が、ささっとサーバレスとCICDの構成を実装できてしまうなんで
なんてすごい時代でしょうか。
参考になれば幸いです。


ここまでにお世話になったmyGPT様

Codex用のプロンプト作成
https://chatgpt.com/g/g-68333a1b75b4819191ca31f50fdd039a-codex-prompt-forge
Google Cloud特化
https://chatgpt.com/g/g-kjqMRhgXP-google-cloud-guide