Deploy Playground to CDN #3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy Playground to CDN | |
| on: | |
| workflow_dispatch: | |
| env: | |
| HUAWEI_CLOUD_AK: ${{ secrets.HUAWEI_CLOUD_AK }} | |
| HUAWEI_CLOUD_SK: ${{ secrets.HUAWEI_CLOUD_SK }} | |
| HUAWEI_CLOUD_ENDPOINT: ${{ secrets.HUAWEI_CLOUD_ENDPOINT }} | |
| HUAWEI_CLOUD_BUCKET: ${{ secrets.HUAWEI_CLOUD_BUCKET }} | |
| jobs: | |
| check-secrets: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| secrets-ready: ${{ steps.check.outputs.secrets-ready }} | |
| steps: | |
| - name: Check required secrets | |
| id: check | |
| run: | | |
| if [[ -z "${{ secrets.HUAWEI_CLOUD_AK }}" ]] || \ | |
| [[ -z "${{ secrets.HUAWEI_CLOUD_SK }}" ]] || \ | |
| [[ -z "${{ secrets.HUAWEI_CLOUD_ENDPOINT }}" ]] || \ | |
| [[ -z "${{ secrets.HUAWEI_CLOUD_BUCKET }}" ]]; then | |
| echo "secrets-ready=false" >> $GITHUB_OUTPUT | |
| echo "::error::Required Huawei Cloud secrets are not configured." | |
| echo "::error::Please set: HUAWEI_CLOUD_AK, HUAWEI_CLOUD_SK, HUAWEI_CLOUD_ENDPOINT, HUAWEI_CLOUD_BUCKET" | |
| exit 1 | |
| fi | |
| echo "secrets-ready=true" >> $GITHUB_OUTPUT | |
| echo "✅ All required secrets are configured" | |
| build: | |
| # 指定运行环境为最新版本的ubuntu | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 步骤1: 检出代码 | |
| - name: CheckOut Code | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.ref_name }} | |
| # 步骤2: 设置pnpm包管理器 | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| # 步骤3: 设置Node.js环境 | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 # 使用Node.js 20版本 | |
| registry-url: 'https://registry.npmjs.org' # 设置npm registry地址 | |
| # 步骤4: 获取pnpm缓存目录路径 | |
| - name: Get pnpm store directory | |
| id: pnpm-cache | |
| run: | | |
| echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT | |
| # 步骤5: 配置pnpm缓存 | |
| - uses: actions/cache@v3 | |
| name: Setup pnpm cache | |
| with: | |
| path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} | |
| # 使用操作系统类型和pnpm-lock.yaml的哈希值作为缓存键 | |
| key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store- | |
| # 步骤6: 安装项目依赖 | |
| - name: Install dependencies | |
| run: pnpm i --no-frozen-lockfile | |
| - id: prepare-version | |
| name: Prepare version-timestamp | |
| run: | | |
| # Extract version from package.json | |
| VERSION=$(node -p "require('./packages/playground/package.json').version") | |
| # Generate timestamp in YYYYMMDD-HHMMSS format | |
| TIMESTAMP=$(date +%Y%m%d-%H%M%S) | |
| # Combine for version-timestamp | |
| VERSION_TIMESTAMP="${VERSION}-${TIMESTAMP}" | |
| # Set CDN base path | |
| CDN_BASE="https://res-static.opentiny.design/tiny-robot-playground/${VERSION_TIMESTAMP}/" | |
| OBS_PATH="tiny-robot-playground/${VERSION_TIMESTAMP}/" | |
| # Export as environment variables for subsequent steps | |
| echo "VERSION_TIMESTAMP=$VERSION_TIMESTAMP" >> $GITHUB_ENV | |
| echo "CDN_BASE=$CDN_BASE" >> $GITHUB_ENV | |
| echo "OBS_PATH=$OBS_PATH" >> $GITHUB_ENV | |
| # Set outputs for job-level export | |
| echo "version_timestamp=$VERSION_TIMESTAMP" >> $GITHUB_OUTPUT | |
| echo "cdn_base=$CDN_BASE" >> $GITHUB_OUTPUT | |
| echo "obs_path=$OBS_PATH" >> $GITHUB_OUTPUT | |
| echo "Version-Timestamp: $VERSION_TIMESTAMP" | |
| echo "CDN Base: $CDN_BASE" | |
| echo "OBS Path: $OBS_PATH" | |
| # 构建Playground | |
| - name: Build Playground | |
| run: pnpm build:playground | |
| env: | |
| PLAYGROUND_BASE: ${{ env.CDN_BASE }} | |
| - name: Verify build output | |
| run: ls -la ./packages/playground/dist | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: playground-dist | |
| path: ./packages/playground/dist/ | |
| retention-days: 1 | |
| deploy-cdn: | |
| runs-on: ubuntu-latest | |
| needs: [check-secrets, build] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Download build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: playground-dist | |
| path: ./packages/playground/dist/ | |
| - name: Install obsutil | |
| run: | | |
| curl -o obsutil.tar.gz https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz | |
| tar -xzf obsutil.tar.gz | |
| chmod +x obsutil_linux_amd64_*/obsutil | |
| sudo mv obsutil_linux_amd64_*/obsutil /usr/local/bin/obsutil | |
| - name: Configure and Upload to OBS | |
| run: | | |
| obsutil config -i=${{ env.HUAWEI_CLOUD_AK }} \ | |
| -k=${{ env.HUAWEI_CLOUD_SK }} \ | |
| -e=${{ env.HUAWEI_CLOUD_ENDPOINT }} | |
| # Upload to versioned path | |
| obsutil cp ./packages/playground/dist \ | |
| obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path }} \ | |
| -r -f | |
| echo "Uploaded to: obs://${{ env.HUAWEI_CLOUD_BUCKET }}/${{ needs.build.outputs.obs-path }}" | |
| echo "CDN URL: https://res-static.opentiny.design/${{ needs.build.outputs.obs-path }}" |