-
Notifications
You must be signed in to change notification settings - Fork 24
feat(publish): gate auto-publish on releases + publish summary table + docs #160
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
Changes from 4 commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
3d932eb
feat(publish): add publish-summary table + GitHub Release upsert
felickz e5b4080
fix(publish): avoid tee+pipe fragility in Build summary table step
felickz cb01617
Merge remote-tracking branch 'origin/main' into publish-summary-table
felickz 75e4b88
feat(publish): gate auto-publish on .release.yml changes; document re…
felickz cd50d6a
fix: address Copilot review feedback on PR #160
felickz 113ed4a
Merge main (PR #159 - bump remaining packs to 0.2.3) into publish-sum…
felickz ec6dd17
feat(publish): add CodeQL standard library versions cross-check table
felickz 7b75ce1
fix: mark build-codeql-lib-versions-table.sh executable
felickz 0659595
fix(build-codeql-lib-versions-table): check src lock file, not lib
felickz 16c7cb0
feat(publish): commit/tag-anchored links + queries pack in lib-versio…
felickz 1341fae
feat: automate CodeQL CLI version bump detection and dependency refresh
felickz d518638
fix(publish): gate release-table upsert to push trigger, clarify fail…
felickz 0843ff8
fix(publish): check both src and lib lock files for CodeQL version drift
felickz faa5fe6
docs: fix publish.yml job count in CONTRIBUTING.md (five jobs, not four)
felickz bda4965
fix(publish): don't fail check_version when a pack's GHCR container d…
felickz File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,99 @@ | ||
| #!/usr/bin/env bash | ||
| # Builds a markdown table summarizing the package versions produced by a | ||
| # publish.yml run, from the per-job JSON result fragments it wrote. | ||
| # | ||
| # Usage: build-publish-summary.sh <results-dir> | ||
| # | ||
| # Each fragment in <results-dir> looks like: | ||
| # { | ||
| # "language": "cpp", | ||
| # "type": "src", | ||
| # "package": "codeql-cpp-queries", | ||
| # "previous_version": "0.2.1", | ||
| # "target_version": "0.2.2", | ||
| # "status": "published" # published | up-to-date | failed | ||
| # } | ||
| set -euo pipefail | ||
|
|
||
| RESULTS_DIR="${1:?usage: build-publish-summary.sh <results-dir>}" | ||
| REPO="${GITHUB_REPOSITORY:-GitHubSecurityLab/CodeQL-Community-Packs}" | ||
| RUN_URL="${GITHUB_SERVER_URL:-https://github.com}/${REPO}/actions/runs/${GITHUB_RUN_ID:-}" | ||
|
|
||
| shopt -s nullglob | ||
| FRAGMENTS=("$RESULTS_DIR"/*.json) | ||
| if [ "${#FRAGMENTS[@]}" -eq 0 ]; then | ||
| MERGED='[]' | ||
| else | ||
| MERGED=$(jq -s '.' "${FRAGMENTS[@]}") | ||
| fi | ||
|
|
||
| LANGUAGES=(cpp csharp go java javascript python ruby) | ||
| TYPES=(src lib ext ext-library-sources) | ||
| EXT_LANGUAGES=(csharp java) | ||
|
|
||
| lang_label() { | ||
| case "$1" in | ||
| cpp) echo "C++" ;; | ||
| csharp) echo "C#" ;; | ||
| go) echo "Go" ;; | ||
| java) echo "Java" ;; | ||
| javascript) echo "JavaScript" ;; | ||
| python) echo "Python" ;; | ||
| ruby) echo "Ruby" ;; | ||
| *) echo "$1" ;; | ||
| esac | ||
| } | ||
|
|
||
| is_ext_language() { | ||
| local lang="$1" | ||
| for l in "${EXT_LANGUAGES[@]}"; do | ||
| [ "$l" == "$lang" ] && return 0 | ||
| done | ||
| return 1 | ||
| } | ||
|
|
||
| cell() { | ||
| local lang="$1" type="$2" | ||
| local entry | ||
| entry=$(echo "$MERGED" | jq -c --arg l "$lang" --arg t "$type" \ | ||
| '[.[] | select(.language == $l and .type == $t)] | first // empty') | ||
|
|
||
| if [ -z "$entry" ] || [ "$entry" == "null" ]; then | ||
| # This combo is expected to publish (unlike the "n/a" combos filtered out | ||
| # by the caller) but no result fragment was found for it. | ||
| echo "❓ no result" | ||
| return | ||
| fi | ||
|
|
||
| local package version status previous | ||
| package=$(echo "$entry" | jq -r '.package') | ||
| version=$(echo "$entry" | jq -r '.target_version') | ||
| status=$(echo "$entry" | jq -r '.status') | ||
| previous=$(echo "$entry" | jq -r '.previous_version') | ||
| local url="https://github.com/${REPO}/pkgs/container/${package}?tag=${version}" | ||
|
|
||
| case "$status" in | ||
| published) echo "[${version}](${url}) 🆕" ;; | ||
| up-to-date) echo "[${version}](${url})" ;; | ||
| failed) echo "⚠️ publish failed (still \`${previous}\`)" ;; | ||
| *) echo "❓ unknown" ;; | ||
| esac | ||
|
felickz marked this conversation as resolved.
|
||
| } | ||
|
|
||
| echo "## Publish summary" | ||
| echo | ||
| echo "_Generated by [publish.yml run #${GITHUB_RUN_NUMBER:-}](${RUN_URL}) — 🆕 marks a package republished by this run._" | ||
| echo | ||
| echo "| Language | Queries (\`src\`) | Library (\`lib\`) | Extensions (\`ext\`) | Library sources (\`ext-library-sources\`) |" | ||
| echo "| --- | --- | --- | --- | --- |" | ||
| for lang in "${LANGUAGES[@]}"; do | ||
| row="| $(lang_label "$lang") |" | ||
| for type in "${TYPES[@]}"; do | ||
| if { [ "$type" == "ext" ] || [ "$type" == "ext-library-sources" ]; } && ! is_ext_language "$lang"; then | ||
| row="$row n/a |" | ||
| continue | ||
| fi | ||
| row="$row $(cell "$lang" "$type") |" | ||
| done | ||
| echo "$row" | ||
| done | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| #!/usr/bin/env bash | ||
| # Upserts the publish-summary table (built by build-publish-summary.sh) into | ||
| # the GitHub Release matching .release.yml's current version, creating that | ||
| # release as a pre-release if it doesn't exist yet. | ||
| # | ||
| # Usage: upsert-release-table.sh <table-markdown-file> | ||
| # | ||
| # The table is stored between marker comments so re-runs only replace that | ||
| # block and leave the rest of the release body (e.g. "What's Changed") alone. | ||
| set -euo pipefail | ||
|
|
||
| TABLE_FILE="${1:?usage: upsert-release-table.sh <table-markdown-file>}" | ||
| START_MARKER="<!-- publish-summary:start -->" | ||
| END_MARKER="<!-- publish-summary:end -->" | ||
|
|
||
| VERSION=$(grep -E '^version:' .release.yml | head -1 | sed -E 's/^version:[[:space:]]*"?([^"[:space:]]*)"?/\1/') | ||
| if [ -z "$VERSION" ]; then | ||
| echo "::error::Could not read version from .release.yml" >&2 | ||
| exit 1 | ||
| fi | ||
| TAG="v${VERSION}" | ||
|
|
||
| BLOCK_FILE=$(mktemp) | ||
| { | ||
| echo "$START_MARKER" | ||
| cat "$TABLE_FILE" | ||
| echo "$END_MARKER" | ||
| } > "$BLOCK_FILE" | ||
|
|
||
| if gh release view "$TAG" >/dev/null 2>&1; then | ||
| echo "Release $TAG exists; refreshing its publish-summary block." | ||
| CURRENT_BODY=$(mktemp) | ||
| gh release view "$TAG" --json body -q .body > "$CURRENT_BODY" | ||
|
|
||
| NEW_BODY=$(mktemp) | ||
| if grep -qF "$START_MARKER" "$CURRENT_BODY"; then | ||
| awk -v start="$START_MARKER" -v end="$END_MARKER" -v blockfile="$BLOCK_FILE" ' | ||
| $0 == start { | ||
| while ((getline line < blockfile) > 0) print line | ||
| skip = 1 | ||
| next | ||
| } | ||
| $0 == end { | ||
| skip = 0 | ||
| next | ||
| } | ||
| skip { next } | ||
| { print } | ||
| ' "$CURRENT_BODY" > "$NEW_BODY" | ||
| else | ||
| # Older release predating this automation: append the block once. | ||
| cat "$CURRENT_BODY" > "$NEW_BODY" | ||
| echo "" >> "$NEW_BODY" | ||
| cat "$BLOCK_FILE" >> "$NEW_BODY" | ||
| fi | ||
|
felickz marked this conversation as resolved.
Outdated
|
||
|
|
||
| gh release edit "$TAG" --notes-file "$NEW_BODY" | ||
| else | ||
| echo "Release $TAG does not exist yet; creating it as a pre-release." | ||
| gh release create "$TAG" \ | ||
| --title "$TAG" \ | ||
| --notes-file "$BLOCK_FILE" \ | ||
| --generate-notes \ | ||
| --prerelease \ | ||
| --target "${GITHUB_SHA:-main}" | ||
| fi | ||
|
felickz marked this conversation as resolved.
|
||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.