# How to release GRASS GIS binaries and source code *Note: Some steps in this text are to be done by the development coordinator (currently Markus Neteler, PSC Chair) due to needed logins.* ## HOWTO create a release ### Preparations Check examples if still compiling ```bash ( cd doc/raster/r.example/ ; make clean ; make ) ( cd doc/vector/v.example/ ; make clean ; make ) ``` ### Fix typos in source code with ```bash tools/fix_typos.sh ``` ### i18N: sync from Transifex See Exception Latvian as Latvian is directly edited in git and then sync'ed from master .po files ```bash cd locale sh ~/software/grass_addons_git/tools/transifex_merge.sh make make verify # ... then fix .po files as needed. # # requires https://trac.osgeo.org/grass/ticket/3539 ## after that push fixes to transifex: #cd locale/transifex/ #tx --debug push -t ``` ### Update of configure base files *Only allowed in RC cycle, not for final release!* Check that autoconf scripts are up-to-date: ```bash rm -f config.guess config.sub wget http://git.savannah.gnu.org/cgit/config.git/plain/config.guess wget http://git.savannah.gnu.org/cgit/config.git/plain/config.sub git diff config.guess config.sub autoconf-2.13 ``` Now check if configure still works. If yes, submit to git: ```bash git add config.guess config.sub configure git checkout -b config_sub_update_r78 git commit -m"config.guess + config.sub: updated from http://git.savannah.gnu.org/cgit/config.git/plain/" config.guess config.sub configure # test by running ./configure git push origin config_sub_update_r78 # open PR and merge ``` ### Cleanup leftover rubbish files ```bash rm -f locale/templates/*.pot rm -f locale/po/messages.mo rm -f demolocation/PERMANENT/.bash* find . -name '*~' | xargs rm find . -name '*.bak' | xargs rm find . -name '*.swp' | xargs rm find . -name '.#*' | xargs rm find . -name '*.orig' | xargs rm find . -name '*.rej' | xargs rm find . -name '*.o' | xargs rm find . -name '*.pyc' | xargs rm find . -name 'OBJ.*' | xargs rm -r find . -name '__pycache__' | xargs rm -r rm -f lib/python/ctypes/ctypesgencore/parser/lextab.py rm -f gui/wxpython/menustrings.py gui/wxpython/build_ext.pyc \ gui/wxpython/xml/menudata.xml gui/wxpython/xml/module_tree_menudata.xml chmod -R a+r * ``` Double check: ```bash git status ``` ### Create release branch (only if not yet existing) .. see section below at end of file. ### Update VERSION file to release version number Directly edit VERSION file in GH interface: Example: ```bash 7 8 1RC1 2019 ``` ~~Update OSGeo4W setup.hint file~~ ~~no longer needed~~ ~~vim mswindows/osgeo4w/setup_x86.hint.tmpl~~ ~~vim mswindows/osgeo4w/setup_x86_64.hint.tmpl~~ ### Create release tag (see ) Preparation: ### Changelog and tagging etc ```bash # update from GH # assumptions: # - own fork as "origin" # - remote repo as "upstream" git fetch --all --prune && git checkout releasebranch_7_8 && \ git merge upstream/releasebranch_7_8 && git push origin releasebranch_7_8 # create version env var for convenience: MAJOR=`cat include/VERSION | head -1 | tail -1` MINOR=`cat include/VERSION | head -2 | tail -1` RELEASE=`cat include/VERSION | head -3 | tail -1` VERSION=${MAJOR}.${MINOR}.${RELEASE} echo $VERSION # RELEASETAG variable not really needed any more: TODAY=`date +"%Y%m%d"` RELEASETAG=release_${TODAY}_grass_${MAJOR}_${MINOR}_${RELEASE} echo $RELEASETAG ``` ### Tag release (on GitHub) ```bash echo "$VERSION" ``` To be done in GH interface: Tag version | target (examples): 7.8.1RC1 | releasebranch_7_8 Add release desciption (re-use existing texts as possible, from ) If RC, then check [x] This is a pre-release ### Packaging of source code tarball ```bash # fetch tarball from GitHub wget https://github.com/OSGeo/grass/archive/${VERSION}.tar.gz -O grass-${VERSION}.tar.gz md5sum grass-${VERSION}.tar.gz > grass-${VERSION}.md5sum ``` Create Changelog file on release branch: ```bash python tools/gitlog2changelog.py mv ChangeLog ChangeLog_$VERSION head ChangeLog_$VERSION gzip ChangeLog_$VERSION ``` ### Reset include/VERSION file to git version Directly edit VERSION file in GH interface: Example: ```bash 7 8 1dev 2019 ``` Commit as "back to dev" Reset local copy to GH: ```bash # update from GH # assumptions: # - own fork as "origin" # - remote repo as "upstream" git fetch --all --prune && git checkout releasebranch_7_8 && \ git merge upstream/releasebranch_7_8 && git push origin releasebranch_7_8 ``` ### Upload source code tarball to OSGeo servers Note: grasslxd only reachable via jumphost - https://wiki.osgeo.org/wiki/SAC_Service_Status#GRASS_GIS_server ```bash # Store the source tarball (twice) in (use scp -p FILES grass:): SERVER1=grasslxd SERVER1DIR=/var/www/code_and_data/grass$MAJOR$MINOR/source/ SERVER2=upload.osgeo.org SERVER2DIR=/osgeo/download/grass/grass$MAJOR$MINOR/source/ echo $SERVER1:$SERVER1DIR echo $SERVER2:$SERVER2DIR # upload along with associated files: scp -p grass-$VERSION.* AUTHORS COPYING ChangeLog_$VERSION.gz \ INSTALL REQUIREMENTS.html SUBMITTING neteler@$SERVER1:$SERVER1DIR scp -p grass-$VERSION.* AUTHORS COPYING ChangeLog_$VERSION.gz \ INSTALL REQUIREMENTS.html SUBMITTING neteler@$SERVER2:$SERVER2DIR # Only at full release! # generate link to "latest" source code ssh neteler@$SERVER1 "cd $SERVER1DIR ; rm -f grass-$MAJOR.$MINOR-latest.tar.gz" ssh neteler@$SERVER1 "cd $SERVER1DIR ; ln -s grass-$VERSION.tar.gz grass-$MAJOR.$MINOR-latest.tar.gz" ssh neteler@$SERVER1 "cd $SERVER1DIR ; rm -f grass-$MAJOR.$MINOR-latest.md5sum" ssh neteler@$SERVER1 "cd $SERVER1DIR ; ln -s grass-$VERSION.tar.gz grass-$MAJOR.$MINOR-latest.md5sum" # verify echo "https://$SERVER1/grass$MAJOR$MINOR/source/" # update winGRASS related files: Update the winGRASS version vim grass-addons/tools/wingrass-packager/grass_packager_release.bat vim grass-addons/tools/wingrass-packager/grass_addons.sh vim grass-addons/tools/wingrass-packager/grass_copy_wwwroot.sh vim grass-addons/tools/wingrass-packager/cronjob.sh # major/minor release only # update addons - major/minor release only vim grass-addons/tools/addons/grass-addons-publish.sh vim grass-addons/tools/addons/grass-addons-build.sh vim grass-addons/tools/addons/grass-addons.sh ``` Release is done. ### Advertise new release #### Update CMS web site to show new version - News section - - - - TODO: git tags - (add tag): echo $RELEASETAG #### Write announcement and publish it To easily generate the entries for the trac Wiki release pages, use a `git log` approach: - List of latest changes (example, get from GitHub release page) - https://github.com/OSGeo/grass/compare/releasebranch_7_8@%7B05-05-20%7D...releasebranch_7_8@%7B09-26-20%7D - identify start and end commit hash - extract entries from oneline git log and prepare for trac Wiki copy-paste: ``` #START=76d5988 #END=8a81328 ##git log --oneline | sed -n "+^$START+,+^$END+p;+^$END+q" # verify git log --oneline | sed -n '/^76d5988/,/^8a81328/p;/^8a81328/q' | tac # prepare for trac Wiki release page git log --oneline | sed -n '/^76d5988/,/^8a81328/p;/^8a81328/q' | cut -d' ' -f2- | sed 's+^+ * G78:+g' | sort -u ``` - store entries in trac, by section: - - <- add content of major changes only - update version in - ~~store in Web as announces/announce_grass$MAJOR$MINOR$RELEASE.html <- how? with protected PHP upload page?~~ (dropped since CMS) #### Only in case of new major release - update cronjob '[cron_grass_HEAD_src_snapshot.sh](https://github.com/OSGeo/grass-addons/tree/master/tools/cronjobs_osgeo_lxd)' on grass.osgeo.org to next but one release tag for the differences - wiki updates, only when new major release: - {{cmd|xxxx}} macro: - update last version on main page - trac updates, only when new major release: - Set "complete" flag in --> Edit Milestone - also: Retarget associated open tickets to milestone 7.8.x - Batch modify tickets, set to next milestone (update this query accordingly: two entries to change): - - Set max items to 1000, then select all shown tickets via Status: assigned/new/reopened sections - Scroll down to "Batch modify": under the "Comment" section, add Field "Milestone" and set to next version - then use "Change ticket" button, done. - Only in case of new release branch being created: - Add Wiki Macro definitions for manual pages G7X:modulename - Edit: #### WinGRASS notes - Update grass_packager_release.bat, eg. ``` set MAJOR=7 set MINOR=8 set PATCH=0RC1 ``` - Update addons (grass_addons.sh) rules, eg. ``` compile $GIT_PATH/grass7 $GISBASE_PATH/grass780RC1 $ADDON_PATH/grass780RC1/addons ``` - Modify grass_copy_wwwroot.sh accordingly, eg. ``` copy_addon 781RC1 7.8.1RC1 ``` #### Launchpad notes - Create milestone and release: - Upload tarball for created release - Update daily recipe contents: #### Packaging notes - - - #### Marketing - tell others about release - Notify all packagers (MN has email list) - If release candidate: - - - If official release: - publish related announcement press release at: - Our GRASS web site: /announces/ - Note: DON'T use relative links there - Our main mailing lists: - | - | - | - DebianGIS: - send only small note - FreeGIS: - Geowanking: - OSGeo.org: Via Email: - info@osgeo.org - (franz-josef.behr@gismngt.de) - mfeilner@linuxnewmedia.de - info@harzer.de - editor-geo@geoconnexion.com Via Web: - - (submit news, MN) - - (MN) --> Press releases - (News -> Submit Press Release) - - (MN) - (MN) -> Share your news with the EO community - (update, MN) - See also: - ... anywhere else? Please add here.