Thanks to visit codestin.com
Credit goes to github.com

Skip to content

docs: add automatic release calendar updates in docs #17531

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -924,3 +924,55 @@ jobs:
continue-on-error: true
run: |
make sqlc-push
update-calendar:
name: "Update release calendar in docs"
runs-on: "ubuntu-latest"
needs: [release, publish-homebrew, publish-winget, publish-sqlc]
if: ${{ !inputs.dry_run }}
permissions:
contents: write
pull-requests: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
with:
egress-policy: audit

- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0 # Needed to get all tags for version calculation

- name: Set up Git
run: |
git config user.name "Coder CI"
git config user.email "[email protected]"
- name: Run update script
run: |
./scripts/update-release-calendar.sh
make fmt/markdown
- name: Check for changes
id: check_changes
run: |
if git diff --quiet docs/install/releases/index.md; then
echo "No changes detected in release calendar."
echo "changes=false" >> $GITHUB_OUTPUT
else
echo "Changes detected in release calendar."
echo "changes=true" >> $GITHUB_OUTPUT
fi
- name: Create Pull Request
if: steps.check_changes.outputs.changes == 'true'
uses: peter-evans/create-pull-request@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3.0.0
with:
commit-message: "docs: update release calendar"
title: "docs: update release calendar"
body: |
This PR automatically updates the release calendar in the docs.
branch: bot/update-release-calendar
delete-branch: true
labels: docs
24 changes: 12 additions & 12 deletions docs/install/releases/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,18 +53,18 @@ Best practices for installing Coder can be found on our [install](../index.md)
pages.

## Release schedule

