diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml
index 5f0f80eed24c95..13a4a10254f62c 100644
--- a/.github/workflows/create-release-proposal.yml
+++ b/.github/workflows/create-release-proposal.yml
@@ -1,7 +1,6 @@
# This action requires the following secrets to be set on the repository:
# GH_USER_NAME: GitHub user whose Jenkins and GitHub token are defined below
# GH_USER_TOKEN: GitHub user token, to be used by ncu and to push changes
-# JENKINS_TOKEN: Jenkins token, to be used to check CI status
name: Create Release Proposal
@@ -25,7 +24,7 @@ env:
NODE_VERSION: lts/*
permissions:
- contents: write
+ contents: read
jobs:
releasePrepare:
@@ -39,9 +38,6 @@ jobs:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with:
ref: ${{ env.STAGING_BRANCH }}
- # Needs the whole git history for ncu to work
- # See https://github.com/nodejs/node-core-utils/pull/486
- fetch-depth: 0
# Install dependencies
- name: Install Node.js
@@ -58,29 +54,37 @@ jobs:
ncu-config set upstream origin
ncu-config set username "$USERNAME"
ncu-config set token "$GH_TOKEN"
- ncu-config set jenkins_token "$JENKINS_TOKEN"
ncu-config set repo "$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)"
ncu-config set owner "${GITHUB_REPOSITORY_OWNER}"
env:
USERNAME: ${{ secrets.JENKINS_USER }}
- GH_TOKEN: ${{ secrets.GH_USER_TOKEN }}
- JENKINS_TOKEN: ${{ secrets.JENKINS_TOKEN }}
+ GH_TOKEN: ${{ github.token }}
- name: Set up ghauth config (Ubuntu)
run: |
- mkdir -p ~/.config/changelog-maker/
- echo '{
- "user": "'$(ncu-config get username)'",
- "token": "'$(ncu-config get token)'"
- }' > ~/.config/changelog-maker/config.json
+ mkdir -p "${XDG_CONFIG_HOME:-~/.config}/changelog-maker"
+ echo '{}' | jq '{user: env.USERNAME, token: env.TOKEN}' > "${XDG_CONFIG_HOME:-~/.config}/changelog-maker/config.json"
+ env:
+ USERNAME: ${{ secrets.JENKINS_USER }}
+ TOKEN: ${{ github.token }}
- name: Setup git author
run: |
git config --local user.email "github-bot@iojs.org"
git config --local user.name "Node.js GitHub Bot"
+ # Workaround, see https://github.com/nodejs/node-core-utils/pull/876
+ git fetch origin --shallow-exclude v23.3.0 v23.x-staging
+ git fetch origin --deepen=1 v23.x-staging
- name: Start git node release prepare
+ # The curl command is to make sure we run the version of the script corresponding to the current workflow.
run: |
+ curl -L https://github.com/${GITHUB_REPOSITORY}/raw/${GITHUB_SHA}/tools/actions/create-release.sh > tools/actions/create-release.sh
./tools/actions/create-release.sh "${RELEASE_DATE}" "${RELEASE_LINE}"
env:
GH_TOKEN: ${{ secrets.GH_USER_TOKEN }}
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: query.gql
+ path: query.gql
diff --git a/doc/contributing/releases.md b/doc/contributing/releases.md
index 32e9880b444dcb..12a72b0e00ed98 100644
--- a/doc/contributing/releases.md
+++ b/doc/contributing/releases.md
@@ -33,7 +33,8 @@ official release builds for Node.js, hosted on .
* [17. Create a blog post](#17-create-a-blog-post)
* [18. Create the release on GitHub](#18-create-the-release-on-github)
* [19. Announce](#19-announce)
- * [20. Celebrate](#20-celebrate)
+ * [20. Re-enable the backport-queue workflow](#20-re-enable-the-backport-queue-workflow)
+ * [21. Celebrate](#21-celebrate)
* [LTS releases](#lts-releases)
* [Major releases](#major-releases)
@@ -140,6 +141,11 @@ of the `nodejs-private/node-private` repository a day or so before the
[CI lockdown procedure][] begins. This is to confirm that Jenkins can properly
access the private repository.
+### 1. Disable the backport-queue workflow
+
+Having the staging branch and the proposal branch starting to differ will make
+the release work harder.
+
### 1. Update the staging branch
Checkout the staging branch locally.
@@ -1096,7 +1102,9 @@ Let the security release steward know the releases are available.
-### 20. Celebrate
+### 20. Re-enable the backport-queue workflow
+
+### 21. Celebrate
_In whatever form you do this..._
diff --git a/tools/actions/create-release.sh b/tools/actions/create-release.sh
index 3a69b3f5602ffc..6a382844266e46 100755
--- a/tools/actions/create-release.sh
+++ b/tools/actions/create-release.sh
@@ -10,24 +10,91 @@ if [ -z "$RELEASE_DATE" ] || [ -z "$RELEASE_LINE" ]; then
exit 1
fi
+buildMutationQuery() {
+ repo=$1
+ branch=$2
+ commit="${3:-HEAD}"
+ commit_title="${4:-$(git log -1 "$commit" --format=%s)}"
+ commit_body="${5:-$(git log -1 "$commit" --format=%b)}"
+ cat - <<'EOF'
+mutation ($repo: String! $branch: String!, $parent: GitObjectID!, $commit_title: String!, $commit_body: String) {
+ createCommitOnBranch(input: {
+ branch: {
+ repositoryNameWithOwner: $repo,
+ branchName: $branch
+ },
+ message: {
+ headline: $commit_title,
+ body: $commit_body
+ },
+ expectedHeadOid: $parent,
+ fileChanges: {
+ additions: [
+EOF
+ git show "$commit" --diff-filter=d --name-only --format= | while read -r FILE; do
+ printf " { path: "
+ node -p 'JSON.stringify(process.argv[1])' "$FILE"
+ printf ", contents: \""
+ base64 -w 0 -i "$FILE"
+ echo "\"},"
+ done
+ echo ' ], deletions: ['
+ git show "$commit" --diff-filter=D --name-only --format= | while read -r FILE; do
+ echo "$(node -p 'JSON.stringify(process.argv[1])' "$FILE"),"
+ done
+ cat - <<'EOF'
+ ]
+ }
+ }) {
+ commit {
+ url
+ }
+ }
+}
+EOF
+ node -p '"variables " + JSON.stringify({
+ repo: process.argv[1],
+ branch: process.argv[2],
+ parent: process.argv[3],
+ commit_title: process.argv[4],
+ commit_body: process.argv[5]
+ }, undefined, 2)' "$repo" "$branch" "$(git rev-parse "${commit}^")" "$commit_title" "${commit_body}"
+}
+
git node release --prepare --skipBranchDiff --yes --releaseDate "$RELEASE_DATE"
-# We use it to not specify the branch name as it changes based on
-# the commit list (semver-minor/semver-patch)
-git config push.default current
-git push
+
+HEAD_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
TITLE=$(awk "/^## ${RELEASE_DATE}/ { print substr(\$0, 4) }" "doc/changelogs/CHANGELOG_V${RELEASE_LINE}.md")
# Use a temporary file for the PR body
TEMP_BODY="$(awk "/## ${RELEASE_DATE}/,/^ query.gql
+< query.gql \
+node --input-type=module -e 'console.log(JSON.stringify({ query: Buffer.concat(await process.stdin.toArray()).toString() }))' \
+| curl -fS -H "Authorization: bearer ${GH_TOKEN}" -X POST --data @- https://api.github.com/graphql