Source Release for BES: Difference between revisions

From OPeNDAP Documentation
⧼opendap2-jumptonavigation⧽
No edit summary
Line 10: Line 10:
# Make sure that the source code you're using for the following steps is up-to-date. (''git pull'')
# Make sure that the source code you're using for the following steps is up-to-date. (''git pull'')


=== Update the internal library (API/ABI) version numbers. <s>Determine the scope of API/ABI changes in C++ sources</s> ===
== Update the internal library (API/ABI) version numbers. ==
* In the '''configure.ac''' file locate each of:
* In the '''configure.ac''' file locate each of:
** LIB_DIS_REVISION
** LIB_DIS_REVISION
Line 50: Line 50:




<s>
== Update the '''ChangeLog''' file. ==
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 the command:
:: <tt style="font-size: 1.1em; font-weight: bold;">nm .libs/libdap.a | c++filt | grep ' T .*::' | sed 's@.* T \(.*\)@\1@' > libdap_funcs</tt>
: 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>
 
=== Update Release Files ===
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.
* Update the text documentation files and version numbers in the configuration files:
</s>
 
 
=== Update the '''ChangeLog''' file. ===
Use the script <tt>gitlog-to-changelog</tt> (which can be found with Google) to update the '''ChangeLog''' file by running it using the <tt>--since="<date>"</tt> option with a date one day later in time than the newest entry in the current ChangeLog.  
Use the script <tt>gitlog-to-changelog</tt> (which can be found with Google) to update the '''ChangeLog''' file by running it using the <tt>--since="<date>"</tt> option with a date one day later in time than the newest entry in the current ChangeLog.  
: <tt style="font-size: 1.1em; font-weight: bold;">gitlog-to-changelog --since="1970-01-01"</tt>
: <tt style="font-size: 1.1em; font-weight: bold;">gitlog-to-changelog --since="1970-01-01"</tt>
Line 82: Line 59:
'''Tip''': ''When you're making the commit log entries, use line breaks so ChangeLog will be readable. That is, use lines < 80 characters long.''
'''Tip''': ''When you're making the commit log entries, use line breaks so ChangeLog will be readable. That is, use lines < 80 characters long.''


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


