Repository: reearth/reearth-cms
Pull request #1416: ci(deploy): update workload identity details to use PoLP
Author: login: franzramadhan
Labels: name: ci
Created: 2025-02-26T02:58:12Z | Merged: 2025-03-11T09:08:30Z

# Overview

## What I've done
- Update Workload Identity Provider and Service Account to use specific provider and SA per repository
- Put the provider and SA in repository variable instead of secret
- Refactor reusable workflow calling

## What I haven't done

## How I tested

## Screenshot

## Which point I want you to review particularly

## Memo


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **Chores**
  - Updated deployment workflows to enhance secure credential management.
  - Streamlined the configuration of deployment commands with revised secret inputs.
  - Optimized image variable usage to ensure accurate deployment processes.
  - Removed obsolete workflow for automated token updates.
  - Introduced a new function for processing versioned items in the GraphQL client API.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d86a61b868..bca5d15324 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -119,9 +119,9 @@ jobs:
     with:
       target: web
     secrets:
-      GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }}
-      GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
-      GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
+      GC_SA_EMAIL: ${{ secrets.GC_SA_EMAIL }}
+      GC_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
+      GC_PROJECT_ID: ${{ secrets.GC_PROJECT_ID }}
 
   deploy-server:
     needs: [build-server, ci-server]
@@ -130,9 +130,9 @@ jobs:
     with:
       target: server
     secrets:
-      GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }}
-      GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
-      GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
+      GC_SA_EMAIL: ${{ secrets.GC_SA_EMAIL }}
+      GC_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
+      GC_PROJECT_ID: ${{ secrets.GC_PROJECT_ID }}
 
   deploy-worker:
     needs: [build-worker, ci-worker]
@@ -141,6 +141,7 @@ jobs:
     with:
       target: worker
     secrets:
-      GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }}
-      GCP_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
-      GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
+      GC_SA_EMAIL: ${{ secrets.GC_SA_EMAIL }}
+      GC_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
+      GC_PROJECT_ID: ${{ secrets.GC_PROJECT_ID }}
+
diff --git a/.github/workflows/deploy_test.yml b/.github/workflows/deploy_test.yml
index f6f264457a..b3bdc3109f 100644
--- a/.github/workflows/deploy_test.yml
+++ b/.github/workflows/deploy_test.yml
@@ -15,32 +15,13 @@ on:
         default: 'all'
         description: 'Target to deploy'
     secrets:
-      GCP_PROJECT_ID:
+      GC_PROJECT_ID:
         required: true
-      GCP_SA_EMAIL:
+      GC_SA_EMAIL:
         required: true
-      GCP_WORKLOAD_IDENTITY_PROVIDER:
+      GC_WORKLOAD_IDENTITY_PROVIDER:
         required: true
 
-env:
-  # TODO: use environment variables
-  GCP_REGION: us-central1
-
-  # server
-  SERVER_IMAGE: reearth/reearth-cms:nightly
-  SERVER_IMAGE_NAME: us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/reearth/reearth-cms:nightly
-  SERVER_IMAGE_GCP: us-central1-docker.pkg.dev/reearth-oss/reearth/reearth-cms:nightly
-
-  # web
-  WEB_IMAGE:  reearth/reearth-cms-web:nightly
-  WEB_IMAGE_NAME: us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/reearth/reearth-cms-web:nightly
-  WEB_IMAGE_GCP: us-central1-docker.pkg.dev/reearth-oss/reearth/reearth-cms-web:nightly
-
-  # worker
-  WORKER_IMAGE:  reearth/reearth-cms-worker:nightly
-  WORKER_IMAGE_NAME: us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/reearth/reearth-cms-worker:nightly
-  WORKER_IMAGE_GCP: us-central1-docker.pkg.dev/reearth-oss/reearth/reearth-cms-worker:nightly
-
 jobs:
   deploy_server:
     runs-on: ubuntu-latest
@@ -52,22 +33,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $SERVER_IMAGE
-          docker tag $SERVER_IMAGE $SERVER_IMAGE_GCP
-          docker push $SERVER_IMAGE_GCP
+          docker pull ${{ secrets.SERVER_IMAGE }}
+          docker tag ${{ secrets.SERVER_IMAGE }} ${{ secrets.SERVER_IMAGE_GC }}
+          docker push ${{ secrets.SERVER_IMAGE_GC }}
       - name: Deploy to Cloud Run
         run: |
           gcloud run deploy reearth-cms-backend \
-            --image $SERVER_IMAGE_GCP \
-            --region $GCP_REGION \
+            --image ${{ secrets.SERVER_IMAGE_GC }} \
+            --region ${{ secrets.GC_REGION }} \
             --platform managed \
             --quiet
 
@@ -81,22 +62,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WEB_IMAGE
-          docker tag $WEB_IMAGE $WEB_IMAGE_GCP
-          docker push $WEB_IMAGE_GCP
+          docker pull ${{ secrets.WEB_IMAGE }}
+          docker tag ${{ secrets.WEB_IMAGE }} ${{ secrets.WEB_IMAGE_GC }}
+          docker push ${{ secrets.WEB_IMAGE_GC }}
       - name: Deploy to Cloud Run
         run: |
           gcloud run deploy reearth-cms-web \
