Skip to content
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

Automate the cherry-picking process for WordPress and Gutenberg releases #40969

Merged
merged 21 commits into from
Jun 30, 2022

Conversation

adamziel
Copy link
Contributor

@adamziel adamziel commented May 10, 2022

What problem does this PR solve

Cherry-picking Pull Requests for Gutenberg and WordPress releases is a repetitive process that goes like this:

  1. Find all PRs with the Backport to WP Beta/RC label
  2. Open each in the browser
  3. Copy the merge commit hash
  4. Run git cherry-pick $hash in the CLI
  5. If it succeeded, push, let the author know, remove the label
  6. If it failed, cherry-pick everything else and retry
  7. If it still fails, figure out how to resolve the conflict
  8. Back to point 3 until there are no more PRs

This pull request explores a script that reduces the above process to:

  1. Run the script
  2. Manually resolve conflicts, if any

I successfully used it three times to cherry-pick PRs for WordPress 6.0 RC releases.

How does the script work?

Here's what npm run cherry-pick does:

  • Confirms with the developer the current branch aligns with the expectations
  • Gets local branches in sync with the remote ones
  • Requests the list of PRs to cherry-pick from GitHub API (closed, label=Backport to WP Beta/RC)
  • Runs git cherry-pick {commitHash} for each PR
  • It keeps track of the failed cherry-picks and then retries them
  • Retrying keeps going as long as at least one cherry-pick succeeds
  • Pushes the local branch to origin
  • (optional) Uses the gh console utility to comment on the remote PRs and remove the labels
  • Reports the results

Sample output looks as follows:

(base) : cloudnik core/plugins/gutenberg wp/6.0; npm run cherry-pick
You are on branch "wp/6.0".

This script will:
• Cherry-pick the merged PRs labeled as "Backport to WP Beta/RC" to this branch
• Push this branch
• Comment on each PR
• Remove the label from each PR

Do you want to proceed? (Y/n)

$ git pull origin wp/6.0 --rebase...
$ git fetch origin trunk...
Found the following PRs to cherry-pick:
   #41198 – Site Editor: Set min-width for styles preview
Fetching commit IDs...
Done!
   #41198 – 860a39665c318d33027d – Site Editor: Set min-width for...
Trying to cherry-pick one by one...
Cherry-picking round 1:
   ✅  cherry-pick commit: afe9b757b4  for PR: #41198 – Site Editor: Set min-width for...
Cherry-picking finished!
Summary:
   ✅  1 PRs got cherry-picked cleanly
   ✅  0 PRs failed

Pushing to origin/wp/6.0
Commenting and removing labels...
✅ 41198: I just cherry-picked this PR to the wp/6.0 branch to get it included in the next release: afe9b757b4
Done!

What tools/permissions are required to run this script?

  • gh console utility - optional, automates commenting and removing the labels
  • Permissions to push to the Gutenberg repository

Future improvement ideas

  • Flexibility: Add an option to exclude specific PRs
  • Flexibility: Add an option to specify PR numbers to backport explicitly
  • Flexibility: Add an option to specify a custom label or even GH API query
  • DevEx: Group reporting functions together, CLI functions together, and GitHub functions together

Test plan

  1. Run the script like npm run cherry-pick
  2. Confirm it does what this description says
  3. Confirm it helps with the release

@adamziel adamziel changed the title First stab at automating the cherry-pick process Automating the cherry-picking process May 10, 2022
@adamziel adamziel changed the title Automating the cherry-picking process Automate the cherry-picking process May 10, 2022
@adamziel adamziel force-pushed the automate/cherry-picking-for-a-release branch 2 times, most recently from 4c5b2c5 to 7c518ec Compare May 11, 2022 14:50
@adamziel adamziel added [Tool] WP Scripts /packages/scripts Developer Experience Ideas about improving block and theme developer experience labels May 11, 2022
@adamziel adamziel self-assigned this May 11, 2022
@adamziel adamziel force-pushed the automate/cherry-picking-for-a-release branch from 7c518ec to f88f228 Compare May 11, 2022 14:55
@adamziel adamziel marked this pull request as ready for review May 11, 2022 14:56
@gziolo
Copy link
Member

