Skip to content

Upgrade Hugo version and create Discord export setup #32

Upgrade Hugo version and create Discord export setup

Upgrade Hugo version and create Discord export setup #32

Workflow file for this run

name: Build and Deploy Hugo Site
on:
push:
branches:
- main
pull_request:
permissions:
contents: write
pages: write
id-token: write
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
HUGO_VERSION: 0.128.0
steps:
- name: Install Hugo CLI
run: |
wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
&& sudo dpkg -i ${{ runner.temp }}/hugo.deb
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install Node dependencies
run: |
if [ -f package.json ]; then
npm install
fi
- name: Create required directories
run: |
mkdir -p data
mkdir -p content/discord
mkdir -p static/discord
# -----------------------------------------------------------------------
# Discord Mirror Export
# Runs before Hugo so generated content/discord/ pages are present at
# build time. Skipped on pull requests (no access to secrets) and when
# the bot token is absent, so forks and draft PRs still build cleanly.
# -----------------------------------------------------------------------
- name: Export Discord mirror content
if: github.event_name != 'pull_request' && env.DISCORD_BOT_TOKEN != ''
env:
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }}
run: |
echo "Running Discord mirror export..."
pwsh -NonInteractive -File tools/discord-mirror/Export-DiscordMirror.ps1 \
-ConfigPath config/discord-mirror.json \
-BotToken "$DISCORD_BOT_TOKEN"
- name: Verify Discord export output
if: github.event_name != 'pull_request' && env.DISCORD_BOT_TOKEN != ''
env:
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }}
run: |
echo "=== content/discord/ ==="
find content/discord -type f | sort || echo "(empty)"
echo "=== static/discord/ ==="
find static/discord -type f | sort || echo "(empty)"
echo "=== search index record count ==="
python3 -c "import json,sys; d=json.load(open('static/discord/search-index.json')); print(f'{len(d)} records')" 2>/dev/null || echo "(unreadable or empty)"
# -----------------------------------------------------------------------
# Fallback: if the export was skipped (PR or missing token), ensure Hugo
# has a valid _index.md so the /discord/ route doesn't 404 on a clean
# build. Real content will be present on main branch builds.
# -----------------------------------------------------------------------
- name: Write Discord section placeholder (PR / no-token builds only)
if: github.event_name == 'pull_request' || env.DISCORD_BOT_TOKEN == ''
run: |
if [ ! -f content/discord/_index.md ]; then
cat > content/discord/_index.md << 'EOF'
---
title: "Discord Archive"
description: "Selected Discord content mirrored for public search and discovery."
layout: single
draft: false
---
Discord archive content is generated during the main branch build.
EOF
fi
# -----------------------------------------------------------------------
# Community stats (Discourse)
# -----------------------------------------------------------------------
- name: Update community stats
run: |
if [ -f .github/scripts/fetch-discourse-activity.js ]; then
echo "Running Discourse activity script..."
node .github/scripts/fetch-discourse-activity.js || {
echo "Discourse script failed, creating fallback data..."
cat > data/community_stats.json << 'EOF'
{
"activities": [
{
"message": "PowerShell 7.4.1 released with security updates",
"time": "Last week",
"type": "release",
"color": "bg-green-500"
},
{
"message": "New Azure PowerShell module available",
"time": "2 weeks ago",
"type": "update",
"color": "bg-blue-500"
},
{
"message": "Community discussions active on forums",
"time": "3 days ago",
"type": "community",
"color": "bg-purple-500"
},
{
"message": "PowerShell Gallery security improvements",
"time": "1 month ago",
"type": "security",
"color": "bg-orange-500"
}
],
"stats": {
"total_topics": 15420,
"total_posts": 85230,
"active_users": 12500,
"topics_this_week": 45
},
"last_updated": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)",
"fallback": true
}
EOF
}
else
echo "No Discourse script found, creating default data..."
cat > data/community_stats.json << 'EOF'
{
"activities": [
{
"message": "PowerShell community thriving",
"time": "Ongoing",
"type": "community",
"color": "bg-blue-500"
},
{
"message": "Join our active forums",
"time": "Always",
"type": "invitation",
"color": "bg-green-500"
}
],
"stats": {
"total_topics": 15000,
"total_posts": 80000,
"active_users": 12000,
"topics_this_week": 40
},
"last_updated": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)",
"fallback": true
}
EOF
fi
- name: Verify community stats file exists
run: |
if [ -f data/community_stats.json ]; then
echo "✅ Community stats file created successfully"
echo "File contents:"
cat data/community_stats.json
else
echo "❌ Community stats file not found"
exit 1
fi
- name: Build with Hugo
env:
HUGO_ENVIRONMENT: production
HUGO_ENV: production
run: |
# Clean docs directory
rm -rf docs
# Build Hugo site to docs directory
hugo \
--gc \
--minify \
--destination docs \
- name: Add .nojekyll file
run: touch docs/.nojekyll
- name: Commit and push to main
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
# Add files that exist
git add docs/ || echo "No docs directory to add"
# Only add data files if they exist
if [ -f data/community_stats.json ]; then
git add data/community_stats.json
fi
# Only commit if there are changes
if ! git diff --staged --quiet; then
git commit -m "Deploy Hugo site to docs/ [skip ci]"
git push
else
echo "No changes to commit"
fi