diff --git a/scripts/release.sh b/scripts/release.sh index f35a1bfc8e..e5f950ebce 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -53,6 +53,10 @@ script_check=1 mainline=1 channel=mainline +# These values will be used for any PRs created. +pr_review_assignee=${CODER_RELEASE_PR_REVIEW_ASSIGNEE:-@me} +pr_review_reviewer=${CODER_RELEASE_PR_REVIEW_REVIEWER:-bpmct,stirby} + args="$(getopt -o h -l dry-run,help,ref:,mainline,stable,major,minor,patch,force,ignore-script-out-of-date -- "$@")" eval set -- "$args" while true; do @@ -294,7 +298,7 @@ log "Release tags for ${new_version} created successfully and pushed to ${remote log # Write to a tmp file for ease of debugging. -release_json_file=$(mktemp -t coder-release.json) +release_json_file=$(mktemp -t coder-release.json.XXXXXX) log "Writing release JSON to ${release_json_file}" jq -n \ --argjson dry_run "${dry_run}" \ @@ -310,6 +314,49 @@ maybedryrun "${dry_run}" cat "${release_json_file}" | log log "Release workflow started successfully!" +log +log "Would you like for me to create a pull request for you to automatically bump the version numbers in the docs?" +while [[ ! ${create_pr:-} =~ ^[YyNn]$ ]]; do + read -p "Create PR? (y/n) " -n 1 -r create_pr + log +done +if [[ ${create_pr} =~ ^[Yy]$ ]]; then + pr_branch=autoversion/${new_version} + title="docs: bump ${channel} version to ${new_version}" + body="This PR was automatically created by the [release script](https://github.com/coder/coder/blob/main/scripts/release.sh). + +Please review the changes and merge if they look good and the release is complete. + +You can follow the release progress [here](https://github.com/coder/coder/actions/workflows/release.yaml) and view the published release [here](https://github.com/coder/coder/releases/tag/${new_version}) (once complete)." + + log + log "Creating branch \"${pr_branch}\" and updating versions..." + + create_pr_stash=0 + if ! git diff --quiet --exit-code -- docs; then + maybedryrun "${dry_run}" git stash push --message "scripts/release.sh: autostash (autoversion)" -- docs + create_pr_stash=1 + fi + maybedryrun "${dry_run}" git checkout -b "${pr_branch}" "${remote}/${branch}" + execrelative go run ./release autoversion --channel "${channel}" "${new_version}" --dry-run + maybedryrun "${dry_run}" git add docs + maybedryrun "${dry_run}" git commit -m "${title}" + # Return to previous branch. + maybedryrun "${dry_run}" git checkout - + if ((create_pr_stash)); then + maybedryrun "${dry_run}" git stash pop + fi + + log "Creating pull request..." + maybedryrun "${dry_run}" gh pr create \ + --assignee "${pr_review_assignee}" \ + --reviewer "${pr_review_reviewer}" \ + --base "${branch}" \ + --head "${pr_branch}" \ + --title "${title}" \ + --body "${body}" +fi + if ((dry_run)); then # We can't watch the release.yaml workflow if we're in dry-run mode. exit 0 diff --git a/scripts/release/main.go b/scripts/release/main.go index 79580eee61..919205b76d 100644 --- a/scripts/release/main.go +++ b/scripts/release/main.go @@ -381,12 +381,18 @@ func (r *releaseCommand) autoversionFile(ctx context.Context, file, channel, ver } } if matchRe != nil { - // Apply matchRe and find the group named "version", then replace it with the new version. - // Utilize the index where the match was found to replace the correct part. The only - // match group is the version. + // Apply matchRe and find the group named "version", then replace it + // with the new version. if match := matchRe.FindStringSubmatchIndex(line); match != nil { - logger.Info(ctx, "updating version number", "line_number", i+1, "match", match) - lines[i] = line[:match[2]] + version + line[match[3]:] + vg := matchRe.SubexpIndex("version") + if vg == -1 { + logger.Error(ctx, "version group not found in match", "num_subexp", matchRe.NumSubexp(), "subexp_names", matchRe.SubexpNames(), "match", match) + return xerrors.Errorf("bug: version group not found in match") + } + start := match[vg*2] + end := match[vg*2+1] + logger.Info(ctx, "updating version number", "line_number", i+1, "match_start", start, "match_end", end, "old_version", line[start:end]) + lines[i] = line[:start] + version + line[end:] matchRe = nil break } diff --git a/scripts/release/tag_version.sh b/scripts/release/tag_version.sh index 89fb738f8a..16a2011016 100755 --- a/scripts/release/tag_version.sh +++ b/scripts/release/tag_version.sh @@ -191,7 +191,7 @@ fi # Ensure the ref is in the release branch. branch_contains_ref=$(git branch --contains "${ref}" --list "${release_branch}" --format='%(refname)') -if [[ -z $branch_contains_ref ]]; then +if ((!dry_run)) && [[ -z $branch_contains_ref ]]; then error "Provided ref (${ref_name}) is not in the required release branch (${release_branch})." fi diff --git a/scripts/release/testdata/autoversion/docs/random.md b/scripts/release/testdata/autoversion/docs/random.md new file mode 100644 index 0000000000..cfaf4c6d48 --- /dev/null +++ b/scripts/release/testdata/autoversion/docs/random.md @@ -0,0 +1,14 @@ +# Some documentation + +1. Run the following command to install the chart in your cluster. + + For the **mainline** Coder release: + + + + ```shell + helm install coder coder-v2/coder \ + --namespace coder \ + --values values.yaml \ + --version 2.10.0 # trailing comment! + ``` diff --git a/scripts/release/testdata/autoversion/docs/random.md.golden b/scripts/release/testdata/autoversion/docs/random.md.golden new file mode 100644 index 0000000000..9b62597ec3 --- /dev/null +++ b/scripts/release/testdata/autoversion/docs/random.md.golden @@ -0,0 +1,14 @@ +# Some documentation + +1. Run the following command to install the chart in your cluster. + + For the **mainline** Coder release: + + + + ```shell + helm install coder coder-v2/coder \ + --namespace coder \ + --values values.yaml \ + --version 2.11.1 # trailing comment! + ```