Compare commits

...

31 Commits

Author SHA1 Message Date
c8ea858abe ブランチネームを追加する 2025-12-05 23:02:47 +09:00
3c1c8159d4 デプロイソースを整備する 2025-12-05 23:01:26 +09:00
2edea8d13c test 2025-12-05 22:53:37 +09:00
77214306bf test 2025-12-05 22:52:38 +09:00
4fd5007a3e test 2025-12-05 22:52:20 +09:00
2f50cbbd6e test 2025-12-05 22:51:30 +09:00
843375d950 修正 2025-12-05 22:49:34 +09:00
e3c9658491 test 2025-12-05 22:43:39 +09:00
1fcbf0e33a エラー修正 2025-12-05 22:42:01 +09:00
ebc4c1ba43 プラン変更 2025-12-05 22:34:51 +09:00
ab32a9e825 プランまで追加する 2025-12-05 22:32:50 +09:00
57fea674e7 test 2025-12-05 22:14:59 +09:00
62f9f9c361 ビルド用修正 2025-12-05 22:13:05 +09:00
1be5bd5388 デプロイソース修正 2025-12-05 22:11:26 +09:00
e7595d1365 修正 2025-12-05 21:50:48 +09:00
19d4d88171 バックエンドを修正 2025-12-05 21:43:27 +09:00
d5869b639c 権限及び修正 2025-12-05 21:36:49 +09:00
5811b76fb5 test 2025-12-05 21:34:46 +09:00
fa09f7199f init terraformを設定しました 2025-12-05 21:33:53 +09:00
dd65fdd8b5 テスト 2025-12-05 21:18:08 +09:00
017b88d0c9 修正 2025-12-05 21:07:27 +09:00
251da802c4 Test 2025-12-05 20:56:03 +09:00
09e6feb265 test 2025-12-05 20:53:48 +09:00
f04302a9f2 Merge branch 'feature/upd_cicd_func' 2025-12-05 20:52:50 +09:00
a73c685800 Test 2025-12-05 20:51:39 +09:00
ed2de27a8f 調整 2025-12-05 20:48:35 +09:00
e8eba504b3 調整 2025-12-05 20:44:49 +09:00
d800203ab8 Merge branch 'feature/upd_cicd_func' 2025-12-05 20:43:01 +09:00
6d141ca131 CDソース追加(gcp ) 2025-12-05 20:40:52 +09:00
6cb9f550f7 初回CloudRunJob起動確認 2025-12-05 10:49:58 +09:00
27c1c461e8 terraformの必要なファイルを設定 2025-12-05 02:16:37 +09:00
17 changed files with 474 additions and 0 deletions

69
.github/workflows/deploy_to_gcp.yml vendored Normal file
View File

@ -0,0 +1,69 @@
name: Gitea Deploy to GCP
on:
workflow_dispatch:
pull_request:
branches:
- deploy-prd
- deploy-dev
jobs:
gcp-deploy:
name: Deploy to GCP
runs-on: gcloud-tf
env:
GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
REPO_NAME: ${{ github.repository }}
HASH_SUFFIX: ${{ github.sha }}
JOB_NAME: ${{ vars.JOB_NAME }}
BRANCH_NAME: ${{ github.ref_name }}
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Check Deploy Tools
run: |
ls -la
echo "Checking gcloud and terraform versions..."
gcloud --version
terraform --version
- name: Check Gcloud auth
run: |
echo "HOME: ${HOME}"
printf '%s' "$GCP_SA_KEY" > $HOME/sa.json
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/sa.json"
gcloud auth activate-service-account --key-file="$GOOGLE_APPLICATION_CREDENTIALS"
gcloud config set project "$GCP_PROJECT_ID"
echo "Check gcloud"
gcloud config list
gcloud --version
- name: Exec Terraform init shell
run: |
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/sa.json"
./scripts/deploy/init_terraform.sh
- name: Exec Container Image Push to Artifact Registry
run: |
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/sa.json"
./scripts/deploy/build_image_to_gar.sh
- name: Exec Terraform plan shell
run: |
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/sa.json"
./scripts/deploy/plan_terraform.sh
- name: Exec Terraform apply shell
run: |
export GOOGLE_APPLICATION_CREDENTIALS="$HOME/sa.json"
./scripts/deploy/apply_terraform.sh
- name: Clean up Gcloud auth file
run: |
rm -f $HOME/sa.json
echo "Cleaned up Gcloud auth file."