-            --image $WEB_IMAGE_GCP \
-            --region $GCP_REGION \
+            --image ${{ secrets.WEB_IMAGE_GC }} \
+            --region ${{ secrets.GC_REGION }} \
             --platform managed \
             --quiet
 
@@ -110,21 +91,21 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WORKER_IMAGE
-          docker tag $WORKER_IMAGE $WORKER_IMAGE_GCP
-          docker push $WORKER_IMAGE_GCP
+          docker pull ${{ secrets.WORKER_IMAGE }}
+          docker tag ${{ secrets.WORKER_IMAGE }} ${{ secrets.WORKER_IMAGE_GC }}
+          docker push ${{ secrets.WORKER_IMAGE_GC }}
       - name: Deploy to Cloud Run
         run: |
           gcloud run deploy reearth-cms-worker \
-            --image $WORKER_IMAGE_GCP \
-            --region $GCP_REGION \
+            --image ${{ secrets.WORKER_IMAGE_GC }} \
+            --region ${{ secrets.GC_REGION }} \
             --platform managed \
             --quiet


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (3)</summary><blockquote>

<details>
<summary>.github/workflows/deploy_test.yml (3)</summary><blockquote>

`35-39`: **Refactor Docker Image Promotion (Server)**

In the `docker push` step for the server deployment, the commands now pull the image using `${{ secrets.SERVER_IMAGE }}`, tag it to `${{ secrets.SERVER_IMAGE_GCP }}`, and then push the tagged image. This approach correctly promotes the image to the GCP registry. Consider adding error handling or logging if a command fails, although the current implementation meets our typical use case.

---

`65-69`: **Refactor Docker Image Promotion (Web)**

The `docker push` commands in the web deployment job have been updated to pull, tag, and push the image using the new secret variables `${{ secrets.WEB_IMAGE }}` and `${{ secrets.WEB_IMAGE_GCP }}`. The process is clear and consistent. As with the server job, consider adding error handling as an enhancement in the future.

---

`93-97`: **Refactor Docker Image Promotion (Worker)**

In the worker deployment job, the `docker push` step now pulls, tags, and pushes the image using `${{ secrets.WORKER_IMAGE }}` and `${{ secrets.WORKER_IMAGE_GCP }}`. The changes are consistent with the other jobs. Consider adding logging details to capture errors during the image promotion process to support future troubleshooting.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b90b709c40cc4ca1c932cef6d3d23df492b3593f and 1755d0079eb714ac67b562d21e7b582f15a7299f.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `.github/workflows/cron_ion_token_test.yml` (1 hunks)
* `.github/workflows/deploy_test.yml` (3 hunks)

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (6)</summary>

* GitHub Check: Redirect rules - reearth-cms
* GitHub Check: Header rules - reearth-cms
* GitHub Check: Pages changed - reearth-cms
* GitHub Check: ci-server / lint
* GitHub Check: ci-server / test
* GitHub Check: ci-web / ci

</details>

<details>
<summary>🔇 Additional comments (7)</summary><blockquote>

<details>
<summary>.github/workflows/cron_ion_token_test.yml (1)</summary>

`18-21`: **Update Workload Identity Provider Reference**

The updated secret reference now uses `GC_WORKLOAD_IDENTITY_PROVIDER` instead of the previous `GCP_WORKLOAD_IDENTITY_PROVIDER`, which aligns with the new naming conventions across our workflows. Please ensure that this change is also reflected in the repository’s secret configurations and documentation.

</details>
<details>
<summary>.github/workflows/deploy_test.yml (6)</summary>

`27-30`: **Update Credentials for Server Deployment**

The authentication step for the `deploy_server` job now uses the new secret variables `GC_SA_EMAIL` and `GC_WORKLOAD_IDENTITY_PROVIDER`. This change is consistent with the updated naming convention. Please verify that the repository settings have been updated accordingly.

---

`41-46`: **Deploy to Cloud Run with Updated Image and Region**

The `Deploy to Cloud Run` step references the new secret `${{ secrets.SERVER_IMAGE_GCP }}` for the image and `${{ secrets.GC_REGION }}` for the region. This update is well aligned with the new configuration. Make sure that all associated Cloud Run settings are updated to match these changes.

---

`57-60`: **Update Credentials for Web Deployment**

The authentication step for the `deploy_web` job also now uses `GC_SA_EMAIL` and `GC_WORKLOAD_IDENTITY_PROVIDER` as expected. This update is consistent with our new naming conventions.

---

`70-75`: **Deploy Web Service to Cloud Run**

The deployment command for the web service correctly uses the updated `${{ secrets.WEB_IMAGE_GCP }}` and `${{ secrets.GC_REGION }}`. This ensures consistency with the new configuration. Confirm that any dependent configuration or service monitoring reflects these changes.

---

`87-88`: **Update Credentials for Worker Deployment**

The authentication block for the `deploy_worker` job is updated to use `GC_SA_EMAIL` and `GC_WORKLOAD_IDENTITY_PROVIDER`. This matches the updated pattern and should be verified against the repository secrets.

---

`98-105`: **Deploy Worker Service to Cloud Run**

