Easy release bulding, combining JIRA and git
Project description
,---. ,---. .--. .-. .-. ,---. ,-. .---. _______ ,---. ,---.
| .-.\ | .-.\ / /\ \ | | | ||\ /| | .-' |(| ( .-._)|__ __|| .-' | .-.\
| |-' \ | `-'/ / /__\ \| | | ||(\ / | | `-. (_) (_) \ )| | | `-. | `-'/
| |--. \| ( | __ || | | |(_)\/ | | .-' | | _ \ \ (_) | | .-' | (
| |`-' /| |\ \ | | |)|| `-')|| \ / | | `--.| |( `-' ) | | | `--.| |\ \
/( `--' |_| \)\|_| (_)`---(_)| |\/| | /( __.'`-' `----' `-' /( __.'|_| \)\
(__) (__) '-' '-'(__) (__) (__)
braumeister is a release-candidate preparation tool for git and JIRA users.
Given a fix-version, it gathers git branches mentioned in JIRA issues targetting this fix-version and merges them in a release-candidate branch.
Installation
The braumeister requires at least Python 3.5
Install with:
pip3 install braumeister
Configuration
You can initialize the braumeister inside the root directory of a git repository like this:
braumeister init
The braumeister will create a .braumeister configuration file in the current directory. The configuration may look like this:
[general]
verbose = false
[git]
main_branch_name = main
[jira]
url = https://your-domain.atlassian.net
username = my-user
password = my-api-token
destination_transition = Merged
branch_custom_field_id = customfield_5711
| Section | key | default value | description |
|---|---|---|---|
| general | verbose | false | Verbose output |
| git | main_branch_name | master | Define the main branch name for your git project |
| jira | url | None | JIRA Base URL |
| jira | username | None | A JIRA User |
| jira | password | None | The password for the user |
| jira | destination_transition | None | Workflow Transition name for the ticket after merging, if executed with -u |
| jira | branch_custom_field_id | None | The JIRA Custom Field where we should read the branch from |
We'll be looking for a configuration file at the following places
[CURRENT-DIRECTORY]/.braumeister
~/.braumeister
It's recommended to add the following files to your .gitignore
.braumeister
release_state.json
JIRA Configuration
Custom Field für Branch anlegen
In JIRA, press gg (or .) to open the "Quick Actions" > Type Custom Fields > Add custom field > Text field (single line) > Next
Name: Branch
Description: git Branch
In the next screen, you need to assign the created field to one or more screens.
The branch_custom_field_id is customfield_[ID] whereas the ID is the number in the URL behind the customFieldId=.
e.g.:
https://jira.dev/secure/admin/ConfigureCustomField!default.jspa?customFieldId=57111
Here, the JIRA Custom Field Id is 5711, so the braumeister configuration for branch_custom_field_id would be customfield_5711.
Description
The braumeister requests all issues from JIRA with the given release name as Fix Version.
In theses tickets, we'll search for the configured custom field (eg Branch) containing the git branch.
The release branch will be created like this:
release/[cleaned_release_name]_RC_[LATEST_RC + 1]
If the braumeister discovered a branch with the same name, we'll increase the RC part with 1 (with leading zeros). The first release branch will have the RC 001.
For each of theses branches, the following commands will be executed:
$ git checkout $branch
$ git pull
$ git merge origin/main
$ git push origin $branch
$ git checkout $release_branch
$ git merge origin/$branch
$ git branch -D $branch
After merging all branches to the release branch, the branch will be pushed to origin.
Conflicts
If there are any conflicts during the merge of a branch, the braumeister will stop and write the current state to a release_state.json file. The output may looks like this:
$ braumeister -n "Barking Dog" candidate
[*] Requesting all issues with fixVersion: Barking Dog
[+] Requesting issue: https://jira.dev/rest/api/2/issue/5711
[+] Requesting issue: https://jira.dev/rest/api/2/issue/5712
[+] Requesting issue: https://jira.dev/rest/api/2/issue/5713
[+] The last branch for RC Barking Dog is: release/Barking_Dog_RC_002
[+] Creating new branch 'release/Barking_Dog_RC_003' from master
Branch 'release/Barking_Dog_RC_003' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'release/Barking_Dog_RC_003'
[🍻 ] Merging feature-2...
[🍻 ] Branch 'feature-2' merged
[🍻 ] Merging feature-1...
Writing state json!
A merge error occured while merging feature into release/Barking_Dog_RC_003
Please do the following steps:
* Resolve the conflicts
* Commit the changes
* Call the script again with the option -r
The braumeister will stay in the current release branch to let you resolve the conflict. After the conflict has been resolved, you can rerun the braumeister with -r to resume where we stopped.
$ braumeister -n "Barking Dog" -r candidate
Reading state json!
Resuming with feature-1
[🍻 ] Merging feature-1...
[🍻 ] Branch 'feature-1' merged
[🍻 ] Merging affe...
[🍻 ] Branch 'affe' merged
Deleting state json!
[🍻 ] All done. Grab a 🍺
Examples
Release Candidate
New release candidate
$ braumeister -n "Barking Dog" candidate
[*] Requesting all issues with fixVersion: Barking Dog
[+] Requesting issue: https://jira.dev/rest/api/2/issue/5711
[+] Creating new branch 'release/Barking_Dog_RC_001' from master
Branch 'release/Barking_Dog_RC_001' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'release/Barking_Dog_RC_001'
[🍻 ] Merging affe...
[🍻 ] Branch 'affe' merged
[🍻 ] All done. Grab a 🍺
Existing release candidate
When you execute the braumeister with the same release name again, a new release candidate will be created (increasing the RC part with 1).
$ braumeister -n "Barking Dog" candidate
[*] Requesting all issues with fixVersion: Barking Dog
[+] Requesting issue: https://jira.dev/rest/api/2/issue/5711
[+] The last branch for RC Barking Dog is: release/Barking_Dog_RC_001
[+] Creating new branch 'release/Barking_Dog_RC_002' from master
Branch 'release/Barking_Dog_RC_002' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'release/Barking_Dog_RC_002'
[🍻 ] Merging affe...
[🍻 ] Branch 'affe' merged
[🍻 ] All done. Grab a 🍺
Update JIRA issue
Executing the braumeister with -u will also execute the configured transition on all related issues.
$ braumeister -n "Barking Dog" -u candidate
[*] Requesting all issues with fixVersion: Barking Dog
[+] Requesting issue: https://jira.dev/rest/api/2/issue/31300
[+] Requesting issue: https://jira.dev/rest/api/2/issue/30209
[+] The last branch for RC Barking Dog is: release/Barking_Dog_RC_004
[+] Creating new branch 'release/Barking_Dog_RC_005' from master
Branch 'release/Barking_Dog_RC_005' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'release/Barking_Dog_RC_005'
[🍻 ] Merging feature-1...
[🍻 ] Branch 'feature-1' merged
[🍻 ] Merging affe...
[🍻 ] Branch 'affe' merged
Deleting state json!
------------------------------------
[+] Update status to Merged on all related jira issues!
------------------------------------
Requesting all transitions for: DEV-1
Updating jira status on DEV-1 to Staging Needed
------------------------------------
Requesting all transitions for: DEV-2
Updating jira status on DEV-2 to Staging Needed
[🍻 ] All done. Grab a 🍺
Release
New release
$ braumeister -n "Barking Dog" release
[*] Requesting all issues with fixVersion: Barking Dog
[+] Requesting issue: https://jira.dev/rest/api/2/issue/5711
[+] Creating new branch 'release/Barking_Dog_GA' from master
Branch 'release/Barking_Dog_GA' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'release/Barking_Dog_GA'
[🍻 ] Merging affe...
[🍻 ] Branch 'affe' merged
[🍻 ] All done. Grab a 🍺
Finalize a release
When you execute the braumeister with the finalize action it will merge the given branch back to define main branch (e.g. origin/main).
THIS CHANGES YOUR REMOTE REPOSITORY, HANDLE WITH CARE!
$ braumeister -n "Barking Dog" finalize
[+] Merging branch 'release/Barking_Dog_GA' to origin/master
[🍻 ] Merging release/Barking_Dog_GA...
[🍻 ] Branch 'release/Barking_Dog_GA' merged
[🍻 ] All done. Grab a 🍺
Cleanup after a release
When you execute the braumeister with the cleanup action it will delete all branches associated with tickets in your fixVersion.
THIS CHANGES YOUR REMOTE REPOSITORY, HANDLE WITH CARE!
$ braumeister -n "Barking Dog" cleanup
[+] Cleaning up after release of Barking Dog
[🍻 ] Deleting origin/feature-nifty...
[🍻 ] Deleting origin/feature-seven...
[🍻 ] Deleting origin/feature-eleven...
[🍻 ] Brewhouse all clean again. Grab a 🍺
Development
Running tests
make test
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file braumeister-0.5.0.tar.gz.
File metadata
- Download URL: braumeister-0.5.0.tar.gz
- Upload date:
- Size: 16.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3df0751b7236ae2bd498743ee2d9f9d8dc4c89edd021e1ea31479926670a765d
|
|
| MD5 |
234dc04f30166f90f0aa334e306f4572
|
|
| BLAKE2b-256 |
6f6e43f2b31ab040bb85ae57c85639dfb9f3919f84e4b1d6a521d58c0d69ae41
|
File details
Details for the file braumeister-0.5.0-py3-none-any.whl.
File metadata
- Download URL: braumeister-0.5.0-py3-none-any.whl
- Upload date:
- Size: 19.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fac1453a81aa7d107934671c7166bc0c1d26fddb9b9fa4b749a4f58a23b45d70
|
|
| MD5 |
d7c944bb1f41a113438a81d93ef3a6fc
|
|
| BLAKE2b-256 |
6f5f9112e0a75e662aa19cbfd0bc3c192cae5246683e339276751ac6d94f6b69
|