Build scripts for improved release workflow
authorTeemu Murtola <teemu.murtola@gmail.com>
Thu, 1 Dec 2016 19:18:53 +0000 (21:18 +0200)
committerMark Abraham <mark.j.abraham@gmail.com>
Sat, 10 Dec 2016 11:58:27 +0000 (12:58 +0100)
Add build scripts to support extracting version info from
gmxVersionInfo.cmake, and to update the regressiontests MD5.

Part of #2066

Change-Id: I916439c1be26823b4e366aea4e7fcded6de21659

admin/builds/get-version-info.py [new file with mode: 0644]
admin/builds/gromacs.py
admin/builds/update-regtest-hash.py [new file with mode: 0644]
cmake/gmxVersionInfo.cmake
docs/dev-manual/jenkins.rst

diff --git a/admin/builds/get-version-info.py b/admin/builds/get-version-info.py
new file mode 100644 (file)
index 0000000..29af769
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2016, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+import json
+
+def do_build(context):
+    cmd = [context.env.cmake_command, '-P', 'cmake/gmxVersionInfo.cmake']
+    info_json = context.run_cmd(cmd, use_output=True)
+    values = json.loads(info_json)
+    context.set_version_info(values['version'], values['regressiontest-md5sum'])
index dd0182e900515262f4ab567a5f80c957931446a2..2ef5be3327c11c47111e9a47649a16fa6a85996a 100644 (file)
@@ -113,11 +113,6 @@ def do_build(context):
     regressiontests_path = context.workspace.get_project_dir(Project.REGRESSIONTESTS)
 
     if context.job_type == JobType.RELEASE:
-        # TODO: Consider using REGRESSIONTEST_DOWNLOAD here, after refactoring
-        # it to make that possible.  Or use some other mechanism to check the
-        # MD5 of the regressiontests tarball (also taking into account the -dev
-        # builds where the hardcoded value in gmxVersionInfo.cmake is not
-        # accurate).
         cmake_opts['REGRESSIONTEST_PATH'] = regressiontests_path
     else:
         if context.opts.mdrun_only:
diff --git a/admin/builds/update-regtest-hash.py b/admin/builds/update-regtest-hash.py
new file mode 100644 (file)
index 0000000..ee73d0e
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2016, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+import json
+
+extra_options = {
+    'md5sum': Option.string
+}
+
+def do_build(context):
+    info_path = 'cmake/gmxVersionInfo.cmake'
+    cmd = [context.env.cmake_command, '-P', info_path]
+    info_json = context.run_cmd(cmd, use_output=True)
+    values = json.loads(info_json)
+    old_md5sum = values['regressiontest-md5sum']
+    new_md5sum = context.opts.md5sum
+    if new_md5sum != old_md5sum:
+        context.replace_in_file(info_path, r'set\(REGRESSIONTEST_MD5SUM "(\w*)"',
+                lambda x: do_replacement(x, new_md5sum))
+        context.workspace.upload_revision(project=Project.GROMACS, file_glob=info_path)
+
+def do_replacement(match, new_md5sum):
+    result = match.group(0)
+    start = match.start(1) - match.start(0)
+    end = match.end(1) - match.end(0)
+    return result[:start] + new_md5sum + result[end:]
index e8fe834201f3a7ea0aaf82139236dab0392edcf8..700af4ffc3e1885a7f62a72fc4c4013409156f14 100644 (file)
@@ -219,22 +219,28 @@ endif()
 set(GMX_VERSION_STRING "${GMX_VERSION}${GMX_VERSION_SUFFIX}")
 option(GMX_BUILD_TARBALL "Build tarball without -dev version suffix" OFF)
 mark_as_advanced(GMX_BUILD_TARBALL)
-if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND NOT GMX_BUILD_TARBALL)
+# If run with cmake -P, the -dev suffix is managed elsewhere.
+if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND
+    NOT GMX_BUILD_TARBALL AND
+    NOT CMAKE_SCRIPT_MODE_FILE)
     set(GMX_VERSION_STRING "${GMX_VERSION_STRING}-dev")
 endif()
 
 set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
 set(REGRESSIONTEST_BRANCH "refs/heads/release-2016")
-# TODO Find some way of ensuring that this is bumped appropriately for
-# each release. It's hard to test because it is only used for
-# REGRESSIONTEST_DOWNLOAD, which doesn't work until that tarball has
-# been placed on the server.
 set(REGRESSIONTEST_MD5SUM "366438549270d005fa6def6e56ca0256" CACHE INTERNAL "MD5 sum of the regressiontests tarball")
 
 math(EXPR GMX_VERSION_NUMERIC
      "${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
 set(GMX_API_VERSION ${GMX_VERSION_NUMERIC})
 
+# If run with cmake -P from releng scripts, print out necessary version info
+# as JSON.
+if (CMAKE_SCRIPT_MODE_FILE)
+    message("{ \"version\": \"${GMX_VERSION_STRING}\", \"regressiontest-md5sum\": \"${REGRESSIONTEST_MD5SUM}\" }")
+    return()
+endif()
+
 #####################################################################
 # git version info management
 
index e76bffa2172591e06a6da0b48eff0a126a8f56f3..40308988eeb52bdb74f7391c99d4138ff5e4756d 100644 (file)
@@ -113,7 +113,8 @@ On-demand builds
 ----------------
 
 These builds can be triggered on request for certain changes in Gerrit, or
-manually from Jenkins.
+manually from Jenkins.  See :ref:`releng-triggering-builds` for details on
+how to trigger these.
 
 Coverage
 ^^^^^^^^
@@ -151,3 +152,9 @@ The exact build sequence is desribed in :ref:`releng-workflow-release`.
 The build uses the source tarball build as a subbuild, and parts of the build
 are executed using :file:`admin/builds/gromacs.py` and
 :file:`admin/builds/documentation.py`.
+
+:file:`admin/builds/get-version-info.py` is used for getting the version
+information from the source tree as part of this workflow.
+
+:file:`admin/builds/update-regtest-hash.py` has logic to update the
+regressiontests tarball MD5 sum for the released tarball automatically.