The Cloud Run deployment for the worker service correctly references the new image secret `${{ secrets.WORKER_IMAGE_GCP }}` and the region secret `${{ secrets.GC_REGION }}`. This ensures that the job uses the updated configuration for deployment.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-28T07:18:32Z
user: login: joshuagibeonm
body: This PR doing too much things. Do it on 2 separated PR, take out secrets and variable to GH secrets and variable. And update workload identity.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T02:14:06Z
user: login: franzramadhan
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T02:29:40Z
user: login: franzramadhan
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T02:38:17Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>.github/workflows/deploy_test.yml (1)</summary><blockquote>

`1-105`: **General Observation on Updated Deployment Configurations**  
Across all deployment jobs (server, web, worker), the workflow now consistently uses the new secret variables (`GC_SA_EMAIL`, `GC_WORKLOAD_IDENTITY_PROVIDER`, and `GC_REGION`) as well as updated image variables. One point for verification: the PR objectives mentioned moving these details from secrets to repository variables. Please confirm that the usage of secrets here is intentional and that the repository settings reflect the appropriate configuration.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 82391dbbdfce2d563d3cb276e19eb0bda50ed0e0 and 88f95b9b8edc213e95820bb3e67b431f10f7bb78.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `.github/workflows/ci.yml` (1 hunks)
* `.github/workflows/deploy_test.yml` (3 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* .github/workflows/ci.yml

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: ci-server / test
* GitHub Check: ci-server / lint
* GitHub Check: ci-web / ci

</details>

<details>
<summary>🔇 Additional comments (9)</summary><blockquote>

<details>
<summary>.github/workflows/deploy_test.yml (9)</summary>

`29-30`: **Update Workload Identity Credentials for Server Deployment**  
The configuration now uses the new secret variables (`GC_SA_EMAIL` and `GC_WORKLOAD_IDENTITY_PROVIDER`). This aligns with the updated credentials for a repository-specific deployment. Please verify that these secret values are correctly configured in the repository settings.

---

`37-39`: **Updated Docker Commands for Server Image Handling**  
The docker commands now pull, tag, and push the server image using the new secret variables (`SERVER_IMAGE` and `SERVER_IMAGE_GC`). This change improves consistency with the new deployment configuration.

---

`43-44`: **Deployment Command Update for Server Region**  
The deployment step now correctly injects the `GC_REGION` variable into the Cloud Run command. This update maintains consistency with the new secret configuration for deployment regions.

---

`58-59`: **Consistent Authentication Setup for Web Deployment**  
The web deployment now references `GC_SA_EMAIL` and `GC_WORKLOAD_IDENTITY_PROVIDER` in its authentication step. This mirrors the server configuration, ensuring that the new credentials are used uniformly across deployments.

---

`66-68`: **Updated Docker Image Handling for Web Deployment**  
The docker commands in the web job now pull, tag, and push images using the new secret variables (`WEB_IMAGE` and `WEB_IMAGE_GC`). Ensure that these secrets are correctly defined so that the workflow runs smoothly.

---

`72-73`: **Deployment Command Update for Web Region**  
The `--region` flag now pulls its value from `GC_REGION`, ensuring alignment with the updated configuration. This update is consistent with the changes applied in the server job.

---

`87-88`: **Worker Deployment Authentication Update**  
The worker job now uses the new secret variables (`GC_SA_EMAIL` and `GC_WORKLOAD_IDENTITY_PROVIDER`) for authentication. This change ensures that the worker service aligns with the updated workload identity configuration.

---

`95-97`: **Updated Docker Commands for Worker Image Handling**  
The worker deployment’s docker commands now use the updated secret variables (`WORKER_IMAGE` and `WORKER_IMAGE_GC`) to pull, tag, and push images. This change supports consistency across all deployment jobs.

---

`101-102`: **Worker Deployment Command Region Update**  
The deployment command for the worker service now correctly references the `GC_REGION` variable. This ensures that the application is deployed to the correct region as per the revised configurations.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-07T06:30:24Z
user: login: coderabbitai[bot]
body: > [!CAUTION]
> Inline review comments failed to post. This is likely due to GitHub's limits when posting large numbers of comments.  If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

**Actionable comments posted: 2**

<details>
<summary>🔭 Outside diff range comments (2)</summary><blockquote>

<details>
<summary>.github/workflows/ci.yml (1)</summary><blockquote>

`115-128`: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Missing secrets for deploy-web and deploy-server jobs**

The `deploy-web` and `deploy-server` jobs don't have the `GC_` prefixed secrets like the `deploy-worker` job. If the intention is to update workload identity for all repositories, these jobs should also include the same secrets configuration.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if deploy_test.yml expects these secrets for all targets
grep -A 20 "secrets:" .github/workflows/deploy_test.yml
```

Length of output: 779

---



</details>

**Action Required: Update deploy-server job with missing secrets**

Based on the output from the `grep` command, the deployment workflow `deploy_test.yml` expects the following required secrets:
- `GC_PROJECT_ID`
- `GC_SA_EMAIL`
- `GC_WORKLOAD_IDENTITY_PROVIDER`

While the `deploy-web` job correctly passes these secrets, the `deploy-server` job is missing this configuration. Please update the `deploy-server` job (located in `.github/workflows/ci.yml`, lines 115-128) to include the same secrets as follows:

```yaml
  deploy-server:
    needs: [build-server, ci-server]
    if: needs.ci-server.result == 'success'
    uses: ./.github/workflows/deploy_test.yml
    with:
      target: server
    secrets:
      GC_SA_EMAIL: ${{ secrets.GC_SA_EMAIL }}
      GC_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
      GC_PROJECT_ID: ${{ secrets.GC_PROJECT_ID }}
```

This ensures consistent configuration across all deployment jobs.

</blockquote></details>
<details>
<summary>.github/workflows/deploy_test.yml (1)</summary><blockquote>

`48-54`: _⚠️ Potential issue_

**Remove duplicate deployment blocks using old secrets**

There are duplicate deployment blocks that still use the old secrets approach. These appear to be leftover from the previous implementation and should be removed to avoid confusion and potential errors.

Remove these duplicate deployment blocks as they're redundant with the updated versions above and will cause the workflow to fail.


Also applies to: 77-82, 105-111

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 actionlint (1.7.4)</summary>

48-48: property "server_image_gc" is not defined in object type {actions_runner_debug: string; actions_step_debug: string; gc_project_id: string; gc_sa_email: string; gc_workload_identity_provider: string; github_token: string}

(expression)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (12)</summary><blockquote>

<details>
<summary>web/src/i18n/translations/ja.yml (1)</summary><blockquote>

`1-599`: **Japanese translations look well-structured**

The addition of Japanese translations enhances the internationalization support for the application. The translations cover a comprehensive set of UI elements including actions, settings, messages, and errors.


There appears to be a line ending issue detected by static analysis. Consider standardizing line endings in YAML files to ensure consistent behavior across different environments.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 YAMLlint (1.35.1)</summary>

[error] 1-1: wrong new line character: expected \n

(new-lines)

</details>

</details>

</blockquote></details>
<details>
<summary>web/src/components/molecules/Content/Form/fields/FieldComponents/GeometryField.tsx (1)</summary><blockquote>

`39-54`: **Consider using StyledFormItem for consistency**

Unlike the other field components, this one still uses the regular `Form.Item` instead of a styled version. Consider using `StyledFormItem` for consistency with the other field components, especially if you need to maintain the same visual appearance for disabled states.

</blockquote></details>
<details>
<summary>web/e2e/project/item/fields/text.spec.ts (1)</summary><blockquote>

`91-92`: **Selector change improves test resilience**

Changing from label-based selectors to role-based selectors (`getByRole("textbox")`) aligns better with accessibility best practices and makes tests more resilient to UI text changes. However, using positional selectors (first/last) may make tests brittle if the order of elements changes.

Consider adding data-testid attributes to these input fields for more reliable selection:

```diff
-await expect(page.getByRole("textbox").first()).toHaveValue("text2");
-await expect(page.getByRole("textbox").last()).toHaveValue("text1");
+await expect(page.getByTestId("textbox-first")).toHaveValue("text2");
+await expect(page.getByTestId("textbox-second")).toHaveValue("text1");
```

</blockquote></details>
<details>
<summary>web/e2e/project/content/version.spec.ts (1)</summary><blockquote>

`14-21`: **Improve error handling in the color conversion function**

The `getRgb` function uses optional chaining with `?.map()` but doesn't handle the case where the match might return null, which could lead to unexpected test failures if an invalid color code is provided.


Consider adding a fallback for the null case:

```diff
function getRgb(colorCode: string) {
  return `rgb(${String(
    colorCode
      .slice(1)
      .match(/.{2}/g)
-     ?.map(hex => parseInt(hex, 16)),
+     ?.map(hex => parseInt(hex, 16)) || [0, 0, 0],
  ).replaceAll(",", ", ")})`;
}
```

</blockquote></details>
<details>
<summary>web/src/components/molecules/Content/Form/FieldWrapper.tsx (1)</summary><blockquote>

`33-37`: **Consider adding a constant for field types that require full width.**

The condition for determining `isFullWidth` contains multiple field types. Consider extracting these types to a constant array for better maintainability.

```diff
+const FULL_WIDTH_FIELD_TYPES = ["Group", "GeometryObject", "GeometryEditor"];
+
 const FieldWrapper: React.FC<Props> = ({
   field,
   disabled,
   itemHeights,
   onItemHeightChange,
   assetProps,
   referenceProps,
   groupProps,
 }) => {
   const isFullWidth = useMemo(
-    () =>
-      field.type === "Group" || field.type === "GeometryObject" || field.type === "GeometryEditor",
+    () => FULL_WIDTH_FIELD_TYPES.includes(field.type),
     [field.type],
   );
```

</blockquote></details>
<details>
<summary>web/src/components/molecules/Content/Form/Metadata.tsx (1)</summary><blockquote>

`59-73`: **Consider handling empty fields array more explicitly.**

While the code correctly checks if `fields.length > 0`, it might be worth considering what happens if `fields` is undefined. Adding a default empty array to the destructuring could provide additional safety.

```diff
-const Metadata: React.FC<Props> = ({ item, fields, disabled }) => {
+const Metadata: React.FC<Props> = ({ item, fields = [], disabled }) => {
```

</blockquote></details>
<details>
<summary>.github/workflows/cron_ion_token_test.yml (1)</summary><blockquote>

`39-42`: **Updating the Secret Manager**

The step that updates the Secret Manager now uses the extracted token and pipes it into the `gcloud secrets versions add` command. This implementation is clear. While it works fine, consider checking the output of the `gcloud` command to catch any errors during the secret update process.

</blockquote></details>
<details>
<summary>.github/workflows/deploy_test.yml (2)</summary><blockquote>

`37-39`: **Inconsistent image naming convention between references and tags**

The naming convention varies between the source images and their GCP-tagged versions. The source uses `IMAGE` while the destination uses `IMAGE_GCP`. Consider standardizing on either `GC` or `GCP` suffix for consistency.

```diff
-docker tag ${{ vars.SERVER_IMAGE }} ${{ vars.SERVER_IMAGE_GCP }}
-docker push ${{ vars.SERVER_IMAGE_GCP }}
+docker tag ${{ vars.SERVER_IMAGE }} ${{ vars.SERVER_IMAGE_GC }}
+docker push ${{ vars.SERVER_IMAGE_GC }}
```

Similar changes should be applied to the WEB_IMAGE and WORKER_IMAGE blocks.


Also applies to: 66-68, 95-97

---

`43-44`: **Inconsistent image references in deployment commands**

The deployment commands reference `IMAGE_GCP` variables, but should match the tagged image names used in previous steps. Ensure consistency between the tagging and deployment steps.

```diff
-  --image ${{ vars.SERVER_IMAGE_GCP }} \
+  --image ${{ vars.SERVER_IMAGE_GC }} \
```

Similar changes should be applied to the WEB_IMAGE_GCP and WORKER_IMAGE_GCP references.


Also applies to: 72-73, 101-102

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 actionlint (1.7.4)</summary>

43-43: property "server_image" is not defined in object type {actions_runner_debug: string; actions_step_debug: string; gc_project_id: string; gc_sa_email: string; gc_workload_identity_provider: string; github_token: string}

(expression)

</details>

</details>

</blockquote></details>
<details>
<summary>web/src/components/organisms/Project/Content/hooks.ts (1)</summary><blockquote>

`97-99`: **Be mindful of potential overhead when refetching multiple queries.**  
Repeating "SearchItem", "GetItem", and "VersionsByItem" could redundantly refresh data. Verify whether all three queries are really necessary after publishing.

</blockquote></details>
<details>
<summary>web/src/components/organisms/Project/Request/RequestDetails/hooks.ts (2)</summary><blockquote>

`131-144`: **Consider navigating/reloading after successful request deletion.**  
Currently, there’s no redirect or UI update for the user once requests are deleted. This might create confusion if items stay visible and require manual refresh.

---

`149-161`: **Add user feedback or navigation after approving requests.**  
Upon approval, you might want to provide visual confirmation or refresh relevant data. The current approach only displays a success notification.

</blockquote></details>

</blockquote></details>

<details>
<summary>🛑 Comments failed to post (2)</summary><blockquote>

<details>
<summary>.github/workflows/ci.yml (1)</summary><blockquote>

129-135: _⚠️ Potential issue_

**Critical issue: Duplicate deploy-worker job**

There are two `deploy-worker` jobs defined in this workflow file. The second one (lines 137-147) appears to be the correct version with the updated secrets, but the first one (lines 129-135) needs to be removed to prevent workflow failures.


```diff
-  deploy-worker:
-    needs: [build-worker, ci-worker]
-    if: needs.ci-worker.result == 'success'
-    uses: ./.github/workflows/deploy_test.yml
-    with:
-      target: worker
-

```


Also applies to: 137-147

</blockquote></details>
<details>
<summary>.github/workflows/cron_ion_token_test.yml (1)</summary><blockquote>

21-38: _🛠️ Refactor suggestion_

**Cesium Ion Token Retrieval and Extraction**

The token retrieval step uses a combination of `curl` and a Node.js one-liner to extract the default Cesium Ion access token. While the approach works, consider the following improvements for robustness:
- **Error Handling:** If the token isn’t found, the script currently prints `"Token not found"` and continues. It might be better to error out (exit with a non-zero status) so that the workflow fails fast.
- **Inline Script Stability:** Adding error-checking within the Node.js script helps ensure that if the format of the remote file changes or if the token isn’t extracted properly, the failure is caught early.

Here’s a suggested diff to enhance error handling:
```diff
-          ION_TOKEN=$( \
-          curl -s https://raw.githubusercontent.com/CesiumGS/cesium/main/packages/engine/Source/Core/Ion.js | \
-          node -e " \
-            process.stdin.resume(); \
-            process.stdin.setEncoding('utf8'); \
-            let data = ''; \
-            process.stdin.on('data', chunk => { data += chunk; }); \
-            process.stdin.on('end', () => { \
-              const defaultAccessTokenRegex = /const defaultAccessToken =(\n| ).*\"(.*)\";/; \
-              const match = data.match(defaultAccessTokenRegex); \
-              console.log(match ? match[2] : 'Token not found'); \
-            }); \
-          " \
-          )
+          ION_TOKEN=$( \
+          curl -s https://raw.githubusercontent.com/CesiumGS/cesium/main/packages/engine/Source/Core/Ion.js | \
+          node -e " \
+            process.stdin.resume(); \
+            process.stdin.setEncoding('utf8'); \
+            let data = ''; \
+            process.stdin.on('data', chunk => { data += chunk; }); \
+            process.stdin.on('end', () => { \
+              const defaultAccessTokenRegex = /const defaultAccessToken =(\n| ).*\"(.*)\";/; \
+              const match = data.match(defaultAccessTokenRegex); \
+              if (match) { console.log(match[2]); } else { console.error('Token not found'); process.exit(1); } \
+            }); \
+          " \
+          )
```
This change will cause the Node.js script to exit with an error if a token isn’t found, allowing the workflow to catch the issue immediately.  



<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
          ION_TOKEN=$( \
          curl -s https://raw.githubusercontent.com/CesiumGS/cesium/main/packages/engine/Source/Core/Ion.js | \
          node -e " \
            process.stdin.resume(); \
            process.stdin.setEncoding('utf8'); \
            let data = ''; \
            process.stdin.on('data', chunk => { data += chunk; }); \
            process.stdin.on('end', () => { \
              const defaultAccessTokenRegex = /const defaultAccessToken =(\n| ).*\"(.*)\";/; \
              const match = data.match(defaultAccessTokenRegex); \
              if (match) { console.log(match[2]); } else { console.error('Token not found'); process.exit(1); } \
            }); \
          " \
          )
`````

</details>

<!-- suggestion_end -->

</blockquote></details>

</blockquote></details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T08:13:15Z

Review comments:
diff_hunk: @@ -17,7 +17,7 @@ jobs:
       - uses: google-github-actions/auth@v2
         with:
           service_account: ${{ secrets.GCP_SA_EMAIL }}
path: .github/workflows/cron_ion_token_test.yml
user: login: joshuagibeonm
body: ```suggestion
          service_account: ${{ secrets.GC_SA_EMAIL }}
```

Use GCP instead of GC
created_at: 2025-03-03T02:09:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -52,22 +26,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $SERVER_IMAGE
-          docker tag $SERVER_IMAGE $SERVER_IMAGE_GCP
-          docker push $SERVER_IMAGE_GCP
+          docker pull ${{ secrets.SERVER_IMAGE }}
+          docker tag ${{ secrets.SERVER_IMAGE }} ${{ secrets.SERVER_IMAGE_GCP }}
+          docker push ${{ secrets.SERVER_IMAGE_GCP }}
       - name: Deploy to Cloud Run
         run: |
           gcloud run deploy reearth-cms-backend \
-            --image $SERVER_IMAGE_GCP \
-            --region $GCP_REGION \
+            --image ${{ secrets.SERVER_IMAGE_GCP }} \
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
            --image ${{ secrets.SERVER_IMAGE_GC }} \
```
created_at: 2025-03-03T02:09:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,22 +55,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WEB_IMAGE
-          docker tag $WEB_IMAGE $WEB_IMAGE_GCP
-          docker push $WEB_IMAGE_GCP
+          docker pull ${{ secrets.WEB_IMAGE }}
+          docker tag ${{ secrets.WEB_IMAGE }} ${{ secrets.WEB_IMAGE_GCP }}
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
          docker tag ${{ secrets.WEB_IMAGE }} ${{ secrets.WEB_IMAGE_GC }}
```
created_at: 2025-03-03T02:09:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,22 +55,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WEB_IMAGE
-          docker tag $WEB_IMAGE $WEB_IMAGE_GCP
-          docker push $WEB_IMAGE_GCP
+          docker pull ${{ secrets.WEB_IMAGE }}
+          docker tag ${{ secrets.WEB_IMAGE }} ${{ secrets.WEB_IMAGE_GCP }}
+          docker push ${{ secrets.WEB_IMAGE_GCP }}
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
          docker push ${{ secrets.WEB_IMAGE_GC }}
```
created_at: 2025-03-03T02:10:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,22 +55,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WEB_IMAGE
-          docker tag $WEB_IMAGE $WEB_IMAGE_GCP
-          docker push $WEB_IMAGE_GCP
+          docker pull ${{ secrets.WEB_IMAGE }}
+          docker tag ${{ secrets.WEB_IMAGE }} ${{ secrets.WEB_IMAGE_GCP }}
+          docker push ${{ secrets.WEB_IMAGE_GCP }}
       - name: Deploy to Cloud Run
         run: |
           gcloud run deploy reearth-cms-web \
-            --image $WEB_IMAGE_GCP \
-            --region $GCP_REGION \
+            --image ${{ secrets.WEB_IMAGE_GCP }} \
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
            --image ${{ secrets.WEB_IMAGE_GC }} \
```
created_at: 2025-03-03T02:10:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -110,21 +84,21 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WORKER_IMAGE
-          docker tag $WORKER_IMAGE $WORKER_IMAGE_GCP
-          docker push $WORKER_IMAGE_GCP
+          docker pull ${{ secrets.WORKER_IMAGE }}
+          docker tag ${{ secrets.WORKER_IMAGE }} ${{ secrets.WORKER_IMAGE_GCP }}
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
          docker tag ${{ secrets.WORKER_IMAGE }} ${{ secrets.WORKER_IMAGE_GC }}
```
created_at: 2025-03-03T02:10:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -110,21 +84,21 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WORKER_IMAGE
-          docker tag $WORKER_IMAGE $WORKER_IMAGE_GCP
-          docker push $WORKER_IMAGE_GCP
+          docker pull ${{ secrets.WORKER_IMAGE }}
+          docker tag ${{ secrets.WORKER_IMAGE }} ${{ secrets.WORKER_IMAGE_GCP }}
+          docker push ${{ secrets.WORKER_IMAGE_GCP }}
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
          docker push ${{ secrets.WORKER_IMAGE_GC }}
```
created_at: 2025-03-03T02:10:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -110,21 +84,21 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $WORKER_IMAGE
-          docker tag $WORKER_IMAGE $WORKER_IMAGE_GCP
-          docker push $WORKER_IMAGE_GCP
+          docker pull ${{ secrets.WORKER_IMAGE }}
+          docker tag ${{ secrets.WORKER_IMAGE }} ${{ secrets.WORKER_IMAGE_GCP }}
+          docker push ${{ secrets.WORKER_IMAGE_GCP }}
       - name: Deploy to Cloud Run
         run: |
           gcloud run deploy reearth-cms-worker \
-            --image $WORKER_IMAGE_GCP \
-            --region $GCP_REGION \
+            --image ${{ secrets.WORKER_IMAGE_GCP }} \
path: .github/workflows/deploy_test.yml
user: login: joshuagibeonm
body: ```suggestion
            --image ${{ secrets.WORKER_IMAGE_GC }} \
```
created_at: 2025-03-03T02:10:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -17,7 +17,7 @@ jobs:
       - uses: google-github-actions/auth@v2
         with:
           service_account: ${{ secrets.GCP_SA_EMAIL }}
path: .github/workflows/cron_ion_token_test.yml
user: login: franzramadhan
body: removed this file since it's covered in reearth-cloud instead - https://github.com/eukarya-inc/reearth-cloud/blob/main/.github/workflows/cron_cesium_ion_token_oss.yml
created_at: 2025-03-03T02:29:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -52,22 +26,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $SERVER_IMAGE
-          docker tag $SERVER_IMAGE $SERVER_IMAGE_GCP
-          docker push $SERVER_IMAGE_GCP
+          docker pull ${{ secrets.SERVER_IMAGE }}
+          docker tag ${{ secrets.SERVER_IMAGE }} ${{ secrets.SERVER_IMAGE_GCP }}
path: .github/workflows/deploy_test.yml
user: login: franzramadhan
body: ```suggestion
          docker tag ${{ secrets.SERVER_IMAGE }} ${{ secrets.SERVER_IMAGE_GC }}
```
created_at: 2025-03-03T02:37:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -52,22 +26,22 @@ jobs:
       - uses: actions/checkout@v4
       - uses: google-github-actions/auth@v2
         with:
-          service_account: ${{ secrets.GCP_SA_EMAIL }}
-          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
+          service_account: ${{ secrets.GC_SA_EMAIL }}
+          workload_identity_provider: ${{ secrets.GC_WORKLOAD_IDENTITY_PROVIDER }}
       - name: Set up Cloud SDK
         uses: google-github-actions/setup-gcloud@v2
       - name: Configure docker
         run: gcloud auth configure-docker us-central1-docker.pkg.dev --quiet
       - name: docker push
         run: |
-          docker pull $SERVER_IMAGE
-          docker tag $SERVER_IMAGE $SERVER_IMAGE_GCP
-          docker push $SERVER_IMAGE_GCP
+          docker pull ${{ secrets.SERVER_IMAGE }}
+          docker tag ${{ secrets.SERVER_IMAGE }} ${{ secrets.SERVER_IMAGE_GCP }}
+          docker push ${{ secrets.SERVER_IMAGE_GCP }}
path: .github/workflows/deploy_test.yml
user: login: franzramadhan
body: ```suggestion
          docker push ${{ secrets.SERVER_IMAGE_GC }}
```
created_at: 2025-03-03T02:37:47Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-02-26T02:58:18Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough
This pull request introduces several changes across multiple GitHub Actions workflow files. In `.github/workflows/ci.yml`, secret declarations for the `deploy-web`, `deploy-server`, and `deploy-worker` jobs have been added to enhance sensitive information management. The `.github/workflows/deploy_test.yml` file has also been updated with new required secrets for deployment tasks, specifically `GC_PROJECT_ID`, `GC_SA_EMAIL`, and `GC_WORKLOAD_IDENTITY_PROVIDER`. Additionally, the obsolete file `.github/workflows/cron_ion_token_test.yml` has been removed. Other changes include modifications to Dockerfiles and various components to improve error handling, state management, and UI interactions.

## Changes
| File(s)                                         | Change Summary                                                                                                                                                                                                                                           |
|-------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `.github/workflows/ci.yml`                      | Added secret declarations for the `deploy-web`, `deploy-server`, and `deploy-worker` jobs: `GC_SA_EMAIL`, `GC_WORKLOAD_IDENTITY_PROVIDER`, `GC_PROJECT_ID`.                                                                                             |
| `.github/workflows/deploy_test.yml`             | Added required secrets: `GC_PROJECT_ID`, `GC_SA_EMAIL`, `GC_WORKLOAD_IDENTITY_PROVIDER`.                                                                                                                                                              |
| `.github/workflows/cron_ion_token_test.yml`     | Removed the file containing the automated workflow for updating the Cesium Ion access token.                                                                                                                                                          |
| `server/Dockerfile`                             | Added build and copy commands for the `db-migrations` component.                                                                                                                                                                                     |
| `server/internal/infrastructure/gcp/taskrunner.go` | Enhanced error handling in the `importItems` function to return explicit error messages and conditionally include arguments.                                                                                                                           |
| `server/internal/usecase/interactor/item_import.go` | Improved error handling in the `saveChunk` function to prevent dereferencing `nil`.                                                                                                                                                                    |
| `server/pkg/task/task.go`                       | Updated the `Validate` method in the `ImportPayload` struct to enhance validation logic with multiple checks.                                                                                                                                         |
| `web/e2e/auth.setup.ts`                         | Added a conditional check for the "Continue without passkeys" button in the authentication test.                                                                                                                                                      |
| `web/e2e/general/project.spec.ts`               | Modified interactions to ensure the last instance of the "plus New Project" button is clicked and updated the method for filling the "Project alias" field.                                                                                           |
| `web/e2e/project/content/content.spec.ts`       | Updated expected text values in assertions and simplified the method for retrieving `itemId`.                                                                                                                                                          |
| `web/e2e/project/content/version.spec.ts`       | Introduced a new test suite for version management functionality, covering various scenarios.                                                                                                                                                          |
| `web/e2e/project/item/fields/*.spec.ts`         | Shifted from label-based to role-based selectors for various input fields to enhance test robustness.                                                                                                                                                  |
| `web/src/components/atoms/Markdown/index.tsx`   | Simplified the logic for determining text color based on props.                                                                                                                                                                                        |
| `web/src/components/molecules/Common/Form/AssetItem/index.tsx` | Split `Props` type into `AssetProps` and `Props`, adding a new required property.                                                                                                                                                                     |
| `web/src/components/molecules/Content/Form/index.tsx` | Updated `Props` type to include a new property for version management.                                                                                                                                                                                |
| `web/src/i18n/translations/en.yml`              | Reset all existing key-value pairs to empty strings, affecting how these keys are rendered in the application.                                                                                                                                       |
| `web/src/i18n/translations/ja.yml`              | Added new key-value pairs for Japanese translations to enhance localization.                                                                                                                                                                           |
| `worker/internal/infrastructure/mongo/copier_test.go` | Removed `Thread` method calls in test item construction to simplify item creation.                                                                                                                                                                     |
| `web/src/gql/graphql-client-api.tsx`            | Introduced new GraphQL query and hooks for fetching versions by item ID, enhancing data retrieval capabilities.                                                                                                                                       |

## Possibly related PRs
- **reearth/reearth-cms#1276**: The changes in the main PR, which involve adding secret declarations for deployment jobs, are related to the retrieved PR as both involve modifications to GitHub Actions workflows that enhance permissions for interacting with Google Cloud services.
- **reearth/reearth-cms#1274**: The changes in the main PR regarding the addition of secrets for deployment jobs are directly related to the modifications in the retrieved PR, which also involves updating authentication methods for Google Cloud services using similar secrets.
- **reearth/reearth-cms#1275**: The changes in the main PR regarding the addition of secrets for deployment jobs in the CI workflow are related to the modifications in the retrieved PR that also involve updates to environment variables for deployment, specifically for the Cloud Run service.

## Suggested reviewers
- rot1024
- yk-eukarya

## Poem
> I'm a little rabbit, hopping with delight,  
> Secrets added to keep things tight,  
> Workflows now sing a clearer tune,  
> With updated keys, we'll soar like a balloon,  
> Hopping through code, under the moon! 🐇💻  

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.
> 
> <details>
> <summary>🔧 actionlint (1.7.4)</summary>
> 
> <details>
> <summary>.github/workflows/cron_ion_token_test.yml</summary>
> 
> could not read ".github/workflows/cron_ion_token_test.yml": open .github/workflows/cron_ion_token_test.yml: no such file or directory
> 
> </details>
> 
> </details>
> 
> <details>
> <summary>🔧 YAMLlint (1.35.1)</summary>
> 
> <details>
> <summary>.github/workflows/cron_ion_token_test.yml</summary>
> 
> [Errno 2] No such file or directory: '.github/workflows/cron_ion_token_test.yml'
> 
> </details>
> 
> </details>
> 
> <details>
> <summary>🔧 golangci-lint (1.62.2)</summary>
> 
> Error: can't load config: the Go language version (go1.23) used to build golangci-lint is lower than the targeted Go version (1.24.0)
> Failed executing command with error: can't load config: the Go language version (go1.23) used to build golangci-lint is lower than the targeted Go version (1.24.0)
> 
> 
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=reearth/reearth-cms&utm_content=1416):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: netlify[bot]
created_at: 2025-02-26T02:58:28Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *reearth-cms* canceled.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | bcbd5be4b4384efdbcc03aa1c677a808a54a3a47 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/reearth-cms/deploys/67cfeb6485baab0008293cdb |
author_association: NONE
user: login: franzramadhan
created_at: 2025-03-03T02:54:24Z
body: > This PR doing too much things. Do it on 2 separated PR, take out secrets and variable to GH secrets and variable. And update workload identity.

@joshuagibeonm the updating of workload identity is not done via PR. But via the actions secret and variables menu

So technically it can only be in 1 PR
author_association: CONTRIBUTOR
user: login: franzramadhan
created_at: 2025-03-11T07:18:43Z
body: related fix: https://github.com/reearth/reearth-cms/pull/1437
author_association: CONTRIBUTOR