gziolo commented May 12, 2022

This is powerful! It should automate the whole process of backporting commits to a large degree. In fact, this could be a more general tool and work also with backports for Gutenberg plugin releases if connected with a different label in the repo.

@gziolo gziolo requested a review from priethor May 12, 2022 16:04
@gziolo gziolo added [Type] Project Management Meta-issues related to project management of Gutenberg and removed [Tool] WP Scripts /packages/scripts labels May 12, 2022
@adamziel
Copy link
Contributor Author

Test of commenting from CLI

@adamziel adamziel added Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta and removed Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta labels May 16, 2022
@adamziel adamziel force-pushed the automate/cherry-picking-for-a-release branch from ddfa1b8 to 5cd4b79 Compare May 17, 2022 12:08
@gziolo
Copy link
Member

gziolo commented May 23, 2022

@adamziel, can you share an update on where we are with this PR? I know you successfully used it 2-3 times to cherry-pick PRs for WordPress 6.0 RC releases.

I didn't check the code very closely, but as long as it works that would be the last of my concerns. As we wrap up the WP 6.0 release cycle tomorrow, what do you think about documenting in-depth how the script works today, what tools/permissions are required to run this script? We could land the script as-is with the inline documentation included (or maybe even pre-requisites printed on the terminal), then we would have to explain the usage in the documents used by release technical leads. Finally, it would be great to share some recommendations with how to improve the script in the future.

@github-actions
Copy link

github-actions bot commented May 24, 2022

Size Change: +8.97 kB (+1%)

Total Size: 1.25 MB

