ClickHouse/utils/simple-backport
Alexander Kuzmenkov f4d9002182 Rename "Non-significant" to "Not for changelog".
The previous name was not universally liked, because technically a PR
might be very much significant, we just don't want to mention it in the
changelog.
2020-05-22 23:09:44 +03:00
..
.gitignore
backport.sh simple backport script 2020-05-22 21:44:11 +03:00
changelog.sh simple backport script 2020-04-15 22:03:38 +03:00
format-changelog.py Rename "Non-significant" to "Not for changelog". 2020-05-22 23:09:44 +03:00
README.md simple backport script 2020-04-14 00:16:23 +03:00

Упрощённый скрипт для бекпортирования

Это упрощённый скрипт для бекпортирования. Он определяет, какие пулреквесты ещё не бекпортировали из мастера в указанную ветку. Запускать скрипт нужно из папки, где он лежит, указав ему название ветки. Он предполагает, что ваш апстримный remote называется origin.

cd my-clickhouse-repo/utils/simple-backport
git fetch origin
time GITHUB_TOKEN=<my github token> ./backport.sh 20.1

Скрипт выведет примитивный отчёт:

$ time GITHUB_TOKEN=<my github token> ~/backport.sh 20.3
144 PRs differ between 20.3 and master.
backport	https://github.com/ClickHouse/ClickHouse/pull/10135
backport	https://github.com/ClickHouse/ClickHouse/pull/10121
...
backport	https://github.com/ClickHouse/ClickHouse/pull/9808
backport	https://github.com/ClickHouse/ClickHouse/pull/9410

real	0m1.213s
user	0m1.065s
sys	0m0.311s

Также в рабочей папке сгенерируется отчёт <ваша-ветка>-report.tsv:

$ cat 20.3-report.tsv 
skip	10153	https://github.com/ClickHouse/ClickHouse/pull/10153	pr10153.json
skip	10147	https://github.com/ClickHouse/ClickHouse/pull/10147	pr10147.json
no-backport	10138	https://github.com/ClickHouse/ClickHouse/pull/10138	pr10138.json
backport	10135	https://github.com/ClickHouse/ClickHouse/pull/10135	pr10135.json
skip	10134	https://github.com/ClickHouse/ClickHouse/pull/10134	pr10134.json
...

Можно кликать по ссылкам прям из консоли, а можно ещё проще:

$ cat <ветка>-report.tsv | grep ^backport | cut -f3
$ cat <ветка>-report.tsv | grep ^backport | cut -f3 | xargs -n1 xdg-open

Такая команда откроет в браузере все пулреквесты, которые надо бекпортировать. Есть и другие статусы, посмотрите какие:

$ cat 20.1-report.tsv | cut -f1 | sort | uniq -c | sort -rn
    446 skip
     38 done
     25 conflict
     18 backport
     10 no-backport

Как разметить пулреквест?

По умолчанию бекпортируются все пулреквесты, у которых в описании указана категория чейнжлога Bug fix. Если этого недостаточно, используйте теги:

  • v20.1-no-backport -- в ветку 20.1 бекпортировать не нужно.
  • pr-no-backport -- ни в какие ветки бекпортировать не нужно.
  • v20.1-conflicts -- при бекпорте в 20.1 произошёл конфликт. Такие пулреквесты скрипт пропускает, к ним можно потом вернуться.
  • pr-must-backport -- нужно бекпортировать в поддерживаемые ветки.
  • v20.1-must-backport -- нужно бекпортировать в 20.1.

Я бекпортировал, почему скрипт не видит?

  • Сообщение коммита должно содержать текст backport/cherry-pick #12345, или иметь вид стандартного гитхабовского мерж-коммита для ПР #12345.
  • Коммит должен быть достижим по git log --first-parent my-branch. Возможно, в ветке сделали pull с merge, от чего некоторые коммиты из ветки становятся недоступны по --first-parent.

В качестве обхода, добавьте в ветку пустой коммит с текстом вроде "backport #12345 -- real backport commit is ".

Я поправил пулреквест, почему скрипт не видит?

В процессе работы скрипт кеширует данные о пулреквестах в текущей папке, чтобы экономить квоту гитхаба. Удалите закешированные файлы, например, для всех реквестов, которые не помечены как пропущенные:

$ cat <ваша-ветка>-report.tsv | grep -v "^skip" | cut -f4
$ cat <ваша-ветка>-report.tsv | grep -v "^skip" | cut -f4 | xargs rm

Как сформировать change log

В этой же папке запустите:

$ time GITHUB_TOKEN=... ./changelog.sh v20.3.4.10-stable v20.3.5.21-stable
9 PRs added between v20.3.4.10-stable and v20.3.5.21-stable.
### ClickHouse release v20.3.5.21-stable FIXME as compared to v20.3.4.10-stable

#### Bug Fix

* Fix 'Different expressions with the same alias' error when query has PREWHERE
  and WHERE on distributed table and `SET distributed_product_mode = 'local'`.
[#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem
Zuikov](https://github.com/4ertus2)).
...

Скрипт выведет changelog на экран, а также сохранит его в ./changelog.md. Скопируйте этот текст в большой changelog, проверьте и поправьте версию и дату релиза, вычитайте сообщения. Если сообщения неправильные, обязательно исправьте их на гитхабе -- это поможет при последующей генерации changelog для других версий, содержащих этот пулреквест. Чтобы скрипт подтянул изменения с гитхаба, удалите соответствующие файлы ./pr12345.json. Если вы часто видите неправильно оформленные пулреквесты, это повод подумать об улучшении проверки Description check в CI.