Use CMake to propagate versions and hashes to gitlab jobs
[alexxy/gromacs.git] / admin / gitlab-ci / archive.gitlab-ci.yml
index e3d6a27a7f4ddcc05772c33ee9179ad22285704d..527c90a58876e5899c07690fcabcdb86804fd84b 100644 (file)
 # Packages, exported artifacts, and release engineering processes.
 
-.release-version-template:
-  # Docker image uploaded to dockerhub by user eriklindahl
-  # TODO: Get DockerFile for admin/dockerfiles
-  image: biophysics/gcc-gromacs
-  stage: configure-build
+# Special job to run cmake to output the version string and
+# regressiontest md5sum to a file
 
+prepare-release-version:
+  extends:
+    - .variables:default
+    - .rules:nightly-only-for-release
+  cache: {}
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-llvm-7-docs
+  stage: configure-build
   variables:
     KUBERNETES_CPU_LIMIT: 1
     KUBERNETES_CPU_REQUEST: 1
-    KUBERNETES_MEMORY_LIMIT: 2Gi
-
-  only:
-    refs:
-      - merge_requests
-      - schedules
-      - web
-    variables:
-      - $GROMACS_RELEASE
+    KUBERNETES_MEMORY_REQUEST: 2Gi
   script:
-    - cmake -P cmake/gmxVersionInfo.cmake &> version.json
-
+    - cmake . -DGMX_BUILD_TARBALL=on
   artifacts:
     paths:
-      - version.json
-
-prepare-release-version:
-  extends:
-    - .regressiontests-extends-template
-    - .release-version-template
+      - VersionInfo-partial.cmake.cmakein
 
 # Special job to package regressiontest files and have them available for testing
 # Runs during pre-build
-
-.regressiontests-extends-template:
+# Set up to only fetch the files and prepare everything for merge requests
+regressiontests:prepare:
   extends:
-    - .no-cache-template
     - .variables:default
+    - .rules:merge-and-post-merge-acceptance
+  cache: {}
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-llvm-7-docs
+  stage: configure-build
+  variables:
+    KUBERNETES_CPU_LIMIT: 1
+    KUBERNETES_CPU_REQUEST: 1
+    KUBERNETES_MEMORY_REQUEST: 2Gi
+  # Always clone the default version for this branch, master in this case
+  script:
+    - export REGTESTBRANCH=master
+    - if [[ ! -z $REGRESSIONTESTBRANCH ]] ; then
+      export REGTESTBRANCH=$REGRESSIONTESTBRANCH ;
+      echo "Using $REGTESTBRANCH instead of default" ;
+      fi
+    - export CHECKOUTCOMMIT=FETCH_HEAD
+    - if [[ ! -z $REGRESSIONTESTCOMMIT ]] ; then
+      export CHECKOUTCOMMIT=$REGRESSIONTESTCOMMIT ;
+      echo "Using $CHECKOUTCOMMIT instead of head of $REGTESTBRANCH" ;
+      fi
+    - if [[ ! -d regressiontests ]] ; then
+        mkdir regressiontests ;
+        cd regressiontests ;
+        git init ;
+        cd .. ;
+      fi
+    - cd regressiontests
+    - git fetch https://gitlab.com/gromacs/gromacs-regressiontests.git $REGTESTBRANCH
+    - git checkout -qf $CHECKOUTCOMMIT
+    - git clean -ffdxq
+    - git gc
+    - git archive -o gmx-regressiontests.tar.gz --prefix regressiontests/ -9 HEAD
+    - echo "Build regressiontests for branch $REGTESTBRANCH"
+    - mv gmx-regressiontests.tar.gz ..
+    - cd ..
+  artifacts:
+    paths:
+      - gmx-regressiontests.tar.gz
 
-prepare-regressiontests:
+regressiontests:package:
   extends:
-    - .regressiontests-extends-template
-    - .regressiontests-template
-
-configure-archive-nightly:
-  stage: nightly-configure
-  only:
-    - triggers
-    - schedules
+    - .variables:default
+    - .rules:nightly-only-for-release
+  cache: {}
+  # Docker image uploaded to dockerhub by user eriklindahl
+  # TODO: Get DockerFile for admin/dockerfiles
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-llvm-7-docs
+  stage: release-package
+  variables:
+    KUBERNETES_CPU_LIMIT: 1
+    KUBERNETES_CPU_REQUEST: 1
+    KUBERNETES_MEMORY_REQUEST: 2Gi
   needs:
-    - job: simple-build
-      artifacts: false
-  except:
-    variables:
-      - $GROMACS_RELEASE
+    - job: prepare-release-version
+  script:
+    - VERSION=`sed -n -e '/GMX_VERSION_STRING\b/ s/.*"\(.*\)")/\1/p' VersionInfo-partial.cmake.cmakein`
+    - REGTESTNAME="regressiontests-"$VERSION
+    - if [[ $GROMACS_RELEASE != "true" ]] ; then
+      REGTESTNAME=$REGTESTNAME-dev ;
+      fi
+    - export REGTESTBRANCH=master
+    - if [[ $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME == "release-20"[1-2][0-9] ]] ; then
+      export REGTESTBRANCH=$CI_COMMIT_REF_NAME ;
+      fi
+    - if [[ ! -d regressiontests ]] ; then
+      mkdir regressiontests ;
+      cd regressiontests ;
+      git init ;
+      cd .. ;
+      fi
+    - cd regressiontests
+    - git fetch https://gitlab.com/gromacs/gromacs-regressiontests.git $REGTESTBRANCH
+    - git checkout -qf FETCH_HEAD
+    - git clean -ffdxq
+    - git gc
+    - git archive -o $REGTESTNAME.tar.gz --prefix $REGTESTNAME/ -9 HEAD
+    - git archive -o gmx-regressiontests.tar.gz --prefix regressiontests/ -9 HEAD
+    - mv $REGTESTNAME.tar.gz gmx-regressiontests.tar.gz ..
+    - echo "Build regressiontests $REGTESTNAME for branch  $REGTESTBRANCH"
+    - cd ..
+  artifacts:
+    paths:
+      - regressiontests-*.tar.gz
+      - gmx-regressiontests.tar.gz
+
+archive:configure:nightly:
   extends:
-    - .configure-docs
+    - .docs:configure
+    - .rules:nightly-not-for-release
+  stage: nightly-configure
+  dependencies: []
   variables:
     BUILD_DIR: build-package
     CMAKE_SIMD_OPTIONS: -DGMX_SIMD=None
-    CMAKE_EXTRA_OPTIONS: -DGMX_BUILD_HELP=on -DGMX_USE_RDTSCP=OFF
+    CMAKE_EXTRA_OPTIONS: -DGMX_BUILD_HELP=on -DGMX_USE_RDTSCP=OFF -DGMX_USE_SIMD_KERNELS=off
     CMAKE_MPI_OPTIONS: -DGMX_THREAD_MPI=OFF -DGMX_OPENMP=OFF
 
-configure-archive-release:
-  only:
-    refs:
-      - web
-      - triggers
-      - schedules
-    variables:
-      - $GROMACS_RELEASE
+archive:configure:release:
   extends:
-    - .configure-docs
+    - .docs:configure
+    - .rules:nightly-only-for-release
   variables:
     BUILD_DIR: build-package
     CMAKE_SIMD_OPTIONS: -DGMX_SIMD=None
-    CMAKE_EXTRA_OPTIONS: -DGMX_BUILD_HELP=on -DGMX_USE_RDTSCP=OFF
+    CMAKE_EXTRA_OPTIONS: -DGMX_BUILD_HELP=on -DGMX_USE_RDTSCP=OFF -DGMX_USE_SIMD_KERNELS=off
     CMAKE_MPI_OPTIONS: -DGMX_THREAD_MPI=OFF -DGMX_OPENMP=OFF
 
-.build-archive:
+# Right now we need to use an ugly hack to move the original build directory
+# and the ccache files out of the build archive, as it is not possible to use
+# the custom build directory due to https://gitlab.com/gitlab-org/gitlab-runner/issues/4203
+# As soon as this is resolved we should use the separate build directories instead of
+# manually hacking things. TODO: #3361
+.archive:build:
   extends:
-    - .build-extends-template
-    - .documentation-before-script-template
-    - .build-docs-binary-template
-    - .archive-build-template
+    - .variables:default
+    - .gromacs:base:build
+    - .use-ccache
+    - .before_script:default
+    - .docs:build
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-llvm-7-docs
+  variables:
+    KUBERNETES_CPU_LIMIT: 4
+    KUBERNETES_CPU_REQUEST: 2
+    KUBERNETES_MEMORY_REQUEST: 4Gi
+  script:
+    - rm -rf gromacs*tar.gz
+    - cd $BUILD_DIR
+    - cmake --build . --target gmx -- -j4 2>&1 | tee buildLogFile.log
+    - cmake --build . --target man -- -j4 2>&1 | tee manBuildLogFile.log
+    - cmake --build . --target completion -- -j4 2>&1 | tee completionBuildLogFile.log
+    - cmake --build . --target install-guide -- -j4 2>&1 | tee installGuideBuildLogFile.log
+    - cmake --build . --target reference_checksum -- -j4 2>&1 | tee checksumBuildLogFile.log
+    - cmake --build . --target package_source -- -j4 2>&1 | tee packageBuildLogFile.log
+    - awk '/warning/,/warning.*generated|^$/' buildLogFile.log manBuildLogFile.log
+      completionBuildLogFile.log installGuideBuildLogFile.log checksumBuildLogFile.log
+      packageBuildLogFile.log | grep -v "CMake" | tee buildErrors.log || true
+    - grep "cannot be built" buildLogFile.log manBuildLogFile.log
+      completionBuildLogFile.log installGuideBuildLogFile.log checksumBuildLogFile.log
+      packageBuildLogFile.log | tee -a buildErrors.log || true
+    - if [ -s buildErrors.log ] ; then echo "Found warnings during build"; cat buildErrors.log; exit 1; fi
+    - mv gromacs*tar.gz ..
+    - cd ..
+    # ugly hack begins here
+    - mkdir tempdir
+    - SOURCETARBALL=`ls gromacs*tar.gz`
+    - mv $SOURCETARBALL tempdir
+    - cd tempdir
+    - tar -xf $SOURCETARBALL
+    - rm -rf gromacs-*/$BUILD_DIR
+    - tar -c --gzip -f $SOURCETARBALL gromacs-*/
+    - mv $SOURCETARBALL ..
+    - cd ..
+    - rm -rf tempdir
+    # Hack ends here
+  artifacts:
+    when: always
+    expire_in: 1 week
+    paths:
+      - $BUILD_DIR/*logs
+      - $BUILD_DIR/bin
+      - $BUILD_DIR/lib
+      - gromacs*tar.gz
 
-build-archive-nightly:
+archive:build:
   extends:
-    - .build-archive
+    - .archive:build
+    - .rules:nightly-not-for-release
   stage: nightly-build
   needs:
-    - job: simple-build
-      artifacts: false
-    - job: configure-archive-nightly
-      artifacts: true
-  only:
-    - triggers
-    - schedules
-  except:
-    variables:
-      - $GROMACS_RELEASE
+    - job: archive:configure:nightly
   variables:
     BUILD_DIR: build-package
 
-package-regressiontests-release:
+archive:package:
   extends:
-    - .regressiontests-extends-template
-    - .regressiontests-release-template
-  needs:
-    - job: prepare-release-version
-      artifacts: true
-  only:
-    refs:
-      - triggers
-      - web
-      - schedules
-    variables:
-      - $GROMACS_RELEASE
-
-package-archive-release:
-  extends:
-    - .build-archive
+    - .archive:build
+    - .rules:nightly-only-for-release
   stage: release-package
   needs:
-    - job: configure-archive-release
-      artifacts: true
-  only:
-    refs:
-      - triggers
-      - web
-      - schedules
-    variables:
-      - $GROMACS_RELEASE
+    - job: archive:configure:release
   variables:
     BUILD_DIR: build-package
 
-.release-verify-template:
-  image: biophysics/gcc-gromacs
+checksum-verify:
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-llvm-7-docs
   stage: release-verify
+  extends:
+    - .variables:default
+    - .rules:nightly-only-for-release
+  cache: {}
 
   variables:
     KUBERNETES_CPU_LIMIT: 1
     KUBERNETES_CPU_REQUEST: 1
-    KUBERNETES_MEMORY_LIMIT: 2Gi
-
-  only:
-    refs:
-      - merge_requests
-      - schedules
-      - web
-    variables:
-      - $GROMACS_RELEASE
+    KUBERNETES_MEMORY_REQUEST: 2Gi
+    BUILD_DIR: build-package
   script:
-    - VERSION=`cat version.json |
-      python3 -c "import json,sys; print(json.load(sys.stdin)['version'])"`
-    - if [[ $GROMACS_RELEASE != "true" ]] ; then
-      VERSION=$VERSION-dev ;
+    - VALID_BUILD=true
+    - VERSION=`sed -n -e '/GMX_VERSION_STRING\b/ s/.*"\(.*\)")/\1/p' VersionInfo-partial.cmake.cmakein`
+    - if [[ "$GROMACS_RELEASE" != "true" ]] ; then
+      VERSION="$VERSION"-dev ;
       fi
-    - REGTEST_COMPARE=`cat version.json |
-      python3 -c "import json,sys; print(json.load(sys.stdin)['regressiontest-md5sum'])"`
-    - SOURCENAME=gromacs-$VERSION
-    - SOURCETARBALL=$SOURCENAME.tar.gz
-    - SOURCE_MD5SUM=`md5sum $SOURCETARBALL | awk '{print $1}'`
-    - REGTESTNAME=regressiontests-$VERSION
-    - REGTESTTARBALL=$REGTESTNAME.tar.gz
-    - REGTEST_MD5SUM=`md5sum $REGTESTTARBALL | awk '{print $1}'`
+    - REGTEST_COMPARE=`sed -n -e '/REGRESSIONTEST_MD5SUM/ s/.*"\(.*\)")/\1/p' VersionInfo-partial.cmake.cmakein`
+    - SOURCENAME=gromacs-"$VERSION"
+    - SOURCETARBALL="$SOURCENAME".tar.gz
+    - SOURCE_MD5SUM=`md5sum "$SOURCETARBALL" | awk '{print $1}'`
+    - REGTESTNAME=regressiontests-"$VERSION"
+    - REGTESTTARBALL="$REGTESTNAME".tar.gz
+    - REGTEST_MD5SUM=`md5sum "$REGTESTTARBALL" | awk '{print $1}'`
     - echo "$SOURCETARBALL md5sum = $SOURCE_MD5SUM"
     - echo "$REGTESTTARBALL md5sum = $REGTEST_MD5SUM"
     - echo "$REGTESTTARBALL reference md5sum = $REGTEST_COMPARE"
-    - if [[ $REGTEST_COMPARE != $REGTEST_MD5SUM && $GROMACS_RELEASE == "true" ]] ; then
+    - if [[ "$REGTEST_COMPARE" != "$REGTEST_MD5SUM" && "$GROMACS_RELEASE" == "true" ]] ; then
       echo "Mismatch in regressiontest md5sums";
+      VALID_BUILD=false;
+      fi
+    - if [[ "$VALID_BUILD" != "true" ]] ; then
       exit 1;
       fi
+  dependencies:
+    - archive:package
+    - regressiontests:package
+    - prepare-release-version
 
-release-verify:
+version-verify:
+  image: ${CI_REGISTRY}/gromacs/gromacs/ci-ubuntu-20.04-llvm-7-docs
+  stage: release-verify
   extends:
-    - .regressiontests-extends-template
-    - .release-verify-template
-  only:
-    refs:
-      - triggers
-      - web
-      - schedules
-    variables:
-      - $GROMACS_RELEASE
+    - .variables:default
+    - .rules:nightly-only-for-release
+  cache: {}
+
+  variables:
+    KUBERNETES_CPU_LIMIT: 1
+    KUBERNETES_CPU_REQUEST: 1
+    KUBERNETES_MEMORY_REQUEST: 2Gi
+    BUILD_DIR: release-doc-builds
+  script:
+    - VALID_BUILD=true
+    - VERSION=`sed -n -e '/GMX_VERSION_STRING\b/ s/.*"\(.*\)")/\1/p' VersionInfo-partial.cmake.cmakein`
+    - if [[ "$GROMACS_RELEASE" != "true" ]] ; then
+      VERSION="$VERSION"-dev ;
+      fi
+    - VERSION_FROM_BINARY=`"${BUILD_DIR}"/bin/gmx --version | grep "GROMACS version" | awk '{print $3}'`
+    - echo "Version name from CMake = $VERSION"
+    - echo "Version name from binary = $VERSION_FROM_BINARY"
+    - if [[ "$VERSION" != "$VERSION_FROM_BINARY" && "$GROMACS_RELEASE" == "true" ]] ; then
+      echo "Version names don't match";
+      VALID_BUILD=false;
+      fi
+    - if [[ "$VALID_BUILD" != "true" ]] ; then
+      exit 1;
+      fi
   dependencies:
-    - package-archive-release
-    - package-regressiontests-release
+    - webpage:dependencies
     - prepare-release-version
 
-webpage-archive-release:
+archive:nightly-webpage:
+  extends:
+    - .webpage:build
+    - .rules:nightly-not-for-release
+  stage: nightly-deploy
+  needs:
+    - job: linkchecker
+      artifacts: false
+    - job: webpage:build
+  variables:
+    BUILD_DIR: build-docs
+  before_script:
+    - eval $(ssh-agent -s)
+    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
+    - mkdir -p ~/.ssh
+    - chmod 700 ~/.ssh
+    - ssh-keyscan manual.gromacs.org > ~/.ssh/known_hosts # Force overwrite the known hosts so we only have that one key in it.
+    - chmod 644 ~/.ssh/known_hosts
+  script:
+    - tar czf webpage.tar.gz $BUILD_DIR/docs/html/
+    - rsync --chmod=u+rwX,g+rwX,o+rX -av $BUILD_DIR/docs/html/* $BUILD_DIR/docs/html/.[a-z]* pbauer@manual.gromacs.org:/var/www/manual/nightly/
+
+  artifacts:
+    when: always
+    paths:
+      - webpage.tar.gz
+
+archive:full-release:
   extends:
-    - .build-docs-webpage
-    - .configure-gmxapi-template
+    - .webpage:build
+    - .rules:nightly-only-for-release
   stage: release-deploy
-  only:
-    refs:
-      - web
-      - triggers
-      - schedules
-    variables:
-      - $GROMACS_RELEASE
   dependencies:
-    - webpage-build-release
-    - package-archive-release
-    - package-regressiontests-release
+    - webpage:build:release
+    - archive:package
+    - regressiontests:package
   variables:
     BUILD_DIR: release-doc-builds
   script: