Skip to content

Commit fa2623a

Browse files
authored
ci(deploy): add workflow for CDN deployment (#1746)
* ci(deploy): add workflow for CDN deployment * ci(deploy): add secret checks for Huawei Cloud deployment * ci(deploy): fix command for building alpha plugin * ci(deploy): enhance CDN deployment with latest release option
1 parent 1037e3c commit fa2623a

1 file changed

Lines changed: 168 additions & 0 deletions

File tree

.github/workflows/deploy-cdn.yml

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
name: Deploy to CDN
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
is_latest_release:
7+
description: '当前分支是否是最新release版本'
8+
required: true
9+
default: true
10+
type: boolean
11+
12+
env:
13+
HUAWEI_CLOUD_AK: ${{ secrets.HUAWEI_CLOUD_AK }}
14+
HUAWEI_CLOUD_SK: ${{ secrets.HUAWEI_CLOUD_SK }}
15+
HUAWEI_CLOUD_ENDPOINT: ${{ secrets.HUAWEI_CLOUD_ENDPOINT }}
16+
HUAWEI_CLOUD_BUCKET: ${{ secrets.HUAWEI_CLOUD_BUCKET }}
17+
18+
jobs:
19+
check-secrets:
20+
runs-on: ubuntu-latest
21+
outputs:
22+
secrets-ready: ${{ steps.check.outputs.secrets-ready }}
23+
steps:
24+
- name: Check required secrets
25+
id: check
26+
run: |
27+
if [[ -z "${{ secrets.HUAWEI_CLOUD_AK }}" ]] || \
28+
[[ -z "${{ secrets.HUAWEI_CLOUD_SK }}" ]] || \
29+
[[ -z "${{ secrets.HUAWEI_CLOUD_ENDPOINT }}" ]] || \
30+
[[ -z "${{ secrets.HUAWEI_CLOUD_BUCKET }}" ]]; then
31+
echo "secrets-ready=false" >> $GITHUB_OUTPUT
32+
echo "::error::Required Huawei Cloud secrets are not configured."
33+
echo "::error::Please set: HUAWEI_CLOUD_AK, HUAWEI_CLOUD_SK, HUAWEI_CLOUD_ENDPOINT, HUAWEI_CLOUD_BUCKET"
34+
exit 1
35+
fi
36+
echo "secrets-ready=true" >> $GITHUB_OUTPUT
37+
echo "✅ All required secrets are configured"
38+
39+
build:
40+
runs-on: ubuntu-latest
41+
needs: check-secrets
42+
outputs:
43+
version-timestamp: ${{ steps.prepare-version.outputs.version_timestamp }}
44+
cdn-base: ${{ steps.prepare-version.outputs.cdn_base }}
45+
cdn-base-latest: ${{ steps.prepare-version.outputs.cdn_base_latest }}
46+
obs-path: ${{ steps.prepare-version.outputs.obs_path }}
47+
obs-path-latest: ${{ steps.prepare-version.outputs.obs_path_latest }}
48+
concurrency:
49+
group: deploy-cdn
50+
cancel-in-progress: true
51+
steps:
52+
- name: Checkout
53+
uses: actions/checkout@v4
54+
55+
- name: Install pnpm
56+
uses: pnpm/action-setup@v4
57+
with:
58+
version: 10
59+
run_install: false
60+
61+
- name: Setup Node.js
62+
uses: actions/setup-node@v4
63+
with:
64+
node-version: '20'
65+
registry-url: 'https://registry.npmjs.org'
66+
67+
- name: Install dependencies
68+
run: pnpm install
69+
70+
- name: add environment variable
71+
run: |
72+
VITE_ORIGIN_URL="https://agent.opentiny.design/"
73+
cat <<EOF >> designer-demo/env/.env.alpha
74+
# ---- appended by CI (deploy-cdn) ----
75+
VITE_ORIGIN=$VITE_ORIGIN_URL
76+
EOF
77+
echo "VITE_ORIGIN_URL=$VITE_ORIGIN_URL"
78+
79+
- id: prepare-version
80+
name: Prepare version-timestamp
81+
run: |
82+
# Extract version from package.json
83+
VERSION=$(node -p "require('./designer-demo/package.json').version")
84+
85+
# Generate timestamp in YYYYMMDD-HHMMSS format
86+
TIMESTAMP=$(TZ="Asia/Shanghai" date +%Y%m%d-%H%M%S)
87+
88+
# Combine for version-timestamp
89+
VERSION_TIMESTAMP="${VERSION}-${TIMESTAMP}"
90+
91+
# Set CDN base path
92+
CDN_BASE="https://res-static.opentiny.design/tiny-engine-designer/${VERSION_TIMESTAMP}/"
93+
CDN_BASE_LATEST="https://res-static.opentiny.design/tiny-engine-designer/latest/"
94+
OBS_PATH="tiny-engine-designer/${VERSION_TIMESTAMP}/"
95+
OBS_PATH_LATEST="tiny-engine-designer/latest"
96+
97+
# Export as environment variables for subsequent steps
98+
echo "VERSION_TIMESTAMP=$VERSION_TIMESTAMP" >> $GITHUB_ENV
99+
echo "CDN_BASE=$CDN_BASE" >> $GITHUB_ENV
100+
echo "OBS_PATH=$OBS_PATH" >> $GITHUB_ENV
101+
102+
# Set outputs for job-level export
103+
echo "version_timestamp=$VERSION_TIMESTAMP" >> $GITHUB_OUTPUT
104+
echo "cdn_base=$CDN_BASE" >> $GITHUB_OUTPUT
105+
echo "cdn_base_latest=$CDN_BASE_LATEST" >> $GITHUB_OUTPUT
106+
echo "obs_path=$OBS_PATH" >> $GITHUB_OUTPUT
107+
echo "obs_path_latest=$OBS_PATH_LATEST" >> $GITHUB_OUTPUT
108+
109+
echo "Version-Timestamp: $VERSION_TIMESTAMP"
110+
echo "CDN Base: $CDN_BASE"
111+
echo "OBS Path: $OBS_PATH"
112+
113+
- name: Run Build
114+
run: |
115+
set -eo pipefail
116+
pnpm run build:plugin 2>&1 | tee /tmp/build-plugin.log
117+
# Run build:alpha equivalent with --base parameter
118+
pnpm run build:alpha --base=${{ env.CDN_BASE }} 2>&1 | tee /tmp/build-alpha.log
119+
120+
- name: Upload build artifacts
121+
uses: actions/upload-artifact@v4
122+
with:
123+
name: designer-demo-dist
124+
path: ./designer-demo/dist/
125+
retention-days: 1
126+
127+
deploy-cdn:
128+
runs-on: ubuntu-latest
129+
needs: [check-secrets, build]
130+
steps:
131+
- name: Checkout
132+
uses: actions/checkout@v4
133+
134+
- name: Download build artifacts
135+
uses: actions/download-artifact@v4
136+
with:
137+
name: designer-demo-dist
138+
path: ./designer-demo/dist/
139+
140+
- name: Install obsutil
141+
run: |
142+
curl -o obsutil.tar.gz https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz
143+
tar -xzf obsutil.tar.gz
144+
chmod +x obsutil_linux_amd64_*/obsutil
145+
sudo mv obsutil_linux_amd64_*/obsutil /usr/local/bin/obsutil
146+
147+
- name: Configure and Upload to OBS
148+
run: |
149+
obsutil config -i=${{ env.HUAWEI_CLOUD_AK }} \
150+
-k=${{ env.HUAWEI_CLOUD_SK }} \
151+
-e=${{ env.HUAWEI_CLOUD_ENDPOINT }}
152+
# Upload to versioned path
153+
obsutil cp ./designer-demo/dist \
154+
obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path }} \
155+
-r -f -flat
156+
157+
# If is_latest_release is true, also upload to latest path
158+
if [ "${{ github.event.inputs.is_latest_release }}" = "true" ]; then
159+
# use cdn-base-latest replace cdn-base in all ./designer-demo/dist files
160+
find ./designer-demo/dist -type f \( -name "*.html" -o -name "*.js" -o -name "*.mjs" -o -name "*.css" \) \
161+
-exec sed -i "s|${{ needs.build.outputs.cdn-base }}|${{ needs.build.outputs.cdn-base-latest }}|g" {} +
162+
obsutil cp ./designer-demo/dist \
163+
obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path-latest }} \
164+
-r -f -flat
165+
fi
166+
167+
echo "Uploaded to: obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path }}"
168+
echo "CDN URL: https://res-static.opentiny.design/${{ needs.build.outputs.obs-path }}"

0 commit comments

Comments
 (0)