From 5ae0b1a399e421f14244e78dec8be854e08c0a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= <karel.koci@nic.cz> Date: Tue, 12 Nov 2019 16:24:44 +0100 Subject: [PATCH] WORKFLOW: rework and make more descriptive This fully describes flow in this repository. --- WORKFLOW.adoc | 731 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 591 insertions(+), 140 deletions(-) diff --git a/WORKFLOW.adoc b/WORKFLOW.adoc index 7fd283c01..7952568cc 100644 --- a/WORKFLOW.adoc +++ b/WORKFLOW.adoc @@ -1,39 +1,100 @@ Turris OS release workflow ========================== -Binary branches ---------------- +Turris OS is released as a set of packages, updater rules and medkit of distinct +version. Such set is marked as some exact Turris OS version. To facilitate +automatic updates with versioned distribution updater (tool on router to +facilitate updates) follows so-called branches. This makes Turris OS effectively +rollings distribution as well, although you have to understand that branch is in +reality some floating link to full build of Turris OS (so not a real rolling +distribution with incremental packages updates). -There are several binary branches that people can switch into. Those differ in -how well tested they are and from what sources they are build from. Generally -releases can be in versioned directories (by compile date) in respective branch -directory on repo and pointing to the correct version can be achieved using -symlinks. +User can choose to follow various binary feeds. There are some pure branches, such +as HBS and HBT and also branches with corresponding source branch in this git +repository. In reality, binaries in HBS and HBT are built in HBK and from there +only copied. -Here Be Dragons (HBD) -~~~~~~~~~~~~~~~~~~~~~ +Binary branches are signed with two different signing keys. There is release +key and test key. The reason is that the release key is stored more securely and +requires more than one developer to receive it while the test key is available for all +build jobs on build server. + +Users can switch between these branches with `switch-branch` script on the router. + +List of all primary binary branches continues. Branches are sorted in order of +stability. Changes are flowing from bottom branch to top ones. + +Here Be Snails (HBS) +-------------------- -------------------------------------------------------------------------------- - \||/ - | @___oo - /\ /\ / (__,,,,| - ) /^\) ^\/ _) - ) /^\/ _) - ) _ / / _) - /\ )/\/ || | )_) -< > |(,,) )__) - || / \)___)\ - | \____( )___) )___ - \______(_______;;; __;;; + .----. @ @ + / .-"-.`. \v/ + | | '\ \ \_/ ) + ,-\ `-.' /.' / +'---`----'----' +-------------------------------------------------------------------------------- + +This is stable release branch. It contains the most tested and stable version. It +is end-users branch. This is default branch routers follow. + +Binary packages in this branch are signed with release key. + +Releases in this branch are tagged in this repository with appropriate version tag +(such as `v5.1.2`). + +Binaries in this branch are built in HBK branch and copied to this branch from +HBT. + +Here Be Turtles (HBT) +--------------------- + +-------------------------------------------------------------------------------- + __ + .,-;-;-,. /'_\ + _/_/_/_|_\_\) / + '-<_><_><_><_>=/\ +jgs `/_/====/_/-'\_\ + "" "" "" +-------------------------------------------------------------------------------- + +This is branch used for end-users testing of next release. This branch contains +basically release candidate versions. + +Binary packages in this branch are signed with release key. + +Releases in this branch are tagged in this repository with appropriate version tag +with `-rcX` suffix where `X` is sequence number. Content of this branch can be +potentially same as HBS if there is no other release candidate. + +Binaries in this branch are built and copied from HBK branch. + +Here Be Kittens (HBK) +--------------------- + -------------------------------------------------------------------------------- +("`-''-/").___..--''"`-._ + `6_ 6 ) `-. ( ).`-.__.`) + (_Y_.)' ._ ) `._ `. ``-..-' + _..`--'_..-_/ /--'_.' + ((((.-'' ((((.' (((.-' +-------------------------------------------------------------------------------- + +This branch contains accumulated changes for next release. It is used to build +and continuously test binaries that are later moved to HBT and subsequently to +HBS. + +Binary packages in this branch are signed with test key. + +This branch corresponds to git branch *hbk*. -Latest, greatest build. If it builds, ship it. Contains mix of our latest efforts -and latest upstream development. Can and will break regularly, not meant to be -used on daily basis, more just for testing. Can be understood as far future next -major release. +Feeds in this branch are configured to OpenWrt stable and Turris OS packages +master branch. This means that this branch in general continually receives only +hotfixes. The only case when it jumps and receives new features is when git branch +*hbl* is merged in to it. Here Be Lions (HBL) -~~~~~~~~~~~~~~~~~~~ +------------------- -------------------------------------------------------------------------------- ,%%%%%%%%, @@ -51,140 +112,530 @@ Here Be Lions (HBL) (___________))))))) -------------------------------------------------------------------------------- -Latest development release. Contains latest builds from upstream stable branch -and our latest development changes. Should be mostly stable, rolling and is -meant for testing latest features. Not for BFU, but mostly usable. Can be also -understood as future minor release. +This branch contains the latest development of Turris OS features that are based on +stable OpenWrt. It is used to build and test the latest Turris features before they +are merged to git branch *hbk*. -Here Be Kittens (HBK) -~~~~~~~~~~~~~~~~~~~~~ +Binary packages in this branch are signed with test key. + +Feeds in this branch are configured to OpenWrt stable branch and Turris OS packages +development branch. This means that branch in general continually receives +hotfixes from OpenWrt and the latest features and bugfixes from Turris OS. New +features from OpenWrt are delivered to this branch by merging git branch *hbd* in +to it. + +Here Be Dragons (HBD) +--------------------- -------------------------------------------------------------------------------- -("`-''-/").___..--''"`-._ - `6_ 6 ) `-. ( ).`-.__.`) - (_Y_.)' ._ ) `._ `. ``-..-' - _..`--'_..-_/ /--'_.' - ((((.-'' ((((.' (((.-' + \||/ + | @___oo + /\ /\ / (__,,,,| + ) /^\) ^\/ _) + ) /^\/ _) + ) _ / / _) + /\ )/\/ || | )_) +< > |(,,) )__) + || / \)___)\ + | \____( )___) )___ + \______(_______;;; __;;; -------------------------------------------------------------------------------- -Latest kinda working release. Contains latest builds from upstream stable branch -and our development changes. Should be mostly stable, rolling and is meant for -testing latest fixes. Not for BFU, but mostly usable. Can be also understood as -future fixup release. +This is the most unstable branch with all the latest development. It is used to test +the latest OpenWrt development changes together with the latest Turris OS improvements before they are +merged to git branch *hbl*. -Here Be Turtles (HBT) -~~~~~~~~~~~~~~~~~~~~~ +Binary packages in this branch are signed with test key. --------------------------------------------------------------------------------- - __ - .,-;-;-,. /'_\ - _/_/_/_|_\_\) / - '-<_><_><_><_>=/\ -jgs `/_/====/_/-'\_\ - "" "" "" --------------------------------------------------------------------------------- +Feeds in this branch are configured to Turris OS packages development branch and +OpenWrt development branch. OpenWrt branch in this case is either *master* or +next not yet released stable branch. This branch is merged to *hbl* when OpenWrt releases new +stable version. -Branch signed with deploy key, basically replacement for `rc`. Meant to contain -stuff we are planning to release. Should be ever more stable just a little -more bleeding edge that officially deployed images. -Here Be Snails (HBS) -~~~~~~~~~~~~~~~~~~~~ +Turris-build repository workflow +================================ --------------------------------------------------------------------------------- - .----. @ @ - / .-"-.`. \v/ - | | '\ \ \_/ ) - ,-\ `-.' /.' / -'---`----'----' --------------------------------------------------------------------------------- +This section describes the development flow for this repository. It is closely related +to the previous section, but unless you are developer looking to contribute or +maintainer of this repository then it is probably not of interest to you. -Branch for the real releases that are deployed to the end users automatically. -Source to binary ----------------- +Primary (protected) branches of this repository +----------------------------------------------- -The most bleeding edge branch is `master`. It is build periodically from -upstream master branches of everything. If it builds it get's released. It's -main purpose is to have some kind of check how does our software works with -latest upstream and to get ready before next big release. This is published as -`HBD` binary branch. +*hbk*:: is default branch with version of Turris OS that is considered stable. +This branch contains stable version with only bugfixes on top of it. It is based +on OpenWrt stable branch (`openwrt-XX.XX`). -When upstream releases new big release, we fork `master` branch of build repo -into `vX.0` where we start working on our next big release. Builds from this -are in `HBK` binary branch. +*hbl*:: is branch used for development and contains possibly new features and +larger changes. It is still based on OpenWrt stable branch, same as *hbk*. -Over the time when stuff seems to calm down, we push binaries to `HBS` and when -we are ready to deploy it, we deploy from `HBS` and after that we create extra -commit which is no longer part of `vX.0` branch and has hard-coded hashes for -all repositories so we will be able to reproduce the build (in theory at -least). Tags are in form `vX.0.0` to always have a triplet there. +*hbd*:: is branch used for development of next major version. It contains not only +large changes from Turris but also automatically pulls changes from OpenWrt +development branch. The exact OpenWrt branch changes between _master_ and future +OpenWrt stable. -Next release will happen probably the same way from `vX.0`. In the mean time we -will fork `vX.1` from `vX.0` where we will be working on new changes. Builds -from this branch will go to `HBK`, while when we need maintenance, we can still -create it from `vX.0` through `HBS`. Over the time we will merge local small -changes done in `vX.0` into `vX.1`. -Maintenance -~~~~~~~~~~~ +Overview of flow in this repository +----------------------------------- -As we will be tracking upstream stable releases, hopefully we will have bunch -of fixes automatically. When we need to be faster than upstream, we will create -local patch, release our release, send patch upstream and when included -upstream, we will drop our local patch. Generally, the main idea is to send as -much as possible upstream and keep minimum patches, mostly just our packages -and configuration. +Following flow describes how branches are merged and how repository works in +general. It also describes feeds configured in that specific branch. We specify +branch in OpenWrt repository (abbreviated as _owrt_) and branch in Turris OS +packages (abbreviated as _tos_). There are other repositories (feeds) but they +should be configured to be consistent with OpenWrt feeds configuration. +The master branch of this repository is called *hbk* and all branches are forked +from it. Let's follow development of Turris OS 5.0 that is based on Turris OS 4.0 +and OpenWrt 19.07. Turris OS is based on OpenWrt 18.06. Initially this version is +being developer in *hbd* branch and meanwhile *hbl* contains next minor release +and *hbk* next fixup release for Turris OS 4.0 +.................................................................................. + hbd hbl hbk + _______________________________________________/| + |--------------------- |--------------------- |--------------------- + | owrt: openwrt-19.07| | owrt: openwrt-18.06| | owrt: openwrt-18.06| + | tos: develop | | tos: develop | | tos: stable | + |--------------------- |--------------------- |--------------------- + | | | +.................................................................................. +When problem is discovered in *hbd*, such as that patches are broken, then fix is +prepared in branch forked off of it. +.................................................................................. + fix/foo | | | + ____/| | | + | | | | + | | | | +.................................................................................. +Later such branch is merged back to *hbd* when fix is finished and tested. +.................................................................................. + | | | | + |___ | | | + \| | | + | | | +.................................................................................. +Once OpenWrt releases new stable (marks in example case OpenWrt 19.07 as stable +and 18.06 as old stable) then content of *hbd* can be merged to *hbl*. _Note that +after that we can't release next minor release for previous major release of +Turris OS._ +.................................................................................. + |______________________ | | + |--------------- \|--------------------- | + | owrt: master | | owrt: openwrt-19.07| | + | tos: develop | | tos: develop | | + |--------------- |--------------------- | + | | | +.................................................................................. +When problem is discovered then new branch is forked off of *hbl* to fix it. +.................................................................................. + | bugfix/foo | | + | _______/| | + | | | | + | | | | +.................................................................................. +That is later merged to both *hbl* and *hbd* when bugfix is finished and tested. +.................................................................................. + | | | | + | ______________|______ | | + |/ \| | + | | | +.................................................................................. +To do final release of Turris OS 5.0.0 we have to first merge it to *hbk* and +build it there. _Note that this is last step before releasing first release +candidate as that removes possibility to release fixup for previous major +version._ +.................................................................................. + | |______________________ | + | |--------------------- \|--------------------- + | | owrt: openwrt-19.07| | owrt: openwrt-19.07| + | | tos: develop | | tos: stable | + | |--------------------- |--------------------- + | | |\<-v5.0.0 + | | | +.................................................................................. +Any problem discovered in *hbk*, *hbt* or *hbs* is fixed in branch forked off of +latest commit in *hbk*. +.................................................................................. + | | hotfix/foo | + | | _______/| + | | | | + | | | | +.................................................................................. +Such fix has to be merged to *hbk* as well as to *hbl* and *hbd*. +.................................................................................. + | | | | + | ______________________|_______________|______ | + |/ |/ \| + | | |\<- v5.0.1 +.................................................................................. +Now when new feature should be added then new branch is forked off of *hbl*. +.................................................................................. + | feature/foo | | + | ______/| | + | | | | + | | | | +.................................................................................. +This feature is going to be part of Turris OS 5.1.0 and when it is finished and +tested its branch is merged to both *hbl* as well as *hbd*. +.................................................................................. + | | | | + | _______________|_____ | | + |/ \| | + | | | +.................................................................................. +To release Turris OS 5.1.0 we merge again *hbl* to *hbk*. +.................................................................................. + | |______________________ | + | | \| + | | |\<-v5.1.0 + | | | +.................................................................................. +Now we continue with flow to release fixups as well as subsequent minor and major +versions. All changes this way sooner or later end up in *hbk* branch and that +way in binary branches and at users. --------------------------------------------------------------------------------- - ------------------------ - | build: master | - | openwrt: master | - | tos-packages: master | - | packages: master | - ------------------------ - | - | - | - |<---- binaries: dragons (HBD) - | - | ------------------------- ------------------------ - v | build: v.4.0.0 | | build: v4.0.1 | - | | openwrt: #abcd1 | | openwrt: #abcd2 | - | | tos-packages: #efgh1 | | tos-packages: #efgh2 | binaries: turtles (HBT) - | | packages: #ijkl1 | | packages: #ijkl2 | - | ------------------------- ------------------------ - v | | - | | add tag | - | -------------------------- ^ replace branch with hash ^ add tag - | | build: v4.0 | | | replace branch with hash - | | openwrt: 18.06 | | -------------------------- | - |--| tos-packages: master |-->---O--------->------->-| tos-packages: for-v4.0 |-->--O---------->--------- - | | packages: for-v18 | ^ | -------------------------- ^ | - | -------------------------- | | | | - v ^ binaries: 4.0.0 v binaries: 4.0.1 v - | | (HBS) | (HBS) | - | | | -------------------------- | binaries: 4.1.0 (HBL) - | binaries: kittens (HBK) | | build: v4.1 | | | - | | | | openwrt: 18.06 | | v - v | ---| tos-packages: master |-->----------->------->--------->-----O----------->>>> - | |-------------------------------------> | packages: for-v18 | | - | | -------------------------- v add tag & hashes - | | | - | | ------------------------ - | | | build: v4.0.1 | - v v | openwrt: #abcd3 | - | -------------------------- | tos-packages: #efgh3 | - | | build: v5.0 | | packages: #ijkl3 | - |--| openwrt: 20.3 |----->>>> ------------------------ - | | tos-packages: master | - | | packages: for-v20 | - | -------------------------- - v - v - v - v +Branch naming convention +------------------------ --------------------------------------------------------------------------------- +For quick orientation of maintainers in repository stable naming convention is +required. Depending on what you are planning to do you can create new branch with +name prefixed with one of following: + +*hotfix/*:: This is fix for problem affecting *hbk* or binary branches *hbt* and +*hbs*. It has to be based on the latest commit in *hbk* branch and merged to all +branches (*hbk*, *hbl*, *hbd*). + +*bugfix/*:: This is fix for problem affecting *hbl* that is not present neither in +*hbk* branch or in any subsequent binary branches. It has to be based on the latest +commit in *hbl* branch. It is merged to *hbl* as well as to *hbd*. + +*fix/*:: This is fix for problem affecting *hbd* that is not present in neither +*hbl* nor *hbk* or subsequent binary branches. It has to be based on the latest commit +in *hbd* branch and is merged only to *hbd*. + +*feature/*:: New featured that is supposed to be part of next minor release so that +means that it has to be based on *hbl* branch. This can be any change that +modifies packages/lists/medkit or build process itself. It is merged to both *hbl* +as well as to *hbd*. + +*majorfeature/*:: New feature that is supposed to be part of only next major +release. This is discouraged as you probably want to release it rather in some +subsequent minor update but there can be reason why that can't be done and in that +case this can be used. It has to be based on the latest commit in *hbd* branch and +merged back to *hbd*. + +*refactor/*:: This is same as *feature/* but it should not change +packages/lists/medkit or build process. This can be code cleanup, patches cleanup +or any other refactor. + +*majorrefactor/*:: This is combination of *refactor/* and *majorfeature/*. Use +when what you are refactoring is available only in *hbd* branch. + +*hack/*:: This is feature that is to be reverted in the future. + +*majorhack/*:: This is combination of *hack/* and *majorfeature/*. Use this if +hack should be merged only to *hbd*. + +After prefix you should add short name for what you are about to do. Acceptable +is for example name of package or feature you are about to implement. Please do +not use issue numbers of nothing saying generic words (such as: hotfix/problem). + + +Release tags +------------ + + +Operations performed by developers +---------------------------------- + +Developer is anyone who wants to contribute to this repository. Developers are not +allowed to merge to primary branches (*hbk*, *hbl* and *hbd*) and have to ask +maintainers to do so (submit pull or merge request or patch). + +=== Implementing fix for problem in *hbk* (hotfix) +You have to base your work on latest commit in *hbk*. For example: +[,sh] +---------------------------------------------------------------------------------- +git fetch +git checkout -b hotfix/foo origin/hbk +---------------------------------------------------------------------------------- + +Also note that you might and will be asked by maintainer to possibly rebase your +changes on latest *hbk* commit. +[,sh] +---------------------------------------------------------------------------------- +git fetch +git checkout hotfix/foo +git rebase origin/hbk +---------------------------------------------------------------------------------- + +=== Implementing new feature or fixing something affecting *hbl* (bugfix/feature/refactor/hack) +You have to base you work on latest commit in *hbl* branch. For example: +[,sh] +---------------------------------------------------------------------------------- +git fetch +git checkout -b bugfix/foo origin/hbl +---------------------------------------------------------------------------------- + +Same as in case of hotfixes you might be asked by maintainer to rebase your work +on latest commit in *develop* branch. +[,sh] +---------------------------------------------------------------------------------- +git fetch +git checkout bugfix/foo +git rebase origin/develop +---------------------------------------------------------------------------------- + +=== Implementing feature or fix that requires OpenWrt unstable (fix/majorfeature/majorrefactor/majorhack) +You have to base you work on latest commit in *hbk* branch. For example: +[,sh] +---------------------------------------------------------------------------------- +git fetch +git checkout -b bugfix/foo origin/hbk +---------------------------------------------------------------------------------- + + +Operations performed by maintainers +----------------------------------- + +There are well informed maintainers who are well educated with git-craft and with +the flow of this repository that they are allowed to manage *hbk*, *hbl* and *hbd* +branches. For those not so lucky and new in this craft there is following list of +operations commonly performed by maintainer. + +=== Merging hotfix + +Hotfixes should always be merged to branches *hbk*, *hbl* and *hbd*. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbk +git merge --ff-only --gpg-sign hotfix/foo +git checkout hbl +git merge --no-ff --gpg-sign -m "Merge branch 'hotfix/foo' into hbl" hbk +git checkout hbd +git merge --no-ff --gpg-sign -m "Merge branch 'hotfix/foo' into hbd" hbl +git push origin hbk hbl hbd +git branch -d hotfix/foo && git push origin :hotfix/foo +---------------------------------------------------------------------------------- +IMPORTANT: Push target first before you remove source branch. Otherwise GitLab +merge request would be _closed_ and not _merged_. + +Hotfix merge to *hbk* should always be clean. That means that there should be no +merge conflicts (ensured by requiring fast forward only). This is to ensure that +stable release won't be broken by merge. When that can't be done rebase to latest +changes has to be performed. The maintainer can either ask author or do it by +himself. + +There is possibility that hotfix is not required in *hbl* or *hbd* branch because +it can be fixed by some other means or was already fixed by some previous feature. +In such case it should be merged anyway to ease future merge of *hbl* and *hbd* +back to *hbk*. For doing merge without merging changes you can use git merge +strategy `ours`. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbd +git merge --no-ff --strategy=ours --gpg-sign hbk +---------------------------------------------------------------------------------- + +=== Merging feature, bugfix and others for git branch *hbl* + +Branches with new features, bugfixes, refactoring or hacks are merged to *hbl* +branch. This merge should be without conflict as well to prevent bugs created by +merge skipping testing. On merge conflict it should be evaluated, rebased on +latest commit in *hbl* (to resolve conflict) and test again before merge. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbl +git merge --ff-only --gpg-sign feature/foo +git checkout hbd +git merge --no-ff --gpg-sign -m "Merge branch 'feature/foo' into hbd" hbl +git push origin hbl hbd +git branch -d feature/foo && git push origin :feature/foo +---------------------------------------------------------------------------------- +IMPORTANT: Push target first before you remove source branch. Otherwise Gitlab +merge request would be _closed_ and not _merged_. + +=== Merging features, fixes and other to git branch *hbd* + +Branches with new major features, fixes, major refactoring or major hacks are +merged to *hbd* branch. This merge should be without conflict as well to prevent +bugs created by merge skipping testing. On merge conflict it should be evaluated, +rebased on latest commit in *hbd* (to resolve conflict) and test again before +merge. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbd +git merge --ff-only --gpg-sign majorfeature/foo +git push origin hbd +git branch -d majorfeature/foo && git push origin :majorfeature/foo +---------------------------------------------------------------------------------- +IMPORTANT: Push target first before you remove source branch. Otherwise Gitlab +merge request would be _closed_ and not _merged_. + +=== Merging and reverting hack or majorhack + +Hacks are intended to be present only temporally and so it is expected that in +the future we want them reverted and that way removed. This means that hacks are +merged as an exception with merge commit instead of doing fast-forward merge. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbl +git merge --no-ff --gpg-sign feature/foo +... +---------------------------------------------------------------------------------- + +Later hack, thanks to merge commit, can be just reverted by locating appropriate +merge commit hash and reverting it. Note that this is considered as refactor and +new appropriate merge request should be created and review should be performed. +[,sh] +---------------------------------------------------------------------------------- +git checkout -b refactor/foo origin/hbl +git revert -m 1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +---------------------------------------------------------------------------------- + +All stated here also apply on major hack with exception that target branch is +*hbd* instead of *hbl*. + +=== Moving minor release to *hbk* for release build + +Turris OS minor releases are prepared in *hbl* branch but all changes introduced +have to land to *hbk* before they are propagated for testing to HBT and later for +final release to HBS. Thanks to previous steps this should be merge without +conflicts. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbk +git merge --no-ff --no-commit hbl +---------------------------------------------------------------------------------- +Do not create commit immediately as it is required to modify few files: + +- Change `PUBLISH_BRANCH` variable value to `hbs` in file `defaults.sh`. +- Change branch from `develop` to `master` for `turrisospackages` feed in + `feeds.conf` file. + +Now add changes to the git staging area and create a commit. +[,sh] +---------------------------------------------------------------------------------- +git add defaults.sh feeds.conf +git commit --no-edit --gpg-sign +---------------------------------------------------------------------------------- + +The last step before the push to the server has to be propagation of changes to +*hbl* and *hbd* branches. Failing to do so would reset defaults for those branches +with next merge. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbl +git merge --no-ff -m "Merge Turris OS 4.2.0 into hbl" hbk +git checkout hbd +git merge --no-ff -m "Merge Turris OS 4.2.0 into hbd" hbl +git push origin hbk hbl hbd +---------------------------------------------------------------------------------- +Lastly all changes are pushed to server. + +[IMPORTANT] + At the same time it is required to merge branch *develop* to *master* in + _turris-os-packages_ repository! + +=== Moving major release to *hbl* and later to *hbk* for release build + +Turris OS major releases are based on major versions of OpenWrt. HBD branch +collects fixes and changes based on latest OpenWrt development and thus when these +changes became stable thanks to OpenWrt release they have to be moved/merged to +*hbl* and *hbk*. At some point it is decided that there is going to be no new +minor version of Turris OS based on at that time old stable version of OpenWrt and +major release is going to be performed. This can take considerable amount of time +during which it is desirable to still be able to develop and release fixes. This +means that first step has to be move of all changes from *hbd* just to *hbl*. This +is analogous to move of *hbl* to *hbk*: +[,sh] +---------------------------------------------------------------------------------- +git checkout hbl +git merge --no-ff --no-commit hbd +---------------------------------------------------------------------------------- +Commit is not created immediately as changes to defaults have to be reverted: + +- Change `PUBLISH_BRANCH` variable value to `hbl` in file `defaults.sh`. + +[,sh] +---------------------------------------------------------------------------------- +git add defaults.sh +git commit --no-edit --gpg-sign +---------------------------------------------------------------------------------- + +The last step before the push to the server has to be propagation of changes back +to *hbd*. Failing to do so would reset defaults for those branches with next +merge. +[,sh] +---------------------------------------------------------------------------------- +git checkout hbd +git merge --no-ff -m "Merge Turris OS 4.0 into hbd" hbl +git push origin hbl hbd +---------------------------------------------------------------------------------- +Lastly all changes are pushed to server. + +Subsequent merge to *hbk* is performed the same way as if minor release of Turris +OS is being released. + +=== Releasing release candidate + +The release itself is performed outside of this repository. In effect files in HBK +branch are taken, all signatures are updated and all is deployed to HBT. + +Before release the verification should be performed using dedicated script: +[,sh] +---------------------------------------------------------------------------------- +./helpers/new_release.sh verify +---------------------------------------------------------------------------------- +This checks if all boards are in sync. It is acceptable to do release of release +candidate even when not all boards are in sync but such build should not be pushed +to HBS. + +=== Releasing release + +The final release itself is just move of files from HBT to HBS. + +The final releases have to be tagged in this repository as well as in +_turris-os-packages_ repository. There is helper script implemented to correctly +create tag in this repository. Tag is not automatically pushed. It should be +reviewed and pushed manually. +[,sh] +---------------------------------------------------------------------------------- +./helpers/new_release.sh release +git push --tags origin vX.Y.Z +---------------------------------------------------------------------------------- + + +Tips for developers and maintainers +----------------------------------- + +This is collection of various tips and primarily configuration options you can use +to simplify commands described in this flow. + +Use project specific git configuration:: +It is highly advised to use project specific git config. You can apply it by +running following command: +[,sh] +---------------------------------------------------------------------------------- +git config --local include.path ../.gitconfig +---------------------------------------------------------------------------------- + +Sign commits and tags with GPG without using `--gpg-sign` and `-s`:: +You can configure global or local git option `commit.gpgSign` and `tag.gpgSign`. +[,sh] +---------------------------------------------------------------------------------- +git config --local commit.gpgSign true +git config --local tag.gpgSign true +---------------------------------------------------------------------------------- + +Sign commits and tags with specific PGP key:: +If you have more than one PGP key (for example different for personal and work +identity), you can specify exactly which should be always used in git +configuration option `user.signingKey`. Value of that option is fingerprint of +your PGP key. +[,sh] +---------------------------------------------------------------------------------- +git config --local user.signingKey "XXXXXXXXXXXXXXXX" +---------------------------------------------------------------------------------- -- GitLab