-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcloudbuild.yaml
More file actions
104 lines (90 loc) · 4.68 KB
/
cloudbuild.yaml
File metadata and controls
104 lines (90 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# cloudbuild.yaml ── Build → Deploy
substitutions:
_IMAGE_PATH: '${_REGION}-docker.pkg.dev/$PROJECT_ID/one-key-balance-kit/api'
_ENV: 'staging' # GitHub Action 會覆寫
_MAX_INSTANCES: '1'
_REGION: 'asia-east1' # 預設值,GitHub Action 會覆寫
_GIT_SHA: 'latest' # 預設值,GitHub Action 會覆寫
timeout: '1200s'
options:
logging: 'CLOUD_LOGGING_ONLY'
steps:
# --- 1) Build multi-arch image ------------------------------------------
- id: build-image
name: gcr.io/kaniko-project/executor:latest
entrypoint: ''
args:
# context 與 Dockerfile (預設為 ./Dockerfile)
- '--context=.'
- '--dockerfile=Dockerfile'
# 組合 tag ── 使用 _GIT_SHA,如空則 latest
- '--destination=${_IMAGE_PATH}:${_GIT_SHA}'
- '--destination=${_IMAGE_PATH}:${_ENV}'
- '--destination=${_IMAGE_PATH}:latest'
# 建置引數
- '--build-arg=NODE_ENV=$(_ENV==production?"production":"staging")'
# Kaniko layer cache(存放於同一 Registry)
- '--cache=true'
- '--cache-ttl=48h'
# --- 2) 產生 manifest & 部署 -------------------------------------------
- id: deploy
name: gcr.io/google.com/cloudsdktool/cloud-sdk
entrypoint: bash
args:
- -ceu
- |
# 使用條件語句決定後綴 (避免 Cloud Build 解析變數)
if [ "${_ENV}" = "production" ]; then
suffix=""
else
suffix="-dev"
fi
# 使用 _GIT_SHA 或 latest 作為映像標籤
tag="$_GIT_SHA"
if [ -z "$tag" ]; then
tag="latest"
fi
# 避免使用可能被 Cloud Build 誤解的變數名稱
export env_suffix=$([ "${_ENV}" = "production" ] && echo "" || echo "-dev")
export environment="${_ENV}"
export max_instances="${_MAX_INSTANCES}"
export region="${_REGION}"
export project_id="$PROJECT_ID"
export img_tag="$tag"
export node_env=$([ "${_ENV}" = "production" ] && echo "production" || echo "staging")
export log_level=$([ "${_ENV}" = "production" ] && echo "" || echo "debug")
export api_base_url=$([ "${_ENV}" = "production" ] && echo "https://api-onekeybalance.sd0.tech" || echo "https://staging-api-onekeybalance.sd0.tech")
export cors_origin=$([ "${_ENV}" = "production" ] && echo "https://onekeybalance.sd0.tech" || echo '"*"')
export webhook_url=$([ "${_ENV}" = "production" ] && echo "https://api-onekeybalance.sd0.tech/v1/api/webhook" || echo "https://staging-api-onekeybalance.sd0.tech/v1/api/webhook")
export secret_prefix=$([ "${_ENV}" = "production" ] && echo "production" || echo "staging")
# 構建映像路徑
export image_path="${_IMAGE_PATH}"
# 顯示將用於部署的映像
echo "部署使用的映像: $image_path:$tag"
# 使用 sed 替換環境變數,而不是 envsubst
cp cloud-run-service.template.yaml cloud-run-service.generated.yaml
sed -i "s|\${env_suffix}|$env_suffix|g" cloud-run-service.generated.yaml
sed -i "s|\${environment}|$environment|g" cloud-run-service.generated.yaml
sed -i "s|\${max_instances}|$max_instances|g" cloud-run-service.generated.yaml
sed -i "s|\${region}|$region|g" cloud-run-service.generated.yaml
sed -i "s|\${project_id}|$project_id|g" cloud-run-service.generated.yaml
sed -i "s|\${image_path}|$image_path|g" cloud-run-service.generated.yaml
sed -i "s|\${img_tag}|$img_tag|g" cloud-run-service.generated.yaml
sed -i "s|\${node_env}|$node_env|g" cloud-run-service.generated.yaml
sed -i "s|\${log_level}|$log_level|g" cloud-run-service.generated.yaml
sed -i "s|\${api_base_url}|$api_base_url|g" cloud-run-service.generated.yaml
sed -i "s|\${cors_origin}|$cors_origin|g" cloud-run-service.generated.yaml
sed -i "s|\${webhook_url}|$webhook_url|g" cloud-run-service.generated.yaml
sed -i "s|\${secret_prefix}|$secret_prefix|g" cloud-run-service.generated.yaml
# 檢查是否有未替換的變數
echo "檢查是否有未替換的變數 (應該不顯示任何內容):"
grep -o '\${[^}]*}' cloud-run-service.generated.yaml || echo "全部變數已成功替換!"
# 檢查生成的 manifest
echo "生成 manifest 完成,檢查映像路徑:"
grep -A 2 "containers:" cloud-run-service.generated.yaml
# 部署至 Cloud Run
gcloud run services replace cloud-run-service.generated.yaml \
--region=${_REGION} --project=$PROJECT_ID
# 注意: 此處不使用獨立的 images 區段
# 我們已經在 build-image 步驟中使用 docker buildx 構建並推送了映像
# 這樣可以避免 Cloud Build 解析變數時出錯