| Release name | Release Date | Status |
|--------------|--------------------|------------------|
| 2.12.x | June 04, 2024 | Not Supported |
| 2.13.x | July 02, 2024 | Not Supported |
| 2.14.x | August 06, 2024 | Not Supported |
| 2.15.x | September 03, 2024 | Not Supported |
| 2.16.x | October 01, 2024 | Not Supported |
| 2.17.x | November 05, 2024 | Not Supported |
| 2.18.x | December 03, 2024 | Security Support |
| 2.19.x | February 04, 2024 | Stable |
| 2.20.x | March 05, 2024 | Mainline |
<!-- Autogenerated release calendar from scripts/update-release-calendar.sh -->
<!-- RELEASE_CALENDAR_START -->
| Release name | Release Date | Status | Latest Release |
|------------------------------------------------|-------------------|------------------|----------------------------------------------------------------|
| [2.16](https://coder.com/changelog/coder-2-16) | November 05, 2024 | Not Supported | [v2.16.1](https://github.com/coder/coder/releases/tag/v2.16.1) |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [linkspector] reported by reviewdog 🐶
Cannot reach https://coder.com/changelog/coder-2-16 Status: 404

| [2.17](https://coder.com/changelog/coder-2-17) | December 03, 2024 | Not Supported | [v2.17.3](https://github.com/coder/coder/releases/tag/v2.17.3) |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [linkspector] reported by reviewdog 🐶
Cannot reach https://coder.com/changelog/coder-2-17 Status: 404

| [2.18](https://coder.com/changelog/coder-2-18) | February 04, 2025 | Not Supported | [v2.18.5](https://github.com/coder/coder/releases/tag/v2.18.5) |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [linkspector] reported by reviewdog 🐶
Cannot reach https://coder.com/changelog/coder-2-18 Status: 404

| [2.19](https://coder.com/changelog/coder-2-19) | February 04, 2025 | Security Support | [v2.19.1](https://github.com/coder/coder/releases/tag/v2.19.1) |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [linkspector] reported by reviewdog 🐶
Cannot reach https://coder.com/changelog/coder-2-19 Status: 404

| [2.20](https://coder.com/changelog/coder-2-20) | March 04, 2025 | Stable | [v2.20.2](https://github.com/coder/coder/releases/tag/v2.20.2) |

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [linkspector] reported by reviewdog 🐶
Cannot reach https://coder.com/changelog/coder-2-20 Status: 404

| [2.21](https://coder.com/changelog/coder-2-21) | April 01, 2025 | Mainline | [v2.21.1](https://github.com/coder/coder/releases/tag/v2.21.1) |
| 2.22 | May 07, 2024 | Not Released | N/A |
<!-- RELEASE_CALENDAR_END -->

> [!TIP]
> We publish a
Expand Down
205 changes: 205 additions & 0 deletions scripts/update-release-calendar.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
#!/bin/bash

set -euo pipefail

# This script automatically updates the release calendar in docs/install/releases/index.md
# It calculates the releases based on the first Tuesday of each month rule
# and updates the status of each release (Not Supported, Security Support, Stable, Mainline, Not Released)

DOCS_FILE="docs/install/releases/index.md"

# Define unique markdown comments as anchors
CALENDAR_START_MARKER="<!-- RELEASE_CALENDAR_START -->"
CALENDAR_END_MARKER="<!-- RELEASE_CALENDAR_END -->"

# Get current date
current_date=$(date +"%Y-%m-%d")
current_month=$(date +"%m")
current_year=$(date +"%Y")

# Function to get the first Tuesday of a given month and year
get_first_tuesday() {
local year=$1
local month=$2
local first_day
local days_until_tuesday
local first_tuesday

# Find the first day of the month
first_day=$(date -d "$year-$month-01" +"%u")

# Calculate days until first Tuesday (if day 1 is Tuesday, first_day=2)
days_until_tuesday=$((first_day == 2 ? 0 : (9 - first_day) % 7))

# Get the date of the first Tuesday
first_tuesday=$(date -d "$year-$month-01 +$days_until_tuesday days" +"%Y-%m-%d")

echo "$first_tuesday"
}

# Function to format date as "Month DD, YYYY"
format_date() {
date -d "$1" +"%B %d, %Y"
}

# Function to get the latest patch version for a minor release
get_latest_patch() {
local version_major=$1
local version_minor=$2
local tags
local latest

# Get all tags for this minor version
tags=$(cd "$(git rev-parse --show-toplevel)" && git tag | grep "^v$version_major\\.$version_minor\\." | sort -V)

# Get the latest one
latest=$(echo "$tags" | tail -1)

if [ -z "$latest" ]; then
# If no tags found, return empty
echo ""
else
# Return without the v prefix
echo "${latest#v}"
fi
}

# Generate releases table showing:
# - 3 previous unsupported releases
# - 1 security support release (n-2)
# - 1 stable release (n-1)
# - 1 mainline release (n)
# - 1 next release (n+1)
generate_release_calendar() {
local result=""
local version_major=2
local latest_version
local version_minor
local start_minor

# Find the current minor version by looking at the last mainline release tag
latest_version=$(cd "$(git rev-parse --show-toplevel)" && git tag | grep '^v[0-9]*\.[0-9]*\.[0-9]*$' | sort -V | tail -1)
version_minor=$(echo "$latest_version" | cut -d. -f2)

# Start with 3 unsupported releases back
start_minor=$((version_minor - 5))

# Initialize the calendar table with an additional column for latest release
result="| Release name | Release Date | Status | Latest Release |\n"
result+="|--------------|--------------|--------|----------------|\n"

# Generate rows for each release (7 total: 3 unsupported, 1 security, 1 stable, 1 mainline, 1 next)
for i in {0..6}; do
# Calculate release minor version
local rel_minor=$((start_minor + i))
# Format release name without the .x
local version_name="$version_major.$rel_minor"
local release_date
local formatted_date
local latest_patch
local patch_link
local status
local formatted_version_name

# Calculate release month and year based on release pattern
# This is a simplified calculation assuming monthly releases
local rel_month=$(((current_month - (5 - i) + 12) % 12))
[[ $rel_month -eq 0 ]] && rel_month=12
local rel_year=$current_year
if [[ $rel_month -gt $current_month ]]; then
rel_year=$((rel_year - 1))
fi
if [[ $rel_month -lt $current_month && $i -gt 5 ]]; then
rel_year=$((rel_year + 1))
fi

# Skip January releases starting from 2025
if [[ $rel_month -eq 1 && $rel_year -ge 2025 ]]; then
rel_month=2
# No need to reassign rel_year to itself
fi

# Get release date (first Tuesday of the month)
release_date=$(get_first_tuesday "$rel_year" "$(printf "%02d" "$rel_month")")
formatted_date=$(format_date "$release_date")

# Get latest patch version
latest_patch=$(get_latest_patch "$version_major" "$rel_minor")
if [ -n "$latest_patch" ]; then
patch_link="[v${latest_patch}](https://github.com/coder/coder/releases/tag/v${latest_patch})"
else
patch_link="N/A"
fi

# Determine status
if [[ "$release_date" > "$current_date" ]]; then
status="Not Released"
elif [[ $i -eq 6 ]]; then
status="Not Released"
elif [[ $i -eq 5 ]]; then
status="Mainline"
elif [[ $i -eq 4 ]]; then
status="Stable"
elif [[ $i -eq 3 ]]; then
status="Security Support"
else
status="Not Supported"
fi

# Format version name and patch link based on release status
# No links for unreleased versions
if [[ "$status" == "Not Released" ]]; then
formatted_version_name="$version_name"
patch_link="N/A"
else
formatted_version_name="[$version_name](https://coder.com/changelog/coder-$version_major-$rel_minor)"
fi

# Add row to table
result+="| $formatted_version_name | $formatted_date | $status | $patch_link |\n"
done

echo -e "$result"
}

# Check if the markdown comments exist in the file
if ! grep -q "$CALENDAR_START_MARKER" "$DOCS_FILE" || ! grep -q "$CALENDAR_END_MARKER" "$DOCS_FILE"; then
echo "Error: Markdown comment anchors not found in $DOCS_FILE"
echo "Please add the following anchors around the release calendar table:"
echo " $CALENDAR_START_MARKER"
echo " $CALENDAR_END_MARKER"
exit 1
fi

# Generate the new calendar table content
NEW_CALENDAR=$(generate_release_calendar)

# Update the file while preserving the rest of the content
awk -v start_marker="$CALENDAR_START_MARKER" \
-v end_marker="$CALENDAR_END_MARKER" \
-v new_calendar="$NEW_CALENDAR" \
'
BEGIN { found_start = 0; found_end = 0; print_line = 1; }
$0 ~ start_marker {
print;
print new_calendar;
found_start = 1;
print_line = 0;
next;
}
$0 ~ end_marker {
found_end = 1;
print_line = 1;
print;
next;
}
print_line || !found_start || found_end { print }
' "$DOCS_FILE" >"${DOCS_FILE}.new"

# Replace the original file with the updated version
mv "${DOCS_FILE}.new" "$DOCS_FILE"

# run make fmt/markdown
make fmt/markdown

echo "Successfully updated release calendar in $DOCS_FILE"
Loading