=== Update the Version Numbers for Humans ===
== Update the Version Numbers for Humans ==
;Affected Files:  
;Affected Files:  
: configure.ac
: configure.ac
: debian/changelog (see [https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#changelog] Debian ChangeLog)
: debian/changelog (see [https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#changelog] Debian ChangeLog)
: .travis.yml (for BES only; edit the ''LIBDAP_RPM_VERSION'' in the ''env: global:'' section)
: NEWS
: NEWS
: README.md
: README.md
Line 99: Line 75:
(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.)
(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.)


=== Update the libdap version ===
== Update the libdap version ==
Determine the libdap version associated with this release by checking the contents of the file <tt>libdap4-snapshot</tt> This file should contain a single line like this:
Determine the libdap version associated with this release by checking the contents of the file <tt>libdap4-snapshot</tt> The <tt>libdap4-snapshot</tt> file should contain a single line like this:
<pre>
<pre>
libdap4-3.20.9-0 2021-12-28T19:23:45+0000
libdap4-3.20.9-0 2021-12-28T19:23:45+0000
Line 107: Line 83:
The libdap version for the above example is: <tt>libdap-3.20.9</tt> (The version is NOT <tt>libdap4-3.20.9</tt>)
The libdap version for the above example is: <tt>libdap-3.20.9</tt> (The version is NOT <tt>libdap4-3.20.9</tt>)


==== Update the libdap version in the RPM spec files ====
=== Update the libdap version in the .travis.yml file ===
;Affected Files
: .travis.yml
 
In the .travis.yml file update the value of  ''LIBDAP_RPM_VERSION'' in the ''env: global:'' section so that it contains the complete numerical value of the libdap version you determined in the previous step. Using the previous example the value would be:
<pre>
    - LIBDAP_RPM_VERSION=3.20.9-0
</pre>
 
=== Update the libdap version in the RPM spec files ===
;Affected Files
;Affected Files
: bes.spec*.in
: bes.spec*.in
Line 119: Line 104:
(''These lines may not be adjacent to each other in the spec files'')
(''These lines may not be adjacent to each other in the spec files'')


==== Update the libdap version in the README.md file ====
=== Update the libdap version in the README.md file ===
;Affected Files
;Affected Files
: README.md
: README.md
Line 125: Line 110:
* Update the README.md file with libdap version and the associated DOI link (using the markdown you got from Zenodo).
* Update the README.md file with libdap version and the associated DOI link (using the markdown you got from Zenodo).


=== Update the RPM dependencies ===
== Update the RPM dependencies ==
In the RPM ''.spec'' file, update the dependencies as needed.
In the RPM ''.spec'' file, update the dependencies as needed.


Line 131: Line 116:
: *.spec (In the BES it's ''bes.spec.*''')
: *.spec (In the BES it's ''bes.spec.*''')


=== Update the internal library version numbers ===
== Update the module version numbers for humans ==
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
 
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.
 
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
</s>
 
=== Update the module version numbers for humans ===
In bes/modules/common, check that the file all-modules.txt is complete and update as needed. Then run:
In bes/modules/common, check that the file all-modules.txt is complete and update as needed. Then run:


Line 159: Line 130:
See below for special info about the HDF4/5 modules (which also applies to any modules not in the BES GitHub repo).
See below for special info about the HDF4/5 modules (which also applies to any modules not in the BES GitHub repo).


=== For the BES HDF4/5 modules (BES only) ===
== For the BES HDF4/5 modules (BES only) ==
# Goto those directories and update the ChangeLog, NEWS, README, and INSTALL files (even though INSTALL is not used by many).
# Goto those directories and update the ChangeLog, NEWS, README, and INSTALL files (even though INSTALL is not used by many).
# Update the module version numbers in their respective Makefile.am files.
# Update the module version numbers in their respective Makefile.am files.
# Commit and Push these changes.
# Commit and Push these changes.


=== Update the Build Offset ===
== Update the Build Offset ==
''Setting the build offset correctly will set the build number for the new release to "0".''
''Setting the build offset correctly will set the build number for the new release to "0".''


In the file <tt>travis/travis_bes_build_offset.sh</tt> set the value of <tt>BES_TRAVIS_BUILD_OFFSET</tt> to the number of the last TravisCI build plus one. The previous commit and push will have triggered a TravisCI build. Find the build number for the previous commit in [https://app.travis-ci.com/github/OPENDAP/bes the TravisCI page for the BES] and use that build number plus 1.
In the file <tt>travis/travis_bes_build_offset.sh</tt> set the value of <tt>BES_TRAVIS_BUILD_OFFSET</tt> to the number of the last TravisCI build plus one. The previous commit and push will have triggered a TravisCI build. Find the build number for the previous commit in [https://app.travis-ci.com/github/OPENDAP/bes the TravisCI page for the BES] and use that build number plus 1.


=== Commit Changes ===
== Commit Changes ==
''Be sure that you have completed all of the the changes to the various ChangeLog, NEWS, INSTALL, configure.ac,  <tt>travis/travis_bes_build_offset.sh</tt>, and other files before proceeding!''
''Be sure that you have completed all of the the changes to the various ChangeLog, NEWS, INSTALL, configure.ac,  <tt>travis/travis_bes_build_offset.sh</tt>, and other files before proceeding!''


# Commit and push the BES code. Wait for the CI/CD builds to complete. You must be working on the ''master'' branch to get the CD package builds to work.
# Commit and push the BES code. 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 the BES code ===
== Tag the BES code ==
# Tag the bes code using command line git in your local (up-to-date) '''bes''' project
# Tag the bes code using command line git in your local (up-to-date) '''bes''' project
#* <tt style="font-size: 1.1em; font-weight: bold;">git tag -m "Version <number>" -a <numbers> </tt>
#* <tt style="font-size: 1.1em; font-weight: bold;">git tag -m "Version <number>" -a <numbers> </tt>
Line 184: Line 155:
#: '''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.''
#: '''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.''


=== Create the BES release on Github ===
== Create the BES release on Github ==
# [https://github.com/OPENDAP/bes Goto the BES project page in GitHub]
# [https://github.com/OPENDAP/bes Goto the BES project page in GitHub]
# Choose the '''releases''' tab.
# Choose the '''releases''' tab.
Line 195: Line 166:
#** If you have previously edited the release page you can click '''Update this release'''
#** If you have previously edited the release page you can click '''Update this release'''


=== Publish and Sign ===
== Publish and Sign ==


When the release is made on GitHub the source tar bundle is made automatically. However, this bundle is '''not''' the one we wish to publish because it requires people to have ''autoconf'' installed. Rather we want to use the result of "<tt>make dist</tt>" which will have the <tt>configure</tt> script pre-generated.
When the release is made on GitHub the source tar bundle is made automatically. However, this bundle is '''not''' the one we wish to publish because it requires people to have ''autoconf'' installed. Rather we want to use the result of "<tt>make dist</tt>" which will have the <tt>configure</tt> script pre-generated.
Line 216: Line 187:
##: <tt> gpg --verify bes-x.y.z.tgz.sig bes-x.y.z.tgz</tt>
##: <tt> gpg --verify bes-x.y.z.tgz.sig bes-x.y.z.tgz</tt>


=== Get the DOI from Zenodo ===
== Get the DOI from Zenodo ==
'''We should stop putting the DOIs and the cool badge in the README because the copy of README archived by Zenodo will be one step out of sync.'''
'''We should stop putting the DOIs and the cool badge in the README because the copy of README archived by Zenodo will be one step out of sync.'''


Line 230: Line 201:
'''Tip:''' ''If you are trying to locate the '''libdap''' releases in Zenodo you have to search for the string:'' <tt style="font-size: 1.1em; font-weight: bold;">libdap4</tt>
'''Tip:''' ''If you are trying to locate the '''libdap''' releases in Zenodo you have to search for the string:'' <tt style="font-size: 1.1em; font-weight: bold;">libdap4</tt>


===== Images =====
=== Images ===
[[File:Screenshot 2018-12-06 11.06.44.png|none|thumb|400px|border|left|Zenodo upload page]]
[[File:Screenshot 2018-12-06 11.06.44.png|none|thumb|400px|border|left|Zenodo upload page]]

Revision as of 21:57, 30 December 2021

This pages covers the steps required 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.

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.

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)

Update the internal library (API/ABI) version numbers.

  • In the configure.ac file locate each of:
    • LIB_DIS_REVISION
    • LIB_PPT_REVISION
    • LIB_XML_CMD_REVISION
  • Increase the value of each by one (1).
  • Save the file.
  • Update the text documentation files and version numbers in the configuration files:

Example of the relevant section from configure.ac:

LIB_DIS_CURRENT=18
LIB_DIS_AGE=3
LIB_DIS_REVISION=3
AC_SUBST(LIB_DIS_CURRENT)
AC_SUBST(LIB_DIS_AGE)
AC_SUBST(LIB_DIS_REVISION)
LIBDISPATCH_VERSION="$LIB_DIS_CURRENT:$LIB_DIS_REVISION:$LIB_DIS_AGE"
AC_SUBST(LIBDISPATCH_VERSION)

LIB_PPT_CURRENT=5
LIB_PPT_AGE=1
LIB_PPT_REVISION=2
AC_SUBST(LIB_PPT_CURRENT)
AC_SUBST(LIB_PPT_AGE)
AC_SUBST(LIB_PPT_REVISION)
LIBPPT_VERSION="$LIB_PPT_CURRENT:$LIB_PPT_REVISION:$LIB_PPT_AGE"
AC_SUBST(LIBPPT_VERSION)

LIB_XML_CMD_CURRENT=5
LIB_XML_CMD_AGE=4
LIB_XML_CMD_REVISION=2
AC_SUBST(LIB_XML_CMD_CURRENT)
AC_SUBST(LIB_XML_CMD_AGE)
AC_SUBST(LIB_XML_CMD_REVISION)
LIBXMLCOMMAND_VERSION="$LIB_XML_CMD_CURRENT:$LIB_XML_CMD_REVISION:$LIB_XML_CMD_AGE"
AC_SUBST(LIBXMLCOMMAND_VERSION)


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 the existing ChangeLog file.)

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.

Update the NEWS file

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

Update the Version Numbers for Humans

Affected Files
configure.ac
debian/changelog (see [1] Debian ChangeLog)
NEWS
README.md
INSTALL
  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.

(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.)

Update the libdap version

Determine the libdap version associated with this release by checking the contents of the file libdap4-snapshot The libdap4-snapshot file should contain a single line like this:

libdap4-3.20.9-0 2021-12-28T19:23:45+0000

The libdap version for the above example is: libdap-3.20.9 (The version is NOT libdap4-3.20.9)

Update the libdap version in the .travis.yml file

Affected Files
.travis.yml

In the .travis.yml file update the value of LIBDAP_RPM_VERSION in the env: global: section so that it contains the complete numerical value of the libdap version you determined in the previous step. Using the previous example the value would be:

    - LIBDAP_RPM_VERSION=3.20.9-0

Update the libdap version in the RPM spec files

Affected Files
bes.spec*.in

Update the bes.spec*.in files by changing the Requires and BuildRequires entries for libdap:

Requires:       libdap >= 3.20.8
BuildRequires:  libdap-devel >= 3.20.8

(These lines may not be adjacent to each other in the spec files)

Update the libdap version in the README.md file

Affected Files
README.md
  • Get the DOI markdown from Zenodo by using the search bar and searching for the libdap version string that you determined at the beginning of this section.
  • Update the README.md file with libdap version and the associated DOI link (using the markdown you got from Zenodo).

Update the RPM dependencies

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

Affected Files
*.spec (In the BES it's bes.spec.*')

Update the module version numbers for humans

In bes/modules/common, check that the file all-modules.txt is complete and update as needed. Then run:

for d in `cat all_modules.txt`
do
  ./version_update_modules.sh -v $d
done

This will update the patch number (x.y.patch) for each of the named modules.

If a particular module has significant fixes, hand edit the number, in the Makefile.am.

See below for special info about the HDF4/5 modules (which also applies to any modules not in the BES GitHub repo).

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.

Update the Build Offset

Setting the build offset correctly will set the build number for the new release to "0".

In the file travis/travis_bes_build_offset.sh set the value of BES_TRAVIS_BUILD_OFFSET to the number of the last TravisCI build plus one. The previous commit and push will have triggered a TravisCI build. Find the build number for the previous commit in the TravisCI page for the BES and use that build number plus 1.

Commit Changes

Be sure that you have completed all of the the changes to the various ChangeLog, NEWS, INSTALL, configure.ac, travis/travis_bes_build_offset.sh, and other files before proceeding!

  1. Commit and push the BES code. 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 the BES code

  1. Tag the bes code using command line git in your local (up-to-date) bes project
    • git tag -m "Version <number>" -a <numbers>
    • git push origin <numbers>

  2. If this is part of a Hyrax Release, then tag this point in the master branch with the Hyrax release number
    • git tag -m "Hyrax <number>" -a hyrax-<numbers>
    • 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.

Create the BES release on Github

  1. Goto the BES project page in GitHub
  2. Choose the releases tab.
  3. On the Releases page click the 'Tags' tab.
  4. On the Tags page, locate the tag (created above) associated with this new release.
  5. Click the ellipses (...) located on the far right side of the version-x.y.z tag 'frame' for this release and and choose Create release.
    • Enter a title for the release
    • Copy the most recent text from the NEWS file into the describe field
    • Click Publish release or Save draft.
      • If you have previously edited the release page you can click Update this release

Publish and Sign

When the release is made on GitHub the source tar bundle is made automatically. However, this bundle is not the one we wish to publish because it requires people to have autoconf installed. Rather we want to use the result of "make dist" which will have the configure script pre-generated.

All you need do is build the tar file using make list, sign it, and push (or pull) these files onto www.opendap.org/pub/source.

  1. Go to the bes project on your local machine and run make dist which will make a bes-x.y.z,tar.gz file at the top level of the bes project.
  2. Use gpg to sign the tar bundle:
    gpg --detach-sign --local-user security@opendap.org bes-x.y.z.tgz
  3. Use sftp to push the signature file and the tar bundle to the /httpdocs/pub/source directory on www.opendap.org
    (Assuming your current working directory is the top of the bes project)
    sftp opendap@www.opendap.org
    cd httpdocs/pub/source
    put bes-x.y.z.tgz.sig
    put bes-x.y.z.tgz
    quit
  4. Check your work!
    1. Download the source tar bundle and signature from www.opendap.org.
    2. Verify the signature:
      gpg --verify bes-x.y.z.tgz.sig bes-x.y.z.tgz

Get the DOI from Zenodo

We should stop putting the DOIs and the cool badge in the README because the copy of README archived by Zenodo will be one step out of sync.

Instead, put a note in the README that the DOI can be found at Zenodo under name XYZ. jhrg 5/8/20

  1. Goto Zenodo
  2. Look at the 'upload' page. If there is nothing there (perhaps because you are not jhrg or whoever set up the connection between the BES project and Zenodo) you can use the search bar to search for bes.
    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.
  3. Click on the new version, then click on the DOI tag in the pane on the right of the page for the given release.
  4. Copy the DOI as markdown from the window that pops up and paste that into the info for the version back in Github land.
  5. 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).

Tip: If you are trying to locate the libdap releases in Zenodo you have to search for the string: libdap4

Images

Zenodo upload page