Skip to content

fix(blog): always return categories on BlogpostListing (#1624) #1415

fix(blog): always return categories on BlogpostListing (#1624)

fix(blog): always return categories on BlogpostListing (#1624) #1415

Workflow file for this run

name: Release Tagging
on:
pull_request_target:
types: [opened]
push:
branches:
- main
- next
permissions:
contents: write # Necessary for accessing and modifying repository content
pull-requests: write # Necessary for interacting with pull requests
actions: write # Necessary for triggering other workflows
jobs:
tag-discussion:
if: github.event_name == 'pull_request_target' && github.event.action == 'opened' && github.event.pull_request.base.ref == 'main'
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.base.ref }} # Checkout the base branch (target repository)
repository: ${{ github.event.pull_request.base.repo.full_name }} # Checkout from the target repo
- name: Calculate new versions
id: calculate_versions
run: |
git fetch --tags
LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="0.0.0"
fi
MAJOR=$(echo $LATEST_TAG | cut -d. -f1)
MINOR=$(echo $LATEST_TAG | cut -d. -f2)
PATCH=$(echo $LATEST_TAG | cut -d. -f3)
NEW_PATCH_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
NEW_MINOR_VERSION="$MAJOR.$((MINOR + 1)).0"
NEW_MAJOR_VERSION="$((MAJOR + 1)).0.0"
echo "patch_version=$NEW_PATCH_VERSION" >> $GITHUB_OUTPUT
echo "minor_version=$NEW_MINOR_VERSION" >> $GITHUB_OUTPUT
echo "major_version=$NEW_MAJOR_VERSION" >> $GITHUB_OUTPUT
- name: Start Discussion for Tagging
uses: peter-evans/create-or-update-comment@v2
id: comment
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
body: |
## Tagging Options
Should a new tag be published when this PR is merged?
- 👍 for **Patch** ${{ steps.calculate_versions.outputs.patch_version }} update
- 🎉 for **Minor** ${{ steps.calculate_versions.outputs.minor_version }} update
- 🚀 for **Major** ${{ steps.calculate_versions.outputs.major_version }} update
prerelease-tag-discussion:
if: github.event_name == 'pull_request_target' && github.event.action == 'opened' && github.event.pull_request.base.ref == 'next'
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.base.ref }}
repository: ${{ github.event.pull_request.base.repo.full_name }}
- name: Calculate prerelease bases
id: calculate_versions
run: |
git fetch --tags
LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="0.0.0"
fi
MAJOR=$(echo $LATEST_TAG | cut -d. -f1)
MINOR=$(echo $LATEST_TAG | cut -d. -f2)
PATCH=$(echo $LATEST_TAG | cut -d. -f3)
echo "patch_base=$MAJOR.$MINOR.$((PATCH + 1))" >> $GITHUB_OUTPUT
echo "minor_base=$MAJOR.$((MINOR + 1)).0" >> $GITHUB_OUTPUT
echo "major_base=$((MAJOR + 1)).0.0" >> $GITHUB_OUTPUT
- name: Start Discussion for Prerelease Tagging
uses: peter-evans/create-or-update-comment@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
body: |
## Prerelease Tagging
Merging this PR will publish a prerelease automatically.
By default this is a **Patch prerelease** (`${{ steps.calculate_versions.outputs.patch_base }}-next.N`).
A maintainer can override the bump by reacting:
- 👍 **Patch prerelease** `${{ steps.calculate_versions.outputs.patch_base }}-next.N` (default)
- 🎉 **Minor prerelease** `${{ steps.calculate_versions.outputs.minor_base }}-next.N`
- 🚀 **Major prerelease** `${{ steps.calculate_versions.outputs.major_base }}-next.N`
`.N` auto-increments per base. Consumers opt in by pinning the exact tag in `deno.json` imports, e.g.
`"apps/": "https://cdn.jsdelivr.net/gh/deco-cx/apps@${{ steps.calculate_versions.outputs.patch_base }}-next.1/"`.
The stable `apps@<X.Y.Z>` pin is unaffected because `deno task update` filters out semver prereleases by default.
determine-tag:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Find the Merged Pull Request
id: find_pr
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
BASE_BRANCH="main"
RECENT_PR=$(gh pr list --state closed --base $BASE_BRANCH --json number,title,closedAt --jq '.[] | select(.closedAt >= "'$(date -u -d '1 minute ago' +%Y-%m-%dT%H:%M:%SZ)'") | {number, title}')
echo "RECENT_PR=$RECENT_PR" >> $GITHUB_ENV
echo "PR_NUMBER=$(echo $RECENT_PR | jq -r '.number')" >> $GITHUB_ENV
- name: Fetch latest stable tag (excluding prerelease tags)
id: get_latest_tag
run: |
git fetch --tags
LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="0.0.0"
fi
echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT
- name: Determine the next version based on comments
id: determine_version
if: env.PR_NUMBER != ''
env:
PR_NUMBER: ${{ env.PR_NUMBER }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
LATEST_TAG=${{ steps.get_latest_tag.outputs.latest_tag }}
MAJOR=$(echo $LATEST_TAG | cut -d. -f1)
MINOR=$(echo $LATEST_TAG | cut -d. -f2)
PATCH=$(echo $LATEST_TAG | cut -d. -f3)
# Define allowed users as a JSON array
ALLOWED_USERS=$(cat MAINTAINERS.txt | jq -R -s -c 'split("\n")[:-1]')
echo "Maintainers list: $ALLOWED_USERS"
# Fetch reactions and filter by allowed users
REACTION=$(gh api graphql -f query='
query {
repository(owner:"${{ github.repository_owner }}", name:"${{ github.event.repository.name }}") {
pullRequest(number: '${PR_NUMBER}') {
comments(last: 100) {
nodes {
body
id
reactions(last: 100) {
nodes {
content
user {
login
}
}
}
}
}
}
}
}' | jq -r --argjson allowed_users "$ALLOWED_USERS" '
.data.repository.pullRequest.comments.nodes[] |
select(.body | contains("## Tagging Options")) |
.reactions.nodes[] |
select(.user.login | IN($allowed_users[])) |
.content'
)
# Print the reaction to debug
echo "Captured reaction: $REACTION"
# Convert reaction to uppercase to handle any case inconsistencies
REACTION=$(echo "$REACTION" | tr '[:lower:]' '[:upper:]')
# Determine the new tag version based on the allowed reactions
if [[ "$REACTION" == *"ROCKET"* ]]; then
NEW_TAG="$((MAJOR + 1)).0.0"
elif [[ "$REACTION" == *"HOORAY"* ]]; then
NEW_TAG="$MAJOR.$((MINOR + 1)).0"
elif [[ "$REACTION" == *"THUMBS_UP"* ]]; then # Ensure thumbs up reaction is correctly identified
NEW_TAG="$MAJOR.$MINOR.$((PATCH + 1))"
else
echo "No valid reactions found for version bump. Exiting."
exit 0
fi
echo "new_version=$NEW_TAG" >> $GITHUB_OUTPUT
- name: Update deno.json Version
if: steps.determine_version.outputs.new_version != ''
run: |
jq --arg new_version "${{ steps.determine_version.outputs.new_version }}" '.version = $new_version' deno.json > tmp.$$.json && mv tmp.$$.json deno.json
git config user.name "decobot"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add deno.json
git commit -m "Update version to ${{ steps.determine_version.outputs.new_version }}"
git push origin main
- name: Create and Push Tag
if: steps.determine_version.outputs.new_version != ''
run: |
git tag ${{ steps.determine_version.outputs.new_version }}
git push origin ${{ steps.determine_version.outputs.new_version }}
- name: Trigger Release Workflow
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.everest-preview+json" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/release.yaml/dispatches \
-d '{"ref":"main", "inputs":{"tag_name":"${{ steps.determine_version.outputs.new_version }}"}}'
determine-prerelease-tag:
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
with:
ref: next
- name: Find the Merged Pull Request
id: find_pr
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
BASE_BRANCH="next"
RECENT_PR=$(gh pr list --state closed --base $BASE_BRANCH --json number,title,closedAt --jq '.[] | select(.closedAt >= "'$(date -u -d '1 minute ago' +%Y-%m-%dT%H:%M:%SZ)'") | {number, title}')
echo "RECENT_PR=$RECENT_PR" >> $GITHUB_ENV
echo "PR_NUMBER=$(echo $RECENT_PR | jq -r '.number')" >> $GITHUB_ENV
- name: Fetch latest stable tag (excluding prerelease tags)
id: get_latest_tag
run: |
git fetch --tags
LATEST_TAG=$(git tag --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="0.0.0"
fi
echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT
- name: Determine the next prerelease version
id: determine_version
if: env.PR_NUMBER != ''
env:
PR_NUMBER: ${{ env.PR_NUMBER }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
LATEST_TAG=${{ steps.get_latest_tag.outputs.latest_tag }}
MAJOR=$(echo $LATEST_TAG | cut -d. -f1)
MINOR=$(echo $LATEST_TAG | cut -d. -f2)
PATCH=$(echo $LATEST_TAG | cut -d. -f3)
# Define allowed users as a JSON array
ALLOWED_USERS=$(cat MAINTAINERS.txt | jq -R -s -c 'split("\n")[:-1]')
echo "Maintainers list: $ALLOWED_USERS"
# Fetch reactions on the prerelease tagging comment and filter by allowed users
REACTION=$(gh api graphql -f query='
query {
repository(owner:"${{ github.repository_owner }}", name:"${{ github.event.repository.name }}") {
pullRequest(number: '${PR_NUMBER}') {
comments(last: 100) {
nodes {
body
id
reactions(last: 100) {
nodes {
content
user {
login
}
}
}
}
}
}
}
}' | jq -r --argjson allowed_users "$ALLOWED_USERS" '
.data.repository.pullRequest.comments.nodes[] |
select(.body | contains("## Prerelease Tagging")) |
.reactions.nodes[] |
select(.user.login | IN($allowed_users[])) |
.content'
)
echo "Captured reaction: $REACTION"
REACTION=$(echo "$REACTION" | tr '[:lower:]' '[:upper:]')
# Determine base version: 🚀 major, 🎉 minor, anything else (incl. 👍 or no reaction) -> patch.
# Unlike the stable flow, no-reaction defaults to PATCH instead of skipping the release.
if [[ "$REACTION" == *"ROCKET"* ]]; then
BASE="$((MAJOR + 1)).0.0"
elif [[ "$REACTION" == *"HOORAY"* ]]; then
BASE="$MAJOR.$((MINOR + 1)).0"
else
BASE="$MAJOR.$MINOR.$((PATCH + 1))"
fi
# Compute next N for this base (highest existing <BASE>-next.<N> + 1, else 1)
LATEST_N=$(git tag --list "${BASE}-next.*" | awk -F'-next.' 'NF==2 {print $2}' | grep -E '^[0-9]+$' | sort -n | tail -n 1)
if [ -z "$LATEST_N" ]; then
N=1
else
N=$((LATEST_N + 1))
fi
NEW_VERSION="${BASE}-next.${N}"
echo "Computed prerelease version: $NEW_VERSION"
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Update deno.json Version
if: steps.determine_version.outputs.new_version != ''
run: |
jq --arg new_version "${{ steps.determine_version.outputs.new_version }}" '.version = $new_version' deno.json > tmp.$$.json && mv tmp.$$.json deno.json
git config user.name "decobot"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add deno.json
git commit -m "Update version to ${{ steps.determine_version.outputs.new_version }}"
git push origin next
- name: Create and Push Tag
if: steps.determine_version.outputs.new_version != ''
run: |
git tag ${{ steps.determine_version.outputs.new_version }}
git push origin ${{ steps.determine_version.outputs.new_version }}
- name: Trigger Release Workflow
if: steps.determine_version.outputs.new_version != ''
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.everest-preview+json" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/release.yaml/dispatches \
-d '{"ref":"next", "inputs":{"tag_name":"${{ steps.determine_version.outputs.new_version }}"}}'