Update main_product-docs-prod.yml #31
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: Build and deploy Docusaurus site to Azure Blob Storage | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - develop # Add your development branch here | |
| workflow_dispatch: | |
| inputs: | |
| environment: | |
| description: 'Environment to deploy to' | |
| required: true | |
| default: 'development' | |
| type: choice | |
| options: | |
| - development | |
| - production | |
| jobs: | |
| determine-environment: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| environment: ${{ steps.set-env.outputs.environment }} | |
| steps: | |
| - name: Determine environment | |
| id: set-env | |
| run: | | |
| if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then | |
| echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT | |
| elif [[ "${{ github.ref }}" == "refs/heads/main" ]]; then | |
| echo "environment=production" >> $GITHUB_OUTPUT | |
| else | |
| echo "environment=development" >> $GITHUB_OUTPUT | |
| fi | |
| build: | |
| runs-on: self-hosted | |
| needs: determine-environment | |
| environment: ${{ needs.determine-environment.outputs.environment }} | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Check out source code | |
| uses: actions/checkout@v4 | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v3 | |
| with: | |
| node-version: '22.x' | |
| - name: Cache Node.js dependencies | |
| uses: actions/cache@v3 | |
| with: | |
| path: ~/.npm | |
| key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} | |
| restore-keys: | | |
| ${{ runner.os }}-node- | |
| - name: Install dependencies and build site | |
| run: | | |
| npm ci | |
| npm run build | |
| env: | |
| NODE_OPTIONS: "--max-old-space-size=16384" | |
| DOCUSAURUS_URL: "https://${{ secrets.STORAGE_ACCOUNT_NAME }}.z13.web.core.windows.net" | |
| # Add any other environment-specific build variables here | |
| NODE_ENV: ${{ needs.determine-environment.outputs.environment }} | |
| - name: Upload artifact for deployment | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: build-output | |
| path: build/ | |
| deploy: | |
| runs-on: ubuntu-latest | |
| needs: [build, determine-environment] | |
| environment: ${{ needs.determine-environment.outputs.environment }} | |
| steps: | |
| - name: Download build artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: build-output | |
| path: build/ | |
| # Azure login step removed - using storage account key instead | |
| - name: Install azcopy | |
| run: | | |
| # Download and install azcopy for faster uploads | |
| wget -O azcopy.tar.gz https://aka.ms/downloadazcopy-v10-linux | |
| tar -xf azcopy.tar.gz --strip-components=1 | |
| sudo mv azcopy /usr/local/bin/ | |
| azcopy --version | |
| - name: Upload to Azure Blob Storage with AzCopy | |
| run: | | |
| echo "Deploying to ${{ needs.determine-environment.outputs.environment }} environment" | |
| echo "Starting high-performance upload of ~60,000 files..." | |
| # Create SAS token for azcopy (more secure than using key directly) | |
| end_date=$(date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ') | |
| sas_token=$(az storage container generate-sas \ | |
| --account-name ${{ secrets.STORAGE_ACCOUNT_NAME }} \ | |
| --account-key ${{ secrets.STORAGE_ACCOUNT_KEY }} \ | |
| --name '$web' \ | |
| --permissions dlrw \ | |
| --expiry $end_date \ | |
| --output tsv) | |
| # Use azcopy for parallel uploads (much faster for many files) | |
| azcopy copy "./build/*" \ | |
| "https://${{ secrets.STORAGE_ACCOUNT_NAME }}.blob.core.windows.net/\$web?$sas_token" \ | |
| --recursive \ | |
| --overwrite=true \ | |
| --log-level=WARNING \ | |
| --cap-mbps=0 \ | |
| --block-size-mb=4 \ | |
| --include-pattern="*" | |
| echo "Upload completed!" | |
| - name: Set blob content types efficiently | |
| run: | | |
| echo "Setting content types for web files..." | |
| # Create a properties file for batch operations | |
| cat > set_content_types.sh << 'EOF' | |
| #!/bin/bash | |
| # Function to set content types in parallel | |
| set_content_type() { | |
| local pattern=$1 | |
| local content_type=$2 | |
| az storage blob list \ | |
| --account-name ${{ secrets.STORAGE_ACCOUNT_NAME }} \ | |
| --account-key ${{ secrets.STORAGE_ACCOUNT_KEY }} \ | |
| --container-name '$web' \ | |
| --prefix "" \ | |
| --query "[?ends_with(name, '$pattern')].name" \ | |
| --output tsv | \ | |
| xargs -P 10 -I {} az storage blob update \ | |
| --account-name ${{ secrets.STORAGE_ACCOUNT_NAME }} \ | |
| --account-key ${{ secrets.STORAGE_ACCOUNT_KEY }} \ | |
| --container-name '$web' \ | |
| --name "{}" \ | |
| --content-type "$content_type" \ | |
| --output none | |
| } | |
| # Set content types in parallel (10 concurrent operations) | |
| echo "Setting HTML content types..." | |
| set_content_type ".html" "text/html" | |
| echo "Setting CSS content types..." | |
| set_content_type ".css" "text/css" | |
| echo "Setting JS content types..." | |
| set_content_type ".js" "application/javascript" | |
| echo "Setting JSON content types..." | |
| set_content_type ".json" "application/json" | |
| echo "Setting SVG content types..." | |
| set_content_type ".svg" "image/svg+xml" | |
| echo "Setting image content types..." | |
| set_content_type ".png" "image/png" | |
| set_content_type ".jpg" "image/jpeg" | |
| set_content_type ".jpeg" "image/jpeg" | |
| set_content_type ".gif" "image/gif" | |
| set_content_type ".webp" "image/webp" | |
| echo "Setting font content types..." | |
| set_content_type ".woff" "font/woff" | |
| set_content_type ".woff2" "font/woff2" | |
| set_content_type ".ttf" "font/ttf" | |
| set_content_type ".eot" "application/vnd.ms-fontobject" | |
| echo "Content types updated!" | |
| EOF | |
| chmod +x set_content_types.sh | |
| ./set_content_types.sh | |
| - name: Purge CDN endpoint (if configured) | |
| run: | | |
| if [[ -n "${{ secrets.CDN_ENDPOINT_NAME }}" ]] && [[ -n "${{ secrets.CDN_PROFILE_NAME }}" ]] && [[ -n "${{ secrets.CDN_RESOURCE_GROUP }}" ]]; then | |
| echo "Note: CDN purge requires Azure login. Skipping CDN purge when using storage key authentication." | |
| echo "To use CDN purge, you'll need to use Azure AD authentication or purge CDN manually." | |
| else | |
| echo "CDN configuration not found, skipping CDN purge." | |
| fi | |
| - name: Display deployment URL | |
| run: | | |
| echo "🚀 Deployment complete!" | |
| echo "Environment: ${{ needs.determine-environment.outputs.environment }}" | |
| echo "URL: https://${{ secrets.STORAGE_ACCOUNT_NAME }}.z13.web.core.windows.net" | |
| if [[ -n "${{ secrets.CUSTOM_DOMAIN }}" ]]; then | |
| echo "Custom Domain: ${{ secrets.CUSTOM_DOMAIN }}" | |
| fi |