Skip to content

Commit 6a4b1b1

Browse files
committed
ci: add playground deployment workflow to Huawei Cloud CDN
1 parent b6700a6 commit 6a4b1b1

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
name: Deploy Playground to CDN
2+
3+
on:
4+
workflow_dispatch:
5+
6+
env:
7+
HUAWEI_CLOUD_AK: ${{ secrets.HUAWEI_CLOUD_AK }}
8+
HUAWEI_CLOUD_SK: ${{ secrets.HUAWEI_CLOUD_SK }}
9+
HUAWEI_CLOUD_ENDPOINT: ${{ secrets.HUAWEI_CLOUD_ENDPOINT }}
10+
HUAWEI_CLOUD_BUCKET: ${{ secrets.HUAWEI_CLOUD_BUCKET }}
11+
12+
jobs:
13+
check-secrets:
14+
runs-on: ubuntu-latest
15+
outputs:
16+
secrets-ready: ${{ steps.check.outputs.secrets-ready }}
17+
steps:
18+
- name: Check required secrets
19+
id: check
20+
run: |
21+
if [[ -z "${{ secrets.HUAWEI_CLOUD_AK }}" ]] || \
22+
[[ -z "${{ secrets.HUAWEI_CLOUD_SK }}" ]] || \
23+
[[ -z "${{ secrets.HUAWEI_CLOUD_ENDPOINT }}" ]] || \
24+
[[ -z "${{ secrets.HUAWEI_CLOUD_BUCKET }}" ]]; then
25+
echo "secrets-ready=false" >> $GITHUB_OUTPUT
26+
echo "::error::Required Huawei Cloud secrets are not configured."
27+
echo "::error::Please set: HUAWEI_CLOUD_AK, HUAWEI_CLOUD_SK, HUAWEI_CLOUD_ENDPOINT, HUAWEI_CLOUD_BUCKET"
28+
exit 1
29+
fi
30+
echo "secrets-ready=true" >> $GITHUB_OUTPUT
31+
echo "✅ All required secrets are configured"
32+
33+
build:
34+
# 指定运行环境为最新版本的ubuntu
35+
runs-on: ubuntu-latest
36+
outputs:
37+
version-timestamp: ${{ steps.prepare-version.outputs.version_timestamp }}
38+
cdn-base: ${{ steps.prepare-version.outputs.cdn_base }}
39+
obs-path: ${{ steps.prepare-version.outputs.obs_path }}
40+
steps:
41+
# 步骤1: 检出代码
42+
- name: CheckOut Code
43+
uses: actions/checkout@v4
44+
with:
45+
ref: ${{ github.ref_name }}
46+
47+
# 步骤2: 设置pnpm包管理器
48+
- name: Setup pnpm
49+
uses: pnpm/action-setup@v4
50+
51+
# 步骤3: 设置Node.js环境
52+
- name: Setup Node
53+
uses: actions/setup-node@v4
54+
with:
55+
node-version: 20 # 使用Node.js 20版本
56+
registry-url: 'https://registry.npmjs.org' # 设置npm registry地址
57+
58+
# 步骤4: 获取pnpm缓存目录路径
59+
- name: Get pnpm store directory
60+
id: pnpm-cache
61+
run: |
62+
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT
63+
64+
# 步骤5: 配置pnpm缓存
65+
- uses: actions/cache@v3
66+
name: Setup pnpm cache
67+
with:
68+
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
69+
# 使用操作系统类型和pnpm-lock.yaml的哈希值作为缓存键
70+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
71+
restore-keys: |
72+
${{ runner.os }}-pnpm-store-
73+
74+
# 步骤6: 安装项目依赖
75+
- name: Install dependencies
76+
run: pnpm i --no-frozen-lockfile
77+
78+
- id: prepare-version
79+
name: Prepare version-timestamp
80+
run: |
81+
# Extract version from package.json
82+
VERSION=$(node -p "require('./packages/playground/package.json').version")
83+
84+
# Generate timestamp in YYYYMMDD-HHMMSS format
85+
TIMESTAMP=$(TZ="Asia/Shanghai" date +%Y%m%d-%H%M%S)
86+
87+
# Combine for version-timestamp
88+
VERSION_TIMESTAMP="${VERSION}-${TIMESTAMP}"
89+
90+
# Set CDN base path
91+
CDN_BASE="https://res-static.opentiny.design/tiny-robot-playground/${VERSION_TIMESTAMP}/"
92+
OBS_PATH="tiny-robot-playground/${VERSION_TIMESTAMP}/"
93+
94+
# Export as environment variables for subsequent steps
95+
echo "VERSION_TIMESTAMP=$VERSION_TIMESTAMP" >> $GITHUB_ENV
96+
echo "CDN_BASE=$CDN_BASE" >> $GITHUB_ENV
97+
echo "OBS_PATH=$OBS_PATH" >> $GITHUB_ENV
98+
99+
# Set outputs for job-level export
100+
echo "version_timestamp=$VERSION_TIMESTAMP" >> $GITHUB_OUTPUT
101+
echo "cdn_base=$CDN_BASE" >> $GITHUB_OUTPUT
102+
echo "obs_path=$OBS_PATH" >> $GITHUB_OUTPUT
103+
104+
echo "Version-Timestamp: $VERSION_TIMESTAMP"
105+
echo "CDN Base: $CDN_BASE"
106+
echo "OBS Path: $OBS_PATH"
107+
108+
# 构建Playground
109+
- name: Build Playground
110+
run: pnpm build:playground
111+
env:
112+
PLAYGROUND_BASE: ${{ env.CDN_BASE }}
113+
114+
- name: Verify build output
115+
run: ls -la ./packages/playground/dist
116+
117+
- name: Upload build artifacts
118+
uses: actions/upload-artifact@v4
119+
with:
120+
name: playground-dist
121+
path: ./packages/playground/dist/
122+
retention-days: 1
123+
124+
deploy-cdn:
125+
runs-on: ubuntu-latest
126+
needs: [check-secrets, build]
127+
steps:
128+
- name: Checkout
129+
uses: actions/checkout@v4
130+
131+
- name: Download build artifacts
132+
uses: actions/download-artifact@v4
133+
with:
134+
name: playground-dist
135+
path: ./packages/playground/dist/
136+
137+
- name: Install obsutil
138+
run: |
139+
curl -o obsutil.tar.gz https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz
140+
tar -xzf obsutil.tar.gz
141+
chmod +x obsutil_linux_amd64_*/obsutil
142+
sudo mv obsutil_linux_amd64_*/obsutil /usr/local/bin/obsutil
143+
144+
- name: Configure and Upload to OBS
145+
run: |
146+
obsutil config -i=${{ env.HUAWEI_CLOUD_AK }} \
147+
-k=${{ env.HUAWEI_CLOUD_SK }} \
148+
-e=${{ env.HUAWEI_CLOUD_ENDPOINT }}
149+
# Upload to versioned path
150+
obsutil cp ./packages/playground/dist/ \
151+
obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path }} \
152+
-r -f
153+
154+
echo "Uploaded to: obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path }}"
155+
echo "CDN URL: https://res-static.opentiny.design/${{ needs.build.outputs.obs-path }}"

0 commit comments

Comments
 (0)