Filename Size Change
build/annotations/index.min.js 2.76 kB +27 B (+1%)
build/block-editor/index.min.js 152 kB +1.13 kB (+1%)
build/block-editor/style-rtl.css 14.5 kB +9 B (0%)
build/block-editor/style.css 14.5 kB +8 B (0%)
build/block-library/blocks/button/style-rtl.css 543 B +29 B (+6%) 🔍
build/block-library/blocks/button/style.css 543 B +29 B (+6%) 🔍
build/block-library/blocks/file/style-rtl.css 253 B +1 B (0%)
build/block-library/blocks/file/style.css 254 B +1 B (0%)
build/block-library/blocks/navigation-submenu/view.min.js 402 B +27 B (+7%) 🔍
build/block-library/blocks/navigation/style-rtl.css 1.96 kB +24 B (+1%)
build/block-library/blocks/navigation/style.css 1.95 kB +22 B (+1%)
build/block-library/blocks/navigation/view.min.js 423 B +30 B (+8%) 🔍
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B +27 B (+39%) 🚨
build/block-library/blocks/post-comments-form/editor.css 96 B +27 B (+39%) 🚨
build/block-library/blocks/post-comments/style-rtl.css 632 B +4 B (+1%)
build/block-library/blocks/post-comments/style.css 630 B +2 B (0%)
build/block-library/blocks/post-template/style-rtl.css 282 B -41 B (-13%) 👏
build/block-library/blocks/post-template/style.css 282 B -41 B (-13%) 👏
build/block-library/blocks/search/style-rtl.css 385 B -17 B (-4%)
build/block-library/blocks/search/style.css 386 B -17 B (-4%)
build/block-library/editor-rtl.css 10.2 kB +15 B (0%)
build/block-library/editor.css 10.2 kB +15 B (0%)
build/block-library/index.min.js 183 kB +396 B (0%)
build/block-library/style.css 11.5 kB -1 B (0%)
build/blocks/index.min.js 47 kB +63 B (0%)
build/components/index.min.js 230 kB +2.08 kB (+1%)
build/components/style-rtl.css 14 kB +70 B (+1%)
build/components/style.css 14 kB +69 B (0%)
build/core-data/index.min.js 14.7 kB -5 B (0%)
build/customize-widgets/index.min.js 11.2 kB +40 B (0%)
build/edit-post/index.min.js 30.4 kB +101 B (0%)
build/edit-post/style-rtl.css 7.08 kB +29 B (0%)
build/edit-post/style.css 7.08 kB +29 B (0%)
build/edit-site/index.min.js 51 kB +2.94 kB (+6%) 🔍
build/edit-site/style-rtl.css 8.28 kB +544 B (+7%) 🔍
build/edit-site/style.css 8.26 kB +550 B (+7%) 🔍
build/edit-widgets/index.min.js 16.4 kB +54 B (0%)
build/edit-widgets/style-rtl.css 4.36 kB -26 B (-1%)
build/edit-widgets/style.css 4.36 kB -25 B (-1%)
build/editor/index.min.js 38.7 kB +599 B (+2%)
build/element/index.min.js 4.27 kB +13 B (0%)
build/format-library/index.min.js 6.75 kB +152 B (+2%)
build/notices/index.min.js 953 B +8 B (+1%)
build/nux/index.min.js 2.05 kB -1 B (0%)
build/shortcode/index.min.js 1.53 kB +12 B (+1%)
build/token-list/index.min.js 644 B -18 B (-3%)
build/wordcount/index.min.js 1.06 kB -6 B (-1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 6.58 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 103 B
build/block-library/blocks/audio/style.css 103 B
build/block-library/blocks/audio/theme-rtl.css 110 B
build/block-library/blocks/audio/theme.css 110 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 615 B
build/block-library/blocks/cover/editor.css 616 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 110 B
build/block-library/blocks/embed/theme.css 110 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/view.min.js 346 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.5 kB
build/block-library/blocks/gallery/style.css 1.49 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 738 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 524 B
build/block-library/blocks/image/style.css 530 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 705 B
build/block-library/blocks/navigation-link/editor.css 703 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 495 B
build/block-library/blocks/post-comments-form/style.css 495 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 605 B
build/block-library/blocks/post-featured-image/editor.css 605 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 708 B
build/block-library/blocks/site-logo/editor.css 708 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 159 B
build/block-library/blocks/video/style.css 159 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 987 B
build/block-library/common.css 984 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/theme-rtl.css 677 B
build/block-library/theme.css 682 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/compose/index.min.js 11.7 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 7.95 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4.03 kB
build/edit-navigation/style.css 4.04 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/editor/style-rtl.css 3.63 kB
build/editor/style.css 3.62 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.38 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.9 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB

compressed-size-action

@adamziel
Copy link
Contributor Author

adamziel commented May 24, 2022

@adamziel, can you share an update on where we are with this PR? I know you successfully used it 2-3 times to cherry-pick PRs for WordPress 6.0 RC releases.

@gziolo Indeed, it works really well now!

What do you think about documenting in-depth how the script works today

Here's what npm run cherry-pick does:

  • Confirms with the developer the current branch aligns with the expectations
  • Gets local branches in sync with the remote ones
  • Requests the list of PRs to cherry-pick from GitHub API (closed, label=Backport to WP Beta/RC)
  • Runs git cherry-pick {commitHash} for each PR
  • It keeps track of the failed cherry-picks and then retries them
  • Retrying keeps going as long as at least one cherry-pick succeeds
  • Pushes the local branch to origin
  • (optional) Uses the gh console utility to comment on the remote PRs and remove the labels
  • Reports the results

Sample output looks as follows:

(base) : cloudnik core/plugins/gutenberg wp/6.0; node cherry-pick.mjs
You are on branch "wp/6.0".

This script will:
• Cherry-pick the merged PRs labeled as "Backport to WP Beta/RC" to this branch
• Push this branch
• Comment on each PR
• Remove the label from each PR

Do you want to proceed? (Y/n)

$ git pull origin wp/6.0 --rebase...
$ git fetch origin trunk...
Found the following PRs to cherry-pick:
   #41198 – Site Editor: Set min-width for styles preview
Fetching commit IDs...
Done!
   #41198 – 860a39665c318d33027d – Site Editor: Set min-width for...
Trying to cherry-pick one by one...
Cherry-picking round 1:
   ✅  cherry-pick commit: afe9b757b4  for PR: #41198 – Site Editor: Set min-width for...
Cherry-picking finished!
Summary:
   ✅  1 PRs got cherry-picked cleanly
   ✅  0 PRs failed

Pushing to origin/wp/6.0
Commenting and removing labels...
✅ 41198: I just cherry-picked this PR to the wp/6.0 branch to get it included in the next release: afe9b757b4
Done!

What tools/permissions are required to run this script?

  • gh console utility - optional, automates commenting and removing the labels
  • Permissions to push to the Gutenberg repository

We could land the script as-is with the inline documentation included

I just added the inline documentation 👍

or maybe even pre-requisites printed on the terminal)

