variables: GIT_SUBMODULE_STRATEGY: recursive TERM: linux MATLAB_VERSION: R2023b OLD_MATLAB_VERSION: R2018b # To ensure that "false && true" fails, see https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25394#note_412609647 FF_ENABLE_BASH_EXIT_CODE_CHECK: 'true' # The next stanza creates the version number used for the source tarball and the # binary packages. Here are the following possible cases: # - if VERSION was already set (when manually running a pipeline), use it # - if we are in the official Dynare repository: # + if on a tag: use the tag # + if on master: use 7-unstable-$TIMESTAMP-$COMMIT # + on another branch: use $BRANCH-$TIMESTAMP-$COMMIT # - if in a personal repository: use $USER-$TIMESTAMP-$COMMIT before_script: - 'if [[ -z $VERSION ]] && [[ $CI_PROJECT_NAMESPACE == Dynare ]] && [[ -n $CI_COMMIT_TAG ]]; then export VERSION=$CI_COMMIT_TAG; fi' - 'if [[ -z $VERSION ]] && [[ $CI_PROJECT_NAMESPACE == Dynare ]] && [[ $CI_COMMIT_REF_NAME == master ]]; then export VERSION=7-unstable-$(date +%F-%H%M)-$CI_COMMIT_SHORT_SHA; fi' - 'if [[ -z $VERSION ]] && [[ $CI_PROJECT_NAMESPACE == Dynare ]]; then export VERSION=$CI_COMMIT_REF_NAME-$(date +%F-%H%M)-$CI_COMMIT_SHORT_SHA; fi' - 'if [[ -z $VERSION ]]; then export VERSION=$CI_PROJECT_NAMESPACE-$(date +%F-%H%M)-$CI_COMMIT_SHORT_SHA; fi' stages: - build - test - pkg - sign - deploy build_matlab: stage: build script: - meson setup -Dbuild_for=matlab -Dmatlab_path=/opt/MATLAB/$MATLAB_VERSION -Dbuildtype=release build-matlab - meson compile -v -C build-matlab artifacts: paths: - build-matlab/ expire_in: 3 days build_octave: stage: build script: - meson setup -Dbuild_for=octave -Dbuildtype=release build-octave - meson compile -v -C build-octave artifacts: paths: - build-octave/ expire_in: 3 days build_doc: stage: build script: - meson rewrite kwargs set project / version "$VERSION" # Use a local copy of MathJax to avoid using CDN (which are a privacy issue) # NB: Debian 12 “Bookworm” has MathJax 2. The following needs to be updated # when Debian moves to MathJax 3. - meson setup -Dbuild_for=octave -Dmathjax_path=mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML build-doc - meson compile -v -C build-doc doc - cp -dR /usr/share/javascript/mathjax build-doc/dynare-manual.html/_static/ artifacts: paths: - build-doc/ expire_in: 3 days pkg_source: stage: pkg script: - meson rewrite kwargs set project / version "$VERSION" - git commit -a -m "Source for $VERSION" - meson setup -Dbuild_for=octave build-src - meson dist -C build-src --no-tests artifacts: paths: - build-src/meson-dist/dynare-*.tar.xz expire_in: 3 days needs: [] pkg_windows: stage: pkg script: - meson rewrite kwargs set project / version "$VERSION" - mkdir -p windows/deps/tarballs && cp /usr/lib/dynare-runner/matlab64-* windows/deps/tarballs/ - make -C windows - rm windows/deps/tarballs/matlab64-* # No need to cache these files cache: - key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" paths: - windows/deps/sources64/ - windows/deps/lib64/ # We do not cache lib64-msys2, mingw64, octave64 and # matlab64, because those are simply extracted from a tarball. It # would be a waste of space and of (re-compression) time. - key: $CI_JOB_NAME # This cache is shared between all branches, to save space paths: - windows/deps/tarballs/ artifacts: paths: - windows/exe/* - windows/7z/* - windows/zip/* expire_in: 3 days needs: [ "build_doc" ] pkg_macOS_x86_64: stage: pkg script: # Enforce the arm64 meson for rewrite, as a workaround to https://github.com/mesonbuild/meson/issues/12282 - env PATH="/opt/homebrew/bin:$PATH" meson rewrite kwargs set project / version "$VERSION" - ln -s ~/tarballs macOS/deps/x86_64 - make -C macOS build-x86_64 cache: key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" paths: - macOS/deps/x86_64/sources64/ - macOS/deps/x86_64/lib64/ tags: - macOS artifacts: paths: - macOS/pkg/* expire_in: 3 days needs: [ "build_doc" ] pkg_macOS_arm64: stage: pkg script: # Enforce the arm64 meson for rewrite, as a workaround to https://github.com/mesonbuild/meson/issues/12282 - env PATH="/opt/homebrew/bin:$PATH" meson rewrite kwargs set project / version "$VERSION" - ln -s ~/tarballs macOS/deps/arm64 - make -C macOS build-arm64 cache: key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" paths: - macOS/deps/arm64/sources64/ - macOS/deps/arm64/lib64/ tags: - macOS artifacts: paths: - macOS/pkg/* expire_in: 3 days needs: [ "build_doc" ] test_matlab: stage: test script: - meson test -C build-matlab --no-rebuild --num-processes $(($(nproc) * 3 / 4)) artifacts: paths: - build-matlab/meson-logs/testlog.txt when: always needs: [ "build_matlab" ] test_old_matlab: stage: test script: - meson setup -Dbuild_for=matlab -Dmatlab_path=/opt/MATLAB/$OLD_MATLAB_VERSION -Dbuildtype=release build-old-matlab - meson compile -v -C build-old-matlab - meson test -C build-old-matlab --num-processes $(($(nproc) * 3 / 4)) artifacts: paths: - build-old-matlab/meson-logs/testlog.txt when: always when: manual test_octave: stage: test variables: OPENBLAS_NUM_THREADS: 1 script: - meson test -C build-octave --no-rebuild artifacts: paths: - build-octave/meson-logs/testlog.txt when: always needs: [ "build_octave" ] when: manual test_clang_format: stage: test script: - meson setup -Dbuild_for=octave build-clang-format - ninja -C build-clang-format clang-format-check needs: [] # For the sign and deploy jobs, we don’t use the “needs” keyword, since we # don’t want those jobs to start before the “test” and “pkg” stages have # succeeded. Hence we stick to the “dependencies” keyword. sign_windows: stage: sign rules: - if: '$CI_PROJECT_NAMESPACE == "Dynare" && $CI_COMMIT_REF_NAME == "master"' when: on_success - when: never tags: - sign dependencies: - pkg_windows script: - f=(windows/exe/*) && mkdir -p windows/exe-signed/ && osslsigncode sign -pkcs11module /usr/lib/x86_64-linux-gnu/libykcs11.so.2 -key "pkcs11:id=%01;type=private;pin-value=$YUBIKEY_PIN" -certs ~/cepremap-code-signing-comodo-sectigo.pem -n Dynare -i https://www.dynare.org -t http://timestamp.comodoca.com -in ${f[0]} -out windows/exe-signed/${f[0]##*/} artifacts: paths: - windows/exe-signed/* expire_in: 3 days deploy_manual_unstable: stage: deploy rules: - if: '$CI_PROJECT_NAMESPACE == "Dynare" && $CI_COMMIT_REF_NAME == "master"' when: on_success - when: never tags: - deploy dependencies: - build_doc script: - rsync --recursive --links --delete build-doc/dynare-manual.html/ /srv/www.dynare.org/manual-unstable/ deploy_snapshot_unstable: stage: deploy rules: - if: '$CI_PROJECT_NAMESPACE == "Dynare" && $CI_COMMIT_REF_NAME == "master"' when: on_success - when: never tags: - deploy dependencies: - pkg_source - pkg_windows - sign_windows - pkg_macOS_arm64 - pkg_macOS_x86_64 script: - cp build-src/meson-dist/*.tar.xz /srv/www.dynare.org/snapshot/source/ && ln -sf *.tar.xz /srv/www.dynare.org/snapshot/source/dynare-latest-src.tar.xz - f=(windows/exe-signed/*) && cp ${f[0]} /srv/www.dynare.org/snapshot/windows/ && ln -sf ${f[0]##*/} /srv/www.dynare.org/snapshot/windows/dynare-latest-win.exe - f=(windows/7z/*) && cp ${f[0]} /srv/www.dynare.org/snapshot/windows-7z/ && ln -sf ${f[0]##*/} /srv/www.dynare.org/snapshot/windows-7z/dynare-latest-win.7z - f=(windows/zip/*) && cp ${f[0]} /srv/www.dynare.org/snapshot/windows-zip/ && ln -sf ${f[0]##*/} /srv/www.dynare.org/snapshot/windows-zip/dynare-latest-win.zip - f=(macOS/pkg/*-arm64.pkg) && cp ${f[0]} /srv/www.dynare.org/snapshot/macos-arm64/ && ln -sf ${f[0]##*/} /srv/www.dynare.org/snapshot/macos-arm64/dynare-latest-macos-arm64.pkg - f=(macOS/pkg/*-x86_64.pkg) && cp ${f[0]} /srv/www.dynare.org/snapshot/macos-x86_64/ && ln -sf ${f[0]##*/} /srv/www.dynare.org/snapshot/macos-x86_64/dynare-latest-macos-x86_64.pkg - ~/update-snapshot-list.sh - curl -X POST -F token="$WEBSITE_PIPELINE_TRIGGER_TOKEN" -F ref=master https://git.dynare.org/api/v4/projects/40/trigger/pipeline