7
.gitignore vendored
View File

@ -172,3 +172,10 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/ #.idea/
# terraform.tfstate files
_*.tfvars
.terraform/
.terraform.lock.hcl
*.tfstate
*.tfstate.backup
*deploy.env

19
Dockerfile Normal file
View File

@ -0,0 +1,19 @@
FROM python:3.12-slim
# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
curl
# pythonパッケージのインストール
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
# 作業ディレクトリを設定
WORKDIR /app
# アプリケーションコードをコピー
COPY ./src /app
# コンテナ起動時に実行されるコマンドを指定
CMD ["python", "main.py"]

View File

@ -0,0 +1,61 @@
# エージェントへの目的
`terraform`フォルダを確認して`readme/components_design`フォルダに
.drawioファイル(XML形式)で作成してください
## 役割
あなたはシステム構成を考える専門家です。
## 規約
【要件】
* 出力ファイルは`system_components.drawio`としてください。
* リクエストに指定がない場合は環境変数は`_dev.tfvars`を優先してください。
* サービスアカウントやロールなどは記載しなくて良い。
* **重要**terraformに存在しないコンポーネントは使用しないこと
* ユーザーが利用するコンポーネント図と、開発者が利用するコンポーネント図は分離してください
【レイアウト要件】
- Region、VPCを大きな枠で表現
- Region: 最も外側の枠として配置
- VPC: Regionの内側に配置
- 接続線が重ならないよう、コンポーネントを階段状に配置
- 各コンポーネント間の間隔を100px以上確保
- ユーザーはVPCの外側に配置インターネット経由でアクセスする想定
- コンポーネントは左から右に向かってデータフローを表現User → Frontend → Backend → Database
【スタイル要件】
**枠のスタイル:**
- VPC: `fillColor=#D5E8D4;strokeColor=#82b366;dashed=1;verticalAlign=top;fontStyle=1;fontSize=14`
- Region: `fillColor=#E1F5FE;strokeColor=#01579B;dashed=1;verticalAlign=top;fontStyle=1;fontSize=14`
- 枠のラベルは左上に配置(`align=left;spacingLeft=10;spacingTop=5`
**接続線:**
- 双方向通信: `endArrow=classic;startArrow=classic;strokeWidth=2`
- 単方向通信: `endArrow=classic;strokeWidth=2`
- HTTPSアクセス: `strokeColor=#4285F4`(青)
- データベース接続: `strokeColor=#DB4437`(赤)
- ストレージアクセス: `strokeColor=#34A853`(緑)
- 接続線にラベルを付ける(例: "HTTPS", "API", "SQL"
【座標とサイズの目安】
- Region枠: 幅800-1000px、高さ500-700px
- VPC枠: Region内部で余白50px程度、幅700-900px、高さ400-600px
- コンポーネントアイコン: 78x78 または 80x80
- コンポーネント間の横間隔: 150-200px
- コンポーネント間の縦間隔: 100-150px
**アイコン:**
- ユーザー/クライアントアイコン
- `shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.user`(共通で使用可能)
- コンポーネントのアイコンについて以下のマップを参考にしてください
- 以下のアイコンを使用する場合、必ず対応する mxCell テンプレートを使用すること。
- id / x / y / width / height / parent などは適宜書き換えて構いません。

76
readme/deploy.md Normal file
View File

@ -0,0 +1,76 @@
# デプロイの方法について
## インストール方法
MACの場合
```sh
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
# 確認
terraform -version
```
## 環境について
* terraform
* google cloud
* Cloud Run Job
## 実行する方法
```sh
# 初期化を実行する
cd terraform
# Terraformの初期化
terraform init
# アーティファクトやバケットについては先に生成する
terraform apply \
-var-file=_dev.tfvars \
-auto-approve \
-target="google_artifact_registry_repository.repo"
# DockerファイルをビルドしてGARにプッシュする場合
cd ../
# 1. Artifact Registryへの認証設定(初回のみ実行)
source deploy.env
gcloud auth configure-docker "${AR_REGION}-docker.pkg.dev"
# arm64
source deploy.env
gcloud builds submit --tag "${IMAGE_URI}" .
echo "${IMAGE_URI}"
# デプロイするコンポーネントを確認する
cd terraform
terraform plan \
-var-file=_dev.tfvars \
-var="hash_suffix=${HASH_SUFFIX}"
# デプロイを実行する
terraform apply \
-var-file=_dev.tfvars \
-var="hash_suffix=${HASH_SUFFIX}" \
-auto-approve
```
ローカルでビルドで試す場合
```sh
# デフォルトでビルドする場合
docker build -t cloud-run-job-base .
# arm64でビルドしたい場合
docker buildx build -platform linux/amd64,linux/arm64 -t cloud-run-job-base .
# Dockerを実行する(1回だけ実行してコンテナインスタンスを削除する場合)
docker run --rm cloud-run-job-base:latest
```
### CI/CDでデプロイを実行する場合
**Github(Gitea) Acrtionsで実行する場合**
**Cloud Buildで実行する場合**
### Big Quderyにデータが取得できた場合をトリガーにしてJOBを実行する方法

View File

@ -0,0 +1,26 @@
#!/bin/bash
# Safe mode(when error,kill script)
set -euo pipefail
# 変数の設定({HOME}/hash.txt からハッシュ値を取得)
TF_DIR=${TF_DIR:-terraform}
ENV=${ENV:-dev}
cd "$TF_DIR"
# --- デプロイ条件 ---
if [[ "${BRANCH_NAME:-}" =~ ^.*deploy$ ]]; then
echo "Start terraform apply (ENV=${ENV}, DIR=${TF_DIR}) ..."
else
echo "Skip terraform apply (branch=${BRANCH_NAME:-})"
exit 0
fi
# --- plan 結果があるか確認 ---
if [[ ! -f tfplan ]]; then
echo "ERROR: tfplan not found in $(pwd). Run plan step first." >&2
exit 1
fi
terraform apply -auto-approve tfplan

View File

@ -0,0 +1,29 @@
#!/bin/bash
# Google Container RegistryへDockerイメージをビルドしてプッシュするスクリプト
set -euo pipefail
# 環境変数の設定
REGION=${REGION:-asia-northeast1}
ENV=${ENV:-dev}
JOB_NAME=${JOB_NAME}
AR_REPO_NAME="cicd-repo-${ENV}"
HASH_SUFFIX=${HASH_SUFFIX}
# IMAGE_URIの設定
# ローカル実行時は epoch 秒で自動採番。
IMAGE_URI="${REGION}-docker.pkg.dev/${GCP_PROJECT_ID}/${AR_REPO_NAME}/run-job-${JOB_NAME}-image:${HASH_SUFFIX}"
echo "REGION : ${REGION}"
echo "ENV : ${ENV}"
echo "JOB_NAME : ${JOB_NAME}"
echo "HASH_SUFFIX : ${HASH_SUFFIX}"
echo "IMAGE_URI : ${IMAGE_URI}"
# Artifact Registry への認証設定
gcloud auth configure-docker "${REGION}-docker.pkg.dev"
# GARへDockerイメージをビルドしてプッシュ
gcloud builds submit --tag "${IMAGE_URI}" .

View File

@ -0,0 +1,21 @@
#!/bin/bash
# Safe mode(when error,kill script)
set -euo pipefail
TF_DIR=${TF_DIR:-terraform}
# GCS S3などで保存する
TF_STATE_BUCKET=${TF_STATE_BUCKET:-cicd-tfstate-bucket-20250906}
ENV=${ENV:-dev}
REPO_NAME=${REPO_NAME:-unknown}
cd "$TF_DIR"
echo "$REPO_NAME"
# # --- terraform init 実行 ---
terraform init \
-backend-config="bucket=${TF_STATE_BUCKET}" \
-backend-config="prefix=${REPO_NAME}/${ENV}" \

View File

@ -0,0 +1,23 @@
#!/bin/bash
# Safe mode(when error,kill script)
set -euo pipefail
# 変数の設定({HOME}/hash.txt からハッシュ値を取得)
TF_DIR=${TF_DIR:-terraform}
ENV=${ENV:-dev}
HASH_SUFFIX=${HASH_SUFFIX}
cd "$TF_DIR"
if [ -f "${ENV}.tfvars" ]; then
terraform plan \
-out=tfplan \
-var-file="${ENV}.tfvars" \
-var="hash_suffix=${HASH_SUFFIX}"
else
# error raise
echo "ERROR: ${ENV}.tfvars not found in $(pwd)" >&2
exit 1
fi

5
terraform/af.tf Normal file
View File

@ -0,0 +1,5 @@
resource "google_artifact_registry_repository" "repo" {
location = var.region
repository_id = "cicd-repo-${var.env_name}"
format = "DOCKER"
}

12
terraform/dev.tfvars Normal file
View File

@ -0,0 +1,12 @@
project_id = "gcp-devel-project"
region = "asia-northeast1"
env_name = "dev"
job_name = "base"
# コンテナイメージCI/CDから渡される想定
cpu_limit = "1"
memory_limit = "512Mi"
timeout = "1800s"

10
terraform/platform.tf Normal file
View File

@ -0,0 +1,10 @@
# Google CloudのAPIを有効化
resource "google_project_service" "services" {
for_each = toset([
"run.googleapis.com",
"artifactregistry.googleapis.com",
"cloudbuild.googleapis.com",
])
service = each.key
}

9
terraform/provider.tf Normal file
View File

@ -0,0 +1,9 @@
terraform {
backend "gcs" {}
}
# Google Providerの設定
provider "google" {
project = var.project_id
region = var.region
}

29
terraform/run_job.tf Normal file
View File

@ -0,0 +1,29 @@
# Cloud Run Jobのリソース
# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_job
resource "google_cloud_run_v2_job" "job" {
name = "${var.job_name}-${var.env_name}-job"
location = var.region
template {
template {
#
service_account = google_service_account.job_sa.email
containers {
image = "${var.region}-docker.pkg.dev/${var.project_id}/cicd-repo-${var.env_name}/run-job-${var.job_name}-image:${var.hash_suffix}"
resources {
limits = {
cpu = var.cpu_limit
memory = var.memory_limit
}
}
}
timeout = var.timeout
}
}
}

14
terraform/sa.tf Normal file
View File

@ -0,0 +1,14 @@
resource "google_service_account" "job_sa" {
account_id = "sa-${var.job_name}-${var.env_name}"
display_name = "Cloud Run Job Service Account for ${var.job_name} in ${var.env_name} environment"
description = "Cloud Run Job Service Account for ${var.job_name} in ${var.env_name} environment"
project = var.project_id
}
# IAM role assignment
# Cloud Run Job実行に必要な権限を付与
resource "google_project_iam_member" "run_job_invoker" {
project = var.project_id
role = "roles/run.invoker"
member = "serviceAccount:${google_service_account.job_sa.email}"
}

10
terraform/sample.tfvars Normal file
View File

@ -0,0 +1,10 @@
project_id = "プロジェクトIDを指定してください"
region = "asia-northeast1"
env_name = "dev"
job_name = "ジョブ名を指定してください"
# コンテナイメージCI/CDから渡される想定
cpu_limit = "1"
memory_limit = "512Mi"
timeout = "1800s"

54
terraform/variables.tf Normal file
View File

@ -0,0 +1,54 @@
# GCPプロジェクトIDとリージョン
variable "project_id" {
description = "The ID of the GCP project to deploy resources into."
type = string
}
variable "region" {
description = "The GCP region to deploy resources into."
type = string
default = "asia-northeast1" #
}
variable "env_name" {
description = "The environment name for the deployment."
type = string
default = "dev"
validation {
condition = contains(["dev", "staging", "prd"], var.env_name)
error_message = "env_name must be one of: dev, staging, prd."
}
}
variable "job_name" {
description = "The name of the Cloud Run Job."
type = string
default = "get-news-ai"
}
# (CI/CDから渡される想定)
variable "hash_suffix" {
description = "The container image for the Cloud Run Job."
type = string
default = null
}
# Cloud Run Jobの設定変数
variable "cpu_limit" {
description = "The CPU limit for the Cloud Run Job container."
type = string
default = "1"
}
variable "memory_limit" {
description = "The memory limit for the Cloud Run Job container."
type = string
default = "512Mi"
}
variable "timeout" {
description = "The task timeout in seconds for the Cloud Run Job."
type = string
default = "1800s"
}