The context around the gh utility is already being communicated via the CLI, there are no other pre-requisite tools.

Then we would have to explain the usage in the documents used by release technical leads.

Sounds perfect, let's team up on a doc that will also discuss the other automations like releasing npm packages and syncing Gutenberg packages and blocks to the wordpress-develop repository.

Finally, it would be great to share some recommendations with how to improve the script in the future.

A few ideas:

  • Flexibility: Add an option to exclude specific PRs
  • Flexibility: Add an option to specify PR numbers to backport explicitly
  • Flexibility: Add an option to specify a custom label or even GH API query
  • DevEx: Group reporting functions together, CLI functions together, and GitHub functions together

@priethor
Copy link
Contributor

This looks fan-tas-tic 💯

I understand there is no testing environment for this, and the only way to try it is whenever Backports are needed. Is that correct?

If so, I would agree with @gziolo's plan above as the 6.0.0 release cycle is over.

@adamziel adamziel changed the title Automate the cherry-picking process Automate the cherry-picking process for WP and Gutenberg releases May 25, 2022
@adamziel adamziel changed the title Automate the cherry-picking process for WP and Gutenberg releases Automate the cherry-picking process for WordPress and Gutenberg releases May 25, 2022
@adamziel
Copy link
Contributor Author

I understand there is no testing environment for this, and the only way to try it is whenever Backports are needed. Is that correct?

That's correct! Well, perhaps we could fabricate a testing environment:

  1. Spin a new branch off trunk minus 10 commits and git push it
  2. Add the backport label to the last, say five, merged PR
  3. Run this script

The downside is that random PRs would get the backport label for a few minutes.

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

I left some minor comments to look at before we land.

The other necessary task is to extend the tooling's capability to lint and format .mjs files. I see that some lines don't follow WP coding standards.

bin/cherry-pick.mjs Show resolved Hide resolved
bin/cherry-pick.mjs Outdated Show resolved Hide resolved
bin/cherry-pick.mjs Show resolved Hide resolved
@adamziel adamziel force-pushed the automate/cherry-picking-for-a-release branch from fb287d5 to b87a2cf Compare June 17, 2022 09:22
@adamziel
Copy link
Contributor Author

The E2E failures are unrelated to this PR. @gziolo, I think we're ready to merge!

bin/cherry-pick.mjs Outdated Show resolved Hide resolved
Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Excellent work @adamziel. Let's land it so we could start using it with 6.0.x releases.

The only thing that I found a bit unclear was how to pass the different labels depending on the type of the release but I figured out it's covered with this line:

const LABEL = process.argv[2] || "Backport to WP Minor Release";

Did you find a place in the documentation where we could include some guidelines how to use this new tool?

Co-authored-by: Greg Ziółkowski <[email protected]>
@adamziel adamziel merged commit d133be5 into trunk Jun 30, 2022
@adamziel adamziel deleted the automate/cherry-picking-for-a-release branch June 30, 2022 09:59
@github-actions github-actions bot added this to the Gutenberg 13.7 milestone Jun 30, 2022
@adamziel
Copy link
Contributor Author

Did you find a place in the documentation where we could include some guidelines how to use this new tool?

@gziolo These two make good candidates:

@gziolo
Copy link
Member

gziolo commented Jun 30, 2022

Excellent, that would be the next task when we wrap up the last piece of work:

WordPress/wordpress-develop#2647

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Developer Experience Ideas about improving block and theme developer experience [Type] Project Management Meta-issues related to project management of Gutenberg
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants