From a26269ec820374d12afaf09fcedf08bf1d35ee80 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Thu, 28 Nov 2024 00:03:30 +0100 Subject: [PATCH] tools: update `create-release-proposal` workflow --- .github/workflows/create-release-proposal.yml | 32 +++-- tools/actions/create-release.sh | 114 ++++++++++++++++-- 2 files changed, 122 insertions(+), 24 deletions(-) diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml index 5f0f80eed24c95..86b7bd58ff43eb 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 @@ -26,6 +25,7 @@ env: permissions: contents: write + pull-requests: write jobs: releasePrepare: @@ -39,9 +39,7 @@ 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 + persist-credentials: false # Install dependencies - name: Install Node.js @@ -58,29 +56,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, can be removed after https://github.com/nodejs/node-core-utils/pull/876 is released. + - name: Deepen the shallow clone + run: | + git fetch "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git" --shallow-exclude "v${RELEASE_LINE}.0.0" "$STAGING_BRANCH" + - 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: | + git update-index --assume-unchanged tools/actions/create-release.sh + curl -fsSLo tools/actions/create-release.sh https://github.com/${GITHUB_REPOSITORY}/raw/${GITHUB_SHA}/tools/actions/create-release.sh ./tools/actions/create-release.sh "${RELEASE_DATE}" "${RELEASE_LINE}" env: - GH_TOKEN: ${{ secrets.GH_USER_TOKEN }} + GH_TOKEN: ${{ github.token }} + # We want the bot to push the push the release commit so Ci runs on it. + BOT_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/tools/actions/create-release.sh b/tools/actions/create-release.sh index 3a69b3f5602ffc..fbdc56a75967f3 100755 --- a/tools/actions/create-release.sh +++ b/tools/actions/create-release.sh @@ -2,6 +2,9 @@ set -xe +GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-nodejs/node} +BOT_TOKEN=${BOT_TOKEN:-} + RELEASE_DATE=$1 RELEASE_LINE=$2 @@ -10,24 +13,113 @@ if [ -z "$RELEASE_DATE" ] || [ -z "$RELEASE_LINE" ]; then exit 1 fi +if [ -z "$GITHUB_REPOSITORY" ] || [ -z "$BOT_TOKEN" ]; then + echo "Invalid value in env for GITHUB_REPOSITORY and BOT_TOKEN" + exit 1 +fi + +if ! command -v node || ! command -v gh || ! command -v git || ! command -v awk; then + echo "Missing required dependencies" + exit 1 +fi + 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)" +HEAD_SHA="$(git rev-parse 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}/,/^ ({ path, contents: readFileSync(path).toString('base64') })), + deletions: deletedFiles.split('\n').filter(Boolean), + } + }, + }) +}); +if (!response.ok) { + console.log({statusCode: response.statusCode, status: response.status}); + process.exitCode ||= 1; +} +const data = await response.json(); +if (data.errors?.length) { + throw new Error('Endpoint returned an error', { cause: data }); +} +console.log(data); +EOF