Deploy to GitHub Pages #338
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
| # Sample workflow for building and deploying a Jekyll site to GitHub Pages | |
| name: Deploy to GitHub Pages | |
| on: | |
| # Runs on pushes targeting the default branch | |
| push: | |
| branches: [main] | |
| # Allows you to run this workflow manually from the Actions tab | |
| workflow_dispatch: | |
| inputs: | |
| debug_enabled: | |
| description: 'Run the build with tmate set "debug_enabled"' | |
| type: boolean | |
| required: false | |
| default: false | |
| skip_update_addons: | |
| description: 'Skip addon updates and go directly to build' | |
| type: boolean | |
| required: false | |
| default: false | |
| schedule: | |
| - cron: '0 0 * * *' # Midnight UTC | |
| # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages | |
| permissions: | |
| contents: write # for git push | |
| pages: write | |
| id-token: write | |
| # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. | |
| # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. | |
| concurrency: | |
| group: "pages" | |
| cancel-in-progress: false | |
| jobs: | |
| update-addons: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Load 1password secret(s) | |
| if: ${{ !inputs.skip_update_addons && !contains(github.event.head_commit.message, '[skip update]') }} | |
| uses: 1password/load-secrets-action@v3 | |
| with: | |
| export-env: true | |
| env: | |
| OP_SERVICE_ACCOUNT_TOKEN: "${{ secrets.TESTS_SERVICE_ACCOUNT_TOKEN }}" | |
| DDEV_ADDON_REGISTRY_TOKEN: "op://test-secrets/DDEV_ADDON_REGISTRY_TOKEN/credential" | |
| - name: Setup tmate session | |
| if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} | |
| uses: mxschmitt/action-tmate@v3 | |
| with: | |
| limit-access-to-actor: true | |
| - name: Fetch add-on data with Go | |
| if: ${{ !inputs.skip_update_addons && !contains(github.event.head_commit.message, '[skip update]') }} | |
| run: | | |
| cd go | |
| go mod vendor | |
| go run main.go | |
| - name: Check for GitHub search API degradation | |
| if: ${{ !inputs.skip_update_addons && !contains(github.event.head_commit.message, '[skip update]') }} | |
| run: | | |
| # Check if any deleted addon repos still have the ddev-get topic (indicating search API issues) | |
| DELETED_ADDONS=$(git status --porcelain | grep '^.D.*\.md$' | sed 's|.D _addons/\([^/]*\)/\([^/]*\)\.md|\1/\2|') | |
| if [ -n "$DELETED_ADDONS" ]; then | |
| echo "Found deleted addons, checking for ddev-get topic..." | |
| while IFS= read -r repo; do | |
| echo "Checking $repo..." | |
| PAGE_CONTENT=$(curl -sf "https://github.com/$repo") | |
| if echo "$PAGE_CONTENT" | grep -q '>Public archive<'; then | |
| echo "Repository $repo is archived, safe to delete." | |
| elif echo "$PAGE_CONTENT" | grep -q '"Topic: ddev-get"'; then | |
| echo "WARNING: Repository $repo has ddev-get topic but was deleted (search API degraded)" | |
| echo "GitHub search API appears degraded. Undeleting file to prevent data loss." | |
| # Restore the deleted files | |
| ADDON_FILE="_addons/$repo.md" | |
| OWNER=$(echo "$repo" | cut -d'/' -f1) | |
| OWNER_INDEX="_addons/$OWNER/index.html" | |
| git checkout HEAD -- "$ADDON_FILE" || { echo "Could not restore $ADDON_FILE"; exit 1; } | |
| git checkout HEAD -- "$OWNER_INDEX" || { echo "Could not restore $OWNER_INDEX"; exit 1; } | |
| echo "Files $ADDON_FILE and $OWNER_INDEX have been restored." | |
| else | |
| echo "Repository $repo does not have ddev-get topic, safe to delete." | |
| fi | |
| done <<< "$DELETED_ADDONS" | |
| else | |
| echo "No addon deletions detected." | |
| fi | |
| - name: Commit and push changes | |
| if: ${{ !inputs.skip_update_addons && !contains(github.event.head_commit.message, '[skip update]') }} | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git add _addons/ | |
| git commit -m "Update addons [skip ci]" || echo "No changes to commit" | |
| git push | |
| # Build job | |
| build: | |
| runs-on: ubuntu-latest | |
| needs: update-addons | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| with: | |
| ref: main | |
| - name: Setup Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: '3.1' # Not needed with a .ruby-version file | |
| bundler-cache: true # runs 'bundle install' and caches installed gems automatically | |
| cache-version: 0 # Increment this number if you need to re-download cached gems | |
| - name: Setup Pages | |
| id: pages | |
| uses: actions/configure-pages@v5 | |
| - name: Build with Jekyll | |
| # Outputs to the './_site' directory by default | |
| run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" --verbose | |
| env: | |
| JEKYLL_ENV: production | |
| - name: Upload artifact | |
| # Automatically uploads an artifact from the './_site' directory by default | |
| uses: actions/upload-pages-artifact@v4 | |
| # Deployment job | |
| deploy: | |
| environment: | |
| name: github-pages | |
| url: ${{ steps.deployment.outputs.page_url }} | |
| runs-on: ubuntu-latest | |
| needs: build | |
| steps: | |
| - name: Deploy to GitHub Pages | |
| id: deployment | |
| uses: actions/deploy-pages@v4 |