Skip to content

Deploy to GitHub Pages #347

Deploy to GitHub Pages

Deploy to GitHub Pages #347

# 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.2' # 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