Difference between revisions of "Source Release for BES"

From OPeNDAP Documentation
m (Updating the Libtool Version Number)
m (Get the DOI from Zenodo)
(28 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Note that the old pages with the tables of version numbers are gone. Use the web pages themselves as documentation of what has or has not been built. For the current release, include grayed-out links to binaries we do plan to make but keep the grayed-out links in place for the current version only!
 
  
== When we decide to release software ==
+
This pages covers the step needed to release the BES software for Hyrax.  
Use the developers at opendap.org list to send out notices to all the developers about pending releases.
 
  
=== Planned release ===
+
We now depend on the CI/CD process to build binary packages and to test the source builds.
If this is a planned release, send out a notice at least two weeks in advance to anyone who likely has made changes to the software. More lead time is, of course, better. This will allow developers time to get their code and documentation changes into github and onto the master branch in time for the release.  
 
  
Run Coverity!
+
== The Release Process ==
 
+
:'''Tip''': If, while working on the release, you find you need to make changes to the code and you know the CI build will fail, do so on a ''release branch'' that you can merge and discard later. Do not make a release branch if you don't '''need''' it, since it complicates making tags.
=== Emergency releases ===
 
If this is an 'emergency' release, then send out a notice to developers as soon as the decision to release is made, since this will give a chance for other developers to lets us know if there are new changes in the master branch that are ready for release. if we don't get an email from those developers of a particular component, then we should assume that the code might not be 100% ready for release and we should use the version tagged with/for the last release if possible.
 
 
 
Maybe run Coverity - depends on the scope of the changes.
 
  
== The Release Process ==
 
:'''Tip''': If, while working on the release, you find you need to make changes to the code and you know the CI build will fail, do so on a ''release branch'' that you can merge and discard later. If you don't need to do this, skip it. Also, note that the handlers that are ''git submodules'' really make this a hassle, so feel free to skip this step or do it only for the BES itself, etc.
 
:'''Create the release branch.'''
 
:* ''git checkout -b hyrax_release_0.0.0''
 
:* ''git push --set-upstream origin hyrax_release_0.0.0''
 
: For the bes, also make the branch for each submodule:
 
:* ''git submodule foreach 'git checkout -b hyrax_release_0.0.0' ''
 
 
===  Verify the code base ===
 
===  Verify the code base ===
# Make sure that the source code you're using is up-to-date. (''git pull'')
+
# We release using the ''master'' branch. The code on ''master'' must pass the CI build.  
# Have all tickets for the release milestone been resolved?
+
# Make sure that the source code you're using for the following steps is up-to-date. (''git pull'')
# Does the code pass it's tests? The Travis builds should be running the distcheck targets for these packages.
 
#;Note
 
#: For the BES (''or any software that requires parameters passed to configure'') use <tt>DISTCHECK_CONFIGURE_FLAGS=...</tt> when you run <tt>make</tt> For running tests, using <tt>TESTSUITEFLAGS=-j9</tt> will speed up the autconf/autotest tests if the version of autoconf supports parallel testing (but not on CentOS 6 because it's not supported by the stock version of autoconf on that OS).
 
#* ''libdap4''
 
#:: '''make check -j9'''
 
#:: '''make distcheck -j9'''
 
#* ''bes''
 
#:: '''make check -j9'''
 
#:: '''make distcheck -j9 DISTCHECK_CONFIGURE_FLAGS=--with-dependencies=$prefix/deps''' (DISTCHECK_CONFIGURE... no longer needed with automake 1.14 or greater. jhrg 9/21/17)
 
#: How did that go, with the <tt>distcheck</tt> target there? [[Debugging the distcheck target|Look here for help]]
 
 
 
=== Check the<tt> make rpm </tt>target ===
 
Running the <tt>make rpm</tt> target is useful because it will find problems that can slow the process once the final edits are done and the RPMs are being built.  
 
# Make sure to install the ''libdap rpms'' before you build the bes rpms and uninstall them afterwards.:
 
#: '''sudo yum install ~/rpmbuild/RPMS/x86_64/libdap-*'''
 
# Make sure that the bes dependencies have been built using the static option so that the BES rpm will have modules that are statically linked to their dependencies. To check this look at the libraries in <tt>$prefix/deps/lib</tt>. There should be no <tt>*.so</tt> files in the <tt>lib</tt> dir, only <tt>*.a</tt>, <tt>*.la</tt>, and some other directories. To build a new set of dependencies that provide only static libraries, use:
 
#: '''make for-static-rpm -j9 CONFIGURE_FLAGS=--disable-shared'''
 
# Build the BES rpm using those snazzy static libraries, use
 
#: '''make all-static-rpm -j9'''
 
# When finished, uninstall the libdap rpms:
 
#: '''sudo yum uninstall ~/rpmbuild/RPMS/x86_64/libdap-*'''
 
 
 
----
 
 
 
=== Checkpoint ===
 
----
 
Up until now you have only verified the software's readiness for release. Beginning with the follow section you will be making the edits and changes required to update the version numbers and build the actual release files. Do not proceed unless you have passed all of the previous process checks. Thanks.
 
  
=== Update Release Related Files ===
+
=== Update Release Files ===
 
Update the text documentation files and version numbers in the configuration files:
 
Update the text documentation files and version numbers in the configuration files:
  
Line 64: Line 23:
  
 
==== Update the NEWS file ====
 
==== Update the NEWS file ====
To update the NEWS file, just read over the new ChangeLog entries and summarize. In the old days of CVS, the logs automatically included the names of the changed files, but subversion and git don't do that.
+
To update the NEWS file, just read over the new ChangeLog entries and summarize.
==== Update the internal library version numbers ====
 
There are really 2 version numbers for each of these project items. The human version (like bes-3.17.5) and the Libtool API/ABI version which is represented as <tt>CURRENT:REVISION:AGE</tt>. There are special rules for when each of the numbers in the Libtool API/ABI version get incremented that are triggered by the kinds of changes that where made to the code base. The human version number is more arbitrary. So for example, we might make a major API/ABI change and have to change to a new Libtool version like <tt>25:0:0</tt> but the human version might only change from bes-3.17.3 to bes-3.18.0
 
 
 
The rules for shared image version numbers:
 
# No interfaces changed, only implementations (good): Increment REVISION.
 
# Interfaces added, none removed (good): Increment CURRENT, increment AGE, set REVISION to 0.
 
# Interfaces removed or changed (BAD, breaks upward compatibility): Increment CURRENT, set AGE and REVISION to 0.
 
 
 
===== Update The BES dependencies =====
 
In the BES, update the requirements (''Requires'' line in spec file) for ''libdap'' as needed.
 
;Affected Files:
 
: *.spec
 
  
===== Updating the Human Version Number =====
+
==== Update the Version Numbers for Humans ====
 
# Determine the human version number. This appears to be a somewhat subjective process.
 
# Determine the human version number. This appears to be a somewhat subjective process.
 
# Edit each of the ''Affected Files'' and update the human version number.
 
# Edit each of the ''Affected Files'' and update the human version number.
 +
 
:;Affected Files:  
 
:;Affected Files:  
 
:: configure.ac
 
:: configure.ac
 
:: *.spec
 
:: *.spec
 +
:: debian/changelog (see [https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#changelog] Debian ChangeLog)
 +
:: travis.yml (for BES only)
 
:: NEWS
 
:: NEWS
:: README.md
+
:: README.md (Add the libdap version the README.md)
 
:: INSTALL
 
:: INSTALL
  
Note that it's helpful to have, in the '''NEWS''' file, a list of the Jira ''Bug'' tickets that have been closed since the last release. Make a filter for this by going to ''Advanced search'' on the ''Issues'' page/menu. Here's what the JQL looks like:
+
It's helpful to have, in the '''NEWS''' file and the Web site and the release notes, a list of the Jira tickets that have been closed since the last release. The best way to do this is to goto ''Jira's Issues'' page and look at the ''Tickets closed recently'' item. From there, click on ''Advanced'' and edit the time range so it matches the time range since the past release to now, then ''Export'' that info as an excel spreadsheet (the icon with a hat and a down arrow). YMMV regarding how easy this is and Jira's UI changes often.
  ''project = HYRAX AND updatedDate >= "2017/05/31" AND resolution = Done AND Type = Bug ORDER BY Key''
 
Edit the date, of course. If you ''Save as'' this search, it will appear in the ''Issues'' menu. The Jira interface makes editing the date easy. You can find the date of the last release from our web page or from the GitHub tag/release information.
 
  
==== Commit & Push these changes. ====
+
==== Update the RPM dependencies ====
''Srsly.''
+
In the RPM ''.spec'' file, update the dependencies as needed.
  
==== For the BES modules ====
+
;Affected Files:
''This will change when the BES project is restructured.''
+
: *.spec
  
Do the release items above for the source release and then, for the modules, do the following:
+
==== Update the internal library version numbers ====
* Confirm that the modules are on the correct branch:
+
There are really 2 version numbers for each of these project items. The ''human'' version (like bes-3.17.5) and the ''library'' API/ABI version which is represented as <tt>CURRENT:REVISION:AGE</tt>. There are special rules for when each of the numbers in the library API/ABI version get incremented that are triggered by the kinds of changes that where made to the code base. The human version number is more arbitrary. So for example, we might make a major API/ABI change and have to change to a new Libtool version like <tt>25:0:0</tt> but the human version might only change from bes-3.17.3 to bes-3.18.0
*: '''git submodule foreach 'git status''''
 
* If modules have been added or removed you will need to edit the file <tt>bes/modules/all_modules.txt</tt> to reflect the changes.
 
* Use the magic version update shell scripty to update the various module's ChangeLog and version numbers:
 
*: '''cd modules; ./version_update_modules.sh -v `cat all_modules.txt`'''
 
* Have a look at what happened:
 
*: '''git submodule foreach 'git status''''
 
* In each module:
 
**Review <tt>ChangeLog</tt> file and adjust the libtool version numbers as needed.
 
** Edit the module Makefile.am look for and update  '''M_VER=''' line. (Human Version Number)
 
* Commit and push module changes:
 
*: '''git submodule foreach 'git commit -a -m "updated for Hyrax-xx.xx.xx"''''
 
*: '''git submodule foreach 'git push''''
 
That completes the update of the modules (sub-projects)
 
  
''Lastly commit and push the changes to the BES!''
+
The rules for shared image version numbers:
: '''git commit -a -m "Updated for Hyrax-xx.xx.xx" '''
+
# No interfaces changed, only implementations (good): Increment REVISION.
: '''git push'''
+
# Interfaces added, none removed (good): Increment CURRENT, increment AGE, set REVISION to 0.
 +
# Interfaces removed or changed (BAD, breaks upward compatibility): Increment CURRENT, set AGE and REVISION to 0.
 +
 
 +
See ''How to see the scope of API/ABI changes in C++ sources'' below for gruesome details. Often basic knowledge of the edits is good enough.
 +
 
 +
;Affected Files:
 +
: configure.ac
  
=== Build And Upload Distribution Files ===
+
==== For the BES HDF4/5 modules (BES only) ====
# Make the tar file
+
# Goto those directories and update the ChangeLog, NEWS, README, and INSTALL files (even though INSTALL is not used by many).
#* '''make dist'''
+
# Update the module version numbers in their respective Makefile.am files.
#* '''Sign''' the tar file. [[SecureEmail | See the help item on the main trac wiki page if you need instructions.]]
+
# Commit and Push these changes.
#* Move the file to the web site for distribution.
 
# For the BES, see below
 
# Make the [[RPM]]
 
#*'''Sign''' the RPM
 
#*Move to a directory on the web site and use script to move the RPM around (later, once all the RPMs are uploaded). -->
 
# Update the web pages: A complex and (at this time - 2/21/06) changing process.
 
  
=== Tag The Release ===
+
=== Commit ===
 +
# Commit and push the BES ocde. Wait for the CI/CD builds to complete. You must be working on the ''master'' branch to get the CD package builds to work.
 +
 
 +
=== Tag ===
 +
==== Tag The Release ====
 
# '''git tag -a version-<numbers> -m "Version <number>"'''
 
# '''git tag -a version-<numbers> -m "Version <number>"'''
 
# '''git push origin version-<numbers>'''
 
# '''git push origin version-<numbers>'''
Line 136: Line 75:
 
# '''git tag -a hyrax-<numbers> -m "Hyrax <number>"'''
 
# '''git tag -a hyrax-<numbers> -m "Hyrax <number>"'''
 
# '''git push origin hyrax-<numbers>'''
 
# '''git push origin hyrax-<numbers>'''
#: NB: Instead of tagging all of the modules, use the saved commit hashes that git tracks for submodules. This cuts down on the bookkeeping for releases and removes one source of error; recording the wrong version for one of the 17 or so modules. thus, there is no need to tag the code in the modules.
+
#: NB: Instead of tagging the HDF4/5 modules, use the saved commit hashes that git tracks for submodules. This cuts down on the bookkeeping for releases and removes one source of error.
# '''Mark the release on Github:'''
+
# Mark the release on Github:
#* Goto the 'releases' page and click the 'Tags' tab. There:
+
#* Goto the 'releases' page and click the 'Tags' tab. There, click the ellipses (...) on the right of the 'version-*' tag and:
 
#** Enter a ''title'' for the release
 
#** Enter a ''title'' for the release
 
#** Copy the most recent text from the NEWS file into the ''describe'' field
 
#** Copy the most recent text from the NEWS file into the ''describe'' field
 
#** Click ''Update this release'' or ''Save draft''
 
#** Click ''Update this release'' or ''Save draft''
  
== [[RPM#Building_RPMs_that_have_Statically_Linked_Handlers|Build The Release RPM and Source Distributions]] ==
+
=== Get the DOI from Zenodo ===
 +
# Goto Zenodo and look at the 'upload' page. Since the libdap, BES and OLFS repositories are linked to Zenodo, the newly-tagged code is uploaded to Zenodo automatically and a DOI is minted for us.
 +
# Click on the new version, then click on the DOI tag in the pane on the right of the page for the given release.
 +
# Copy the DOI as markdown from the window that pops up and paste that into the info for the version back in Github land.
 +
# Also paste that into the README file. Commit using ''[skip ci]'' so we don't do a huge build (or do the build, it really doesn't matter that much).
 +
 
 +
===== Images =====
 +
;The Zenodo upload page: [[File:Screenshot 2018-12-06 11.06.44.png|200px|thumb|left|Zenodo upload page]]
 +
 
 +
=== How to see the scope of API/ABI changes in C++ sources ===
 +
Determine the new software version (assuming you don't already know the extent of the changes that have been made)
 +
: For C++, build a file of the methods and their arguments using:
 +
:: '''nm .libs/libdap.a | c++filt | grep ' T .*::' | sed 's@.* T \(.*\)@\1@' > libdap_funcs'''
 +
: and compare that using <tt>diff</tt> on the previous release's library.
 +
Assess the changes you find based on the following rules for the values of <tt>CURRENT</tt>,<tt>REVISION</tt>, and <tt>AGE</tt>
 +
* No interfaces changed, only implementations (good): ==> Increment REVISION.
 +
* Interfaces added, none removed (good): ==> Increment CURRENT, increment AGE, set REVISION to 0.
 +
* Interfaces removed or changed (BAD, breaks upward compatibility): ==> Increment CURRENT, set AGE and REVISION to 0.
 +
The current value of  <tt>CURRENT</TT>,<tt>REVISION</tt>, and <tt>AGE</tt> can be found in <tt>configure.ac</tt>:
 +
<source lang="bash">
 +
LIB_DIS_CURRENT=14
 +
LIB_DIS_AGE=6
 +
LIB_DIS_REVISION=1
 +
</source>
 +
Once you have determined the new values of  the <tt>CURRENT:REVISION:AGE</tt>  strings then:
 +
;Edit the configure.ac and update the version values to the new ones.

Revision as of 17:11, 7 December 2018

This pages covers the step needed to release the BES software for Hyrax.

We now depend on the CI/CD process to build binary packages and to test the source builds.

1 The Release Process

Tip: If, while working on the release, you find you need to make changes to the code and you know the CI build will fail, do so on a release branch that you can merge and discard later. Do not make a release branch if you don't need it, since it complicates making tags.

1.1 Verify the code base

  1. We release using the master branch. The code on master must pass the CI build.
  2. Make sure that the source code you're using for the following steps is up-to-date. (git pull)

1.2 Update Release Files

Update the text documentation files and version numbers in the configuration files:

1.2.1 Update the ChangeLog file.

Use the script gitlog-to-changelog (which can be found with Google) to update the ChangeLog file by running it using the --since="<date>" option with a date one day later in time than the newest entry in the current ChangeLog.

gitlog-to-changelog --since="1970-01-01" (Specify a date one day later than the one at the top of ChangeLog)

Save the result to a temp file and combine the two files:

cat tmp ChangeLog > ChangeLog.tmp; mv ChangeLog.tmp ChangeLog

If you're making the first ChangeLog entries, then you'll need to create the ChangeLog file first.
Tip: When you're making the commit log entries, use line breaks so ChangeLog will be readable. That is, use lines < 80 characters long.

1.2.2 Update the NEWS file

To update the NEWS file, just read over the new ChangeLog entries and summarize.

1.2.3 Update the Version Numbers for Humans

  1. Determine the human version number. This appears to be a somewhat subjective process.
  2. Edit each of the Affected Files and update the human version number.
Affected Files
configure.ac
*.spec
debian/changelog (see [1] Debian ChangeLog)
travis.yml (for BES only)
NEWS
README.md (Add the libdap version the README.md)
INSTALL

It's helpful to have, in the NEWS file and the Web site and the release notes, a list of the Jira tickets that have been closed since the last release. The best way to do this is to goto Jira's Issues page and look at the Tickets closed recently item. From there, click on Advanced and edit the time range so it matches the time range since the past release to now, then Export that info as an excel spreadsheet (the icon with a hat and a down arrow). YMMV regarding how easy this is and Jira's UI changes often.

1.2.4 Update the RPM dependencies

In the RPM .spec file, update the dependencies as needed.

Affected Files
*.spec

1.2.5 Update the internal library version numbers

There are really 2 version numbers for each of these project items. The human version (like bes-3.17.5) and the library API/ABI version which is represented as CURRENT:REVISION:AGE. There are special rules for when each of the numbers in the library API/ABI version get incremented that are triggered by the kinds of changes that where made to the code base. The human version number is more arbitrary. So for example, we might make a major API/ABI change and have to change to a new Libtool version like 25:0:0 but the human version might only change from bes-3.17.3 to bes-3.18.0

The rules for shared image version numbers:

  1. No interfaces changed, only implementations (good): Increment REVISION.
  2. Interfaces added, none removed (good): Increment CURRENT, increment AGE, set REVISION to 0.
  3. Interfaces removed or changed (BAD, breaks upward compatibility): Increment CURRENT, set AGE and REVISION to 0.

See How to see the scope of API/ABI changes in C++ sources below for gruesome details. Often basic knowledge of the edits is good enough.

Affected Files
configure.ac

1.2.6 For the BES HDF4/5 modules (BES only)

  1. Goto those directories and update the ChangeLog, NEWS, README, and INSTALL files (even though INSTALL is not used by many).
  2. Update the module version numbers in their respective Makefile.am files.
  3. Commit and Push these changes.

1.3 Commit

  1. Commit and push the BES ocde. Wait for the CI/CD builds to complete. You must be working on the master branch to get the CD package builds to work.

1.4 Tag

1.4.1 Tag The Release

  1. git tag -a version-<numbers> -m "Version <number>"
  2. git push origin version-<numbers>

If this is part of Hyrax, also tag this point in the master branch with the Hyrax release number:

  1. git tag -a hyrax-<numbers> -m "Hyrax <number>"
  2. git push origin hyrax-<numbers>
    NB: Instead of tagging the HDF4/5 modules, use the saved commit hashes that git tracks for submodules. This cuts down on the bookkeeping for releases and removes one source of error.
  3. Mark the release on Github:
    • Goto the 'releases' page and click the 'Tags' tab. There, click the ellipses (...) on the right of the 'version-*' tag and:
      • Enter a title for the release
      • Copy the most recent text from the NEWS file into the describe field
      • Click Update this release or Save draft

1.5 Get the DOI from Zenodo

  1. Goto Zenodo and look at the 'upload' page. Since the libdap, BES and OLFS repositories are linked to Zenodo, the newly-tagged code is uploaded to Zenodo automatically and a DOI is minted for us.
  2. Click on the new version, then click on the DOI tag in the pane on the right of the page for the given release.
  3. Copy the DOI as markdown from the window that pops up and paste that into the info for the version back in Github land.
  4. Also paste that into the README file. Commit using [skip ci] so we don't do a huge build (or do the build, it really doesn't matter that much).
1.5.1 Images
The Zenodo upload page
Zenodo upload page

1.6 How to see the scope of API/ABI changes in C++ sources

Determine the new software version (assuming you don't already know the extent of the changes that have been made)

For C++, build a file of the methods and their arguments using:
nm .libs/libdap.a | c++filt | grep ' T .*::' | sed 's@.* T \(.*\)@\1@' > libdap_funcs
and compare that using diff on the previous release's library.

Assess the changes you find based on the following rules for the values of CURRENT,REVISION, and AGE

  • No interfaces changed, only implementations (good): ==> Increment REVISION.
  • Interfaces added, none removed (good): ==> Increment CURRENT, increment AGE, set REVISION to 0.
  • Interfaces removed or changed (BAD, breaks upward compatibility): ==> Increment CURRENT, set AGE and REVISION to 0.

The current value of CURRENT,REVISION, and AGE can be found in configure.ac:

LIB_DIS_CURRENT=14
LIB_DIS_AGE=6
LIB_DIS_REVISION=1

Once you have determined the new values of the CURRENT:REVISION:AGE strings then:

Edit the configure.ac and update the version values to the new ones.