diff --git a/build/jenkins/dockerfiles/build-base.Dockerfile b/build/jenkins/dockerfiles/buster-base.Dockerfile similarity index 69% rename from build/jenkins/dockerfiles/build-base.Dockerfile rename to build/jenkins/dockerfiles/buster-base.Dockerfile index 060adf31e8..69dd02e9ce 100644 --- a/build/jenkins/dockerfiles/build-base.Dockerfile +++ b/build/jenkins/dockerfiles/buster-base.Dockerfile @@ -1,10 +1,11 @@ -FROM debian:buster +FROM debian:buster-slim RUN useradd -ms /bin/bash --uid 1006 builder + # 0 A.D. dependencies. ARG DEBIAN_FRONTEND=noninteractive ARG DEBCONF_NOWARNINGS="yes" -RUN apt-get -qqy update && apt-get install -qqy \ +RUN apt-get -qqy update && apt-get install -qqy --no-install-recommends \ cmake \ curl \ libboost-dev \ @@ -18,7 +19,6 @@ RUN apt-get -qqy update && apt-get install -qqy \ libgtk-3-dev \ libicu-dev \ libidn11-dev \ - libjson-perl \ libminiupnpc-dev \ libogg-dev \ libopenal-dev \ @@ -27,15 +27,22 @@ RUN apt-get -qqy update && apt-get install -qqy \ libsodium-dev \ libvorbis-dev \ libwxgtk3.0-dev \ - libxcursor-dev \ - libxml-simple-perl \ libxml2-dev \ + make \ m4 \ + patch \ python3-dev \ python3-pip \ + subversion \ + xz-utils \ zlib1g-dev \ && apt-get clean +# Install git-lfs +RUN curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash +RUN apt-get -qqy update && apt-get install -qqy --no-install-recommends git-lfs +RUN git lfs install --system --skip-smudge + # Install rust and Cargo via rustup USER builder RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y diff --git a/build/jenkins/dockerfiles/clang8.Dockerfile b/build/jenkins/dockerfiles/clang8.Dockerfile index 630b6571c7..c0d4f60a6d 100644 --- a/build/jenkins/dockerfiles/clang8.Dockerfile +++ b/build/jenkins/dockerfiles/clang8.Dockerfile @@ -1,6 +1,4 @@ -FROM build-base:latest - -# Obviously clang8 is not available but 13 is ^^" +FROM buster-base:latest ARG DEBIAN_FRONTEND=noninteractive ARG DEBCONF_NOWARNINGS="yes" diff --git a/build/jenkins/dockerfiles/gcc7-docs.Dockerfile b/build/jenkins/dockerfiles/gcc7-docs.Dockerfile deleted file mode 100644 index c8628e1682..0000000000 --- a/build/jenkins/dockerfiles/gcc7-docs.Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM 0ad-gcc7:latest - -USER root - -ARG DEBIAN_FRONTEND=noninteractive -ARG DEBCONF_NOWARNINGS="yes" -RUN apt-get install -qqy graphviz doxygen xsltproc lcov --no-install-recommends -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7 - -USER builder diff --git a/build/jenkins/dockerfiles/gcc7.Dockerfile b/build/jenkins/dockerfiles/gcc7.Dockerfile index c8581b3744..9308981ade 100644 --- a/build/jenkins/dockerfiles/gcc7.Dockerfile +++ b/build/jenkins/dockerfiles/gcc7.Dockerfile @@ -1,4 +1,4 @@ -FROM build-base:latest +FROM buster-base:latest ARG DEBIAN_FRONTEND=noninteractive ARG DEBCONF_NOWARNINGS="yes" diff --git a/build/jenkins/dockerfiles/lint.Dockerfile b/build/jenkins/dockerfiles/lint.Dockerfile deleted file mode 100644 index 663faa3b65..0000000000 --- a/build/jenkins/dockerfiles/lint.Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM debian:bookworm-slim -ARG DEBIAN_FRONTEND=noninteractive -ARG DEBCONF_NOWARNINGS="yes" -RUN useradd -ms /bin/bash --uid 1006 builder -RUN apt-get -qq update && apt-get install -qqy --no-install-recommends \ - python3-dev \ - cppcheck \ - git \ - subversion \ - libphutil \ - php-cli \ - php-curl \ - curl \ -&& apt-get clean -ENV SHELL /bin/bash -WORKDIR "/home/builder" -RUN curl -fsSLk https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh -RUN chmod +x nodesource_setup.sh && ./nodesource_setup.sh && rm nodesource_setup.sh -RUN apt install nodejs -qqy -RUN npm install -g eslint@8.57.0 eslint-plugin-brace-rules -USER builder -RUN git clone https://github.com/phacility/arcanist.git ~/arcanist -ENV PATH="${PATH}:~/arcanist/bin/" diff --git a/build/jenkins/dockerfiles/tools.Dockerfile b/build/jenkins/dockerfiles/tools.Dockerfile new file mode 100644 index 0000000000..cbfc650cf6 --- /dev/null +++ b/build/jenkins/dockerfiles/tools.Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.12-slim-bookworm + +ARG DEBIAN_FRONTEND=noninteractive +ARG DEBCONF_NOWARNINGS="yes" +RUN apt -qq update && apt install -qqy --no-install-recommends \ + git \ + git-lfs \ + subversion \ + && apt clean + +RUN git lfs install --system --skip-smudge + +RUN pip3 install --upgrade lxml diff --git a/build/jenkins/pipelines/macos-all-bundles.Jenkinsfile b/build/jenkins/pipelines/bundles.Jenkinsfile similarity index 100% rename from build/jenkins/pipelines/macos-all-bundles.Jenkinsfile rename to build/jenkins/pipelines/bundles.Jenkinsfile diff --git a/build/jenkins/pipelines/design-docs.Jenkinsfile b/build/jenkins/pipelines/checkrefs.Jenkinsfile similarity index 57% rename from build/jenkins/pipelines/design-docs.Jenkinsfile rename to build/jenkins/pipelines/checkrefs.Jenkinsfile index 13b210a0f9..41072e8b08 100644 --- a/build/jenkins/pipelines/design-docs.Jenkinsfile +++ b/build/jenkins/pipelines/checkrefs.Jenkinsfile @@ -1,4 +1,4 @@ -/* Copyright (C) 2022 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -15,40 +15,31 @@ * along with 0 A.D. If not, see . */ -// This pipeline is used to build the design document. +// This pipeline runs source/tools/entity/checkrefs.py to identify +// mistakes and oversights in references to game content (assets, +// templates, etc). pipeline { agent { - node { - label 'LinuxSlave' + dockerfile { + label 'LinuxAgent' + customWorkspace 'workspace/checkrefs' + dir 'build/jenkins/dockerfiles' + filename 'tools.Dockerfile' } } + stages { - stage("Checkout") { + stage("Asset download") { steps { - ws("/zpool0/design-docs"){ - git "https://code.wildfiregames.com/source/design.git" - } + sh "git lfs pull -I binaries/data/mods/public/maps" } } - stage("Generate") { + + stage("Data checks") { steps { - ws("/zpool0/design-docs"){ - sh "mkdocs build" - } + sh "cd source/tools/entity/ && python3 checkrefs.py -tax" } } - stage("Upload") { - steps { - ws("/zpool0/design-docs"){ - sh "rsync -rti --delete-after --progress site/ docs.wildfiregames.com:~/www/design/" - } - } - } - } - post { - always { - step([$class: 'PhabricatorNotifier']) - } } } diff --git a/build/jenkins/pipelines/docker-differential-custom.Jenkinsfile b/build/jenkins/pipelines/docker-differential-custom.Jenkinsfile deleted file mode 100644 index 039b1638c4..0000000000 --- a/build/jenkins/pipelines/docker-differential-custom.Jenkinsfile +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright (C) 2022 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This pipeline is used to build patches on various compilers. - -def compilers = [] -if (params["With Clang"]) -{ - compilers = ["clang7"] -} -else -{ - compilers = ["gcc7"] -} - -def patchesMap = compilers.collectEntries { - ["${it}": patch(it)] -} -def patch(compiler) { - return { - stage("Patch: ${compiler}") { - try { - ws("/zpool0/${compiler}") { - sh "arc patch ${params.DIFF_ID} --force" - } - } catch(e) { - sh "sudo zfs rollback zpool0/${compiler}@latest" - throw e - } - } - } -} - -def buildsMap = compilers.collectEntries { - ["${it}": build(it)] -} -def build(compiler) { - return { - stage("Build: ${compiler}") { - try { - ws("/zpool0/${compiler}") { - docker.image("0ad-${compiler}:latest").inside { - script { - def NoAudioOption = "" - def NoPchOption = "" - def GlesOption = "" - def NoLobbyOption = "" - - if (params["No PCH"]) - { - NoPchOption="--without-pch " - } - if (params["OpenGL ES"]) - { - GlesOption="--gles " - } - if (params["No Audio"]) - { - NoAudioOption="--without-audio " - } - if (params["No Lobby"]) - { - NoLobbyOption="--without-lobby " - } - - sh "build/workspaces/update-workspaces.sh ${NoAudioOption}${GlesOption}${NoPchOption}${NoLobbyOption} -j1" - } - test_env="this is test env" - withEnv(["CXXFLAGS=${params.CXXFLAGS}", "CFLAGS=${params.CFLAGS}", "LDFLAGS=${params.LDFLAGS}"]){ - if (params["CXXFLAGS"]) - { - echo "Custom CXXFLAGS: ${env.CXXFLAGS}" - } - if (params["CFLAGS"]) - { - echo "Custom CFLAGS: ${env.CFLAGS}" - } - if (params["Debug Build"]) - { - def debugBuildErrorFile = "builderr-debug-${compiler}.log" - try { - try { - sh ''' - CC_VERSION="$($CC --version | sed -e \'s/version//g\' -e \'s/(.*)//g' -e \'s/\\s//\' | sed 1q)" - CXX_VERSION="$($CXX --version | sed -e \'s/version//g\' -e \'s/(.*)//g' -e \'s/\\s//\' | sed 1q)" - echo "Building pyrogenesis in debug with $CC_VERSION/$CXX_VERSION using 2 jobs..." - ''' - sh "cd build/workspaces/gcc/ && make config=debug clean && make -j2 config=debug 2> ../../../${debugBuildErrorFile}" - } catch(e) { - sh "rm -rf build/workspaces/gcc/obj/test_Debug" - throw e - } - } catch(e) { - throw e - } finally { - archiveArtifacts artifacts: "${debugBuildErrorFile}", fingerprint: true - } - - def debugBuildTestFile = "cxxtest-debug-${compiler}.log" - try { - sh "binaries/system/test_dbg > ${debugBuildTestFile}" - } catch (e) { - echo (message: readFile (file: "${debugBuildTestFile}")) - throw e - } finally { - archiveArtifacts artifacts: "${debugBuildTestFile}", fingerprint: true - } - } - def releaseBuildErrorFile = "builderr-release-${compiler}.log" - try { - try { - sh ''' - CC_VERSION="$($CC --version | sed -e \'s/version//g\' -e \'s/(.*)//g' -e \'s/\\s//\' | sed 1q)" - CXX_VERSION="$($CXX --version | sed -e \'s/version//g\' -e \'s/(.*)//g' -e \'s/\\s//\' | sed 1q)" - echo "Building pyrogenesis in release with $CC_VERSION/$CXX_VERSION using 2 jobs..." - ''' - sh "cd build/workspaces/gcc/ && make clean && make -j2 config=release 2> ../../../${releaseBuildErrorFile}" - } catch(e) { - sh "rm -rf build/workspaces/gcc/obj/test_Release" - throw e - } - } catch(e) { - throw e - } finally { - archiveArtifacts artifacts: "${releaseBuildErrorFile}", fingerprint: true - } - - def releaseBuildTestFile = "cxxtest-release-${compiler}.log" - try { - sh "binaries/system/test > ${releaseBuildTestFile}" - } catch (e) { - echo (message: readFile (file: "${releaseBuildTestFile}")) - throw e - } finally { - archiveArtifacts artifacts: "${releaseBuildTestFile}", fingerprint: true - } - } - } - } - } catch (e) { - throw e - } finally { - sh "sudo zfs rollback zpool0/${compiler}@latest" - } - } - } -} - -pipeline { - agent { - node { - label 'LinuxSlave' - customWorkspace '/zpool0/trunk' - } - } - parameters { - string(name: 'DIFF_ID', defaultValue: '', description: 'ID of the Phabricator Differential.') - booleanParam(name: 'OpenGL ES', defaultValue: false, description: 'Build with --gles.') - booleanParam(name: 'No PCH', defaultValue: false, description: 'Build with --without-pch.') - booleanParam(name: 'No Audio', defaultValue: false, description: 'Build with --without-audio.') - booleanParam(name: 'No Lobby', defaultValue: false, description: 'Build with --without-lobby.') - } - - stages { - stage("Patch") { - when { expression { return !!params.DIFF_ID } } - steps { - script { parallel patchesMap } - } - } - stage("Build") { - options { - timeout(time: 2, unit: 'HOURS') - } - steps { - script { parallel buildsMap } - } - } - } -} diff --git a/build/jenkins/pipelines/docker-differential.Jenkinsfile b/build/jenkins/pipelines/docker-differential.Jenkinsfile deleted file mode 100644 index 6a7ac9f89e..0000000000 --- a/build/jenkins/pipelines/docker-differential.Jenkinsfile +++ /dev/null @@ -1,261 +0,0 @@ -/* Copyright (C) 2024 Wildfire Games. -* This file is part of 0 A.D. -* -* 0 A.D. is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 2 of the License, or -* (at your option) any later version. -* -* 0 A.D. 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 General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with 0 A.D. If not, see . -*/ - -// This pipeline is used to build patches on various compilers. - -def compilers = ["gcc7", "clang8"] - -def patchesMap = compilers.collectEntries { - ["${it}": patch(it)] -} - -def patch(compiler) { - return { - stage("Patch: ${compiler}") { - try { - ws("/zpool0/${compiler}") { - sh "arc patch --diff ${params.DIFF_ID} --force" - } - } catch(e) { - reset("${compiler}").call() - throw e - } - } - } -} - -def resetMap = compilers.collectEntries { - ["${it}": reset(it)] -} - -def reset(compiler) -{ - return { - stage("Reset: ${compiler}") { - sleep 30 - sh "sudo zfs rollback zpool0/${compiler}@latest" - } - } -} - -def buildsMap = compilers.collectEntries { - ["${it}": build(it)] -} - -def build(compiler) { - return { - stage("Build: ${compiler}") { - try { - ws("/zpool0/${compiler}") { - docker.image("0ad-${compiler}:latest").inside { - - sh "build/workspaces/update-workspaces.sh -j1 --jenkins-tests" - - try { - retry(3) { - try { - sh "cd build/workspaces/gcc/ && make -j1 config=debug 2> ../../../builderr-debug-${compiler}.txt" - } catch(e) { - sh "rm -rf build/workspaces/gcc/obj/test_Debug" - throw e - } - } - } catch(e) { - throw e - } finally { - stash includes: "builderr-debug-${compiler}.txt", name: "build-debug-${compiler}" - } - - try { - sh "binaries/system/test_dbg > cxxtest-debug-${compiler}.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-debug-${compiler}.xml")) - throw e - } finally { - stash includes: "cxxtest-debug-${compiler}.xml", name: "tests-debug-${compiler}" - } - - try { - retry(3) { - try { - sh "cd build/workspaces/gcc/ && make -j1 config=release 2> ../../../builderr-release-${compiler}.txt" - } catch(e) { - sh "rm -rf build/workspaces/gcc/obj/test_Release" - throw e - } - } - } catch(e) { - throw e - } finally { - stash includes: "builderr-release-${compiler}.txt", name: "build-release-${compiler}" - } - - try { - sh "binaries/system/test > cxxtest-release-${compiler}.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-release-${compiler}.xml")) - throw e - } finally { - stash includes: "cxxtest-release-${compiler}.xml", name: "tests-release-${compiler}" - } - } - } - } catch (e) { - throw e - } finally { - reset("${compiler}").call() - } - } - } -} - -pipeline { - agent { - node { - label 'LinuxSlave' - customWorkspace '/zpool0/trunk' - } - } - parameters { - string(name: 'DIFF_ID', defaultValue: '', description: 'ID of the Phabricator Differential.') - string(name: 'PHID', defaultValue: '', description: 'Phabricator ID') - } - - stages { - stage("Patch") { - when { expression { return !!params.DIFF_ID } } - steps { - script { - try { - sh "arc patch --diff ${params.DIFF_ID} --force" - script { parallel patchesMap } - } catch(e) { - // In case of failure, reset both, since they were patched together. - parallel resetMap - throw e - } - } - } - } - stage("Build") { - steps { - script { - try { - buildsMap.each { key, value -> - value.call() - } - } catch(e) { - // In case of failure, reset both, since they were patched together. - parallel resetMap - throw e - } - } - } - post { - always { - script { - for(compiler in compilers) { - catchError { unstash "build-debug-${compiler}" } - catchError { unstash "tests-debug-${compiler}" } - catchError { unstash "build-release-${compiler}" } - catchError { unstash "tests-release-${compiler}" } - } - } - catchError { - sh ''' - for file in builderr-*.txt ; do - if [ -s "$file" ]; then - echo "$file" >> build-errors.txt - cat "$file" >> build-errors.txt - fi - done - ''' - } - catchError { junit 'cxxtest*.xml' } - } - } - } - stage("Lint") { - steps { - script { - try { - docker.image("0ad-lint:latest").inside { - try { - // arc lint outputs an empty file on success - unless there is nothing to lint. - // On failure, it'll output the file and a failure error code. - // Explicitly checking for the file presence is thus best to detect the linter did run - sh '~/arcanist/bin/arc lint --never-apply-patches --output jenkins --outfile .phabricator-lint && touch .phabricator-lint' - } - catch (e) { - if (!fileExists(".phabricator-lint")) { - sh '''echo '{"General":[{"line": 0, "char": 0, "code": "Jenkins", "severity": "error", "name": "ci-error", "description": "Error running lint", "original": null, "replacement": null, "granularity": 1, "locations": [], "bypassChangedLineFiltering": true, "context": null}]}' > .phabricator-lint ''' - } - else { - sh 'echo "error(s) were found running lint"' - } - } - finally { - stash includes: ".phabricator-lint", name: "Lint File" - } - } - } - finally { - unstash("Lint File") - if (fileExists(".phabricator-lint")) { - sh '''cat .phabricator-lint ''' - } - } - } - } - } - stage("Data checks") { - steps { - warnError('CheckRefs.py script failed!') { - sh "cd source/tools/entity/ && python3 checkrefs.py -tax 2> data-errors.txt" - } - } - } - } - - post { - always { - script { - catchError { - sh "if [ -s build-errors.txt ]; then cat build-errors.txt >> .phabricator-comment ; fi" - sh ''' - if [ -s data-errors.txt ]; then - echo "Data checks errors:" >> .phabricator-comment - cat data-errors.txt >> .phabricator-comment - fi - ''' - } - - try { - if (fileExists(".phabricator-comment")) { - step([$class: 'PhabricatorNotifier', commentOnSuccess: true, commentWithConsoleLinkOnFailure: true, customComment: true, commentFile: ".phabricator-comment", processLint: true, lintFile: ".phabricator-lint"]) - } else { - step([$class: 'PhabricatorNotifier', commentWithConsoleLinkOnFailure: true, processLint: true, lintFile: ".phabricator-lint"]) - } - } catch(e) { - throw e - } finally { - sh "sudo zfs rollback zpool0/trunk@latest" - } - } - } - } -} diff --git a/build/jenkins/pipelines/docker-rebuild.Jenkinsfile b/build/jenkins/pipelines/docker-rebuild.Jenkinsfile deleted file mode 100644 index e722d1f47d..0000000000 --- a/build/jenkins/pipelines/docker-rebuild.Jenkinsfile +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (C) 2022 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This pipeline is used to build a clean base from scratch in order to -// use ZFS snapshots efficiently. - -def compilers = ["gcc7", "clang7"] - -def volumeUpdatesMap = compilers.collectEntries { - ["${it}": volumeUpdate(it)] -} -def volumeUpdate(compiler) { - return { - stage("Recreate: ${compiler}") { - sh "sudo zfs clone zpool0/trunk@base zpool0/${compiler}" - } - } -} - -def buildsMap = compilers.collectEntries { - ["${it}": build(it)] -} -def build(compiler) { - return { - stage("Build: ${compiler}") { - try { - ws("/zpool0/${compiler}") { - docker.image("0ad-${compiler}:latest").inside { - sh "build/workspaces/update-workspaces.sh -j1 --jenkins-tests" - - sh "cd build/workspaces/gcc/ && make -j1 config=debug" - sh "binaries/system/test_dbg" - - sh "cd build/workspaces/gcc/ && make -j1 config=release" - sh "binaries/system/test" - } - } - } catch (e) { - throw e - } finally { - sh "sudo zfs snapshot zpool0/${compiler}@latest" - } - } - } -} - -pipeline { - agent { - node { - label 'LinuxSlave' - customWorkspace '/zpool0/trunk' - } - } - - stages { - stage("Volume updates") { - steps { - // Note: latest must always be the last snapshot in order to be able to rollback to it - sh "sudo zfs rollback zpool0/trunk@latest" - sh "sudo zfs destroy -R zpool0/trunk@latest" - sh "sudo zfs destroy -R zpool0/trunk@base" - sh "sudo zfs snapshot zpool0/trunk@base" - sh "sudo zfs snapshot zpool0/trunk@latest" - script { parallel volumeUpdatesMap } - } - } - stage("Build") { - steps { - script { parallel buildsMap } - } - } - } -} diff --git a/build/jenkins/pipelines/docker-reset.Jenkinsfile b/build/jenkins/pipelines/docker-reset.Jenkinsfile deleted file mode 100644 index 35e1cd4034..0000000000 --- a/build/jenkins/pipelines/docker-reset.Jenkinsfile +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2024 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This is a helper pipeline to build Docker images and setup ZFS volumes. - -pipeline { - agent { - node { - label 'LinuxSlave' - customWorkspace '/zpool0/trunk' - } - } - parameters { - booleanParam(name: 'no-cache', defaultValue: false, description: 'Rebuild containers from scratch') - booleanParam(name: 'reset-volumes', defaultValue: false, description: 'Reset ZFS volumes') - } - - stages { - stage("Cleanup") { - steps { - sh 'docker system prune -f' - } - } - stage("Full Rebuild") { - when { - environment name: 'no-cache', value: 'true' - } - steps { - sh 'docker build --no-cache -t build-base ~/dockerfiles/build-base' - sh 'docker build --no-cache -t 0ad-gcc7 ~/dockerfiles/gcc7' - sh 'docker build --no-cache -t 0ad-gcc7-docs ~/dockerfiles/gcc7-docs' - sh 'docker build --no-cache -t 0ad-clang8 ~/dockerfiles/clang8' - sh 'docker build --no-cache -t 0ad-translations ~/dockerfiles/translations' - sh 'docker build --no-cache -t 0ad-lint ~/dockerfiles/lint' - } - } - stage("Build") { - when { - environment name: 'no-cache', value: 'true' - } - steps { - sh 'docker build -t build-base ~/dockerfiles/build-base' - sh 'docker build -t 0ad-gcc7 ~/dockerfiles/gcc7' - sh 'docker build -t 0ad-gcc7-docs ~/dockerfiles/gcc7-docs' - sh 'docker build -t 0ad-clang8 ~/dockerfiles/clang8' - sh 'docker build -t 0ad-translations ~/dockerfiles/translations' - sh 'docker build -t 0ad-lint ~/dockerfiles/lint' - sh """ - docker rmi debian:buster - DANGLING_IMAGES="\$(docker images --filter \"\"\"dangling=true\"\"\" -q --no-trunc)" - if [ -n "\$DANGLING_IMAGES" ]; then - echo "Removing dangling images: \$DANGLING_IMAGES" - docker rmi \$(docker images --filter \"\"\"dangling=true\"\"\" -q --no-trunc) - echo "Done." - else - echo "No dangling images found." - fi - """ - } - } - stage("Update") { - steps { - sh "svn cleanup 2>/dev/null || true" - svn "https://svn.wildfiregames.com/public/ps/trunk" - sh "svn st --no-ignore | cut -c 9- | xargs rm -rf" - sh "svn revert -R ." - } - } - stage("Volumes") { - when { - environment name: 'reset-volumes', value: 'true' - } - steps { - sh "sudo zfs destroy -R zpool0/trunk@base || true" - sh "sudo zfs destroy -R zpool0/trunk@latest || true" - - sh "sudo zfs snapshot zpool0/trunk@base" - sh "sudo zfs clone zpool0/trunk@base zpool0/gcc7" - sh "sudo zfs clone zpool0/trunk@base zpool0/clang8" - sh "sudo zfs snapshot zpool0/trunk@latest" - sh "sudo zfs snapshot zpool0/clang8@latest" - sh "sudo zfs snapshot zpool0/gcc7@latest" - } - } - } -} diff --git a/build/jenkins/pipelines/docker-svn-no-pch.Jenkinsfile b/build/jenkins/pipelines/docker-svn-no-pch.Jenkinsfile deleted file mode 100644 index ae291193ec..0000000000 --- a/build/jenkins/pipelines/docker-svn-no-pch.Jenkinsfile +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (C) 2022 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This pipeline is used to build the documentation. - -pipeline { - agent { - node { - label 'LinuxSlave' - } - } - stages { - stage("Setup") { - steps { - sh "sudo zfs clone zpool0/gcc7@latest zpool0/docker-nopch" - } - } - stage("Build") { - steps { - ws("/zpool0/docker-nopch"){ - dir('build/workspaces/'){ - sh "./update-workspaces.sh -j1 --without-pch" - dir('gcc/'){ - sh "make clean" - sh "make -j1" - } - } - } - } - } - stage("Test") { - steps { - ws("/zpool0/docker-nopch"){ - dir('build/workspaces/gcc'){ - // as where it was built else nothing is generated. - sh "../../../binaries/system/test" - } - } - } - } - } - post { - always { - ws("/zpool0/trunk") { - sleep 10 - sh "sudo zfs destroy zpool0/docker-nopch" - } - } - } -} diff --git a/build/jenkins/pipelines/docker-svn.Jenkinsfile b/build/jenkins/pipelines/docker-svn.Jenkinsfile deleted file mode 100644 index 20a3af9da0..0000000000 --- a/build/jenkins/pipelines/docker-svn.Jenkinsfile +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright (C) 2021 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This is the post-commit pipeline. -// In case of success, it provides a clean base for incremental builds -// with the `differential` pipeline. - -def compilers = ["gcc7"] - -def volumeUpdatesMap = compilers.collectEntries { - ["${it}": volumeUpdate(it)] -} -def volumeUpdate(compiler) { - return { - stage("Update: ${compiler}") { - ws("/zpool0/${compiler}") { - sh "svn up -r ${params.SVN_REV}" - } - } - } -} - -def buildsMap = compilers.collectEntries { - ["${it}": build(it)] -} -def build(compiler) { - return { - stage("Build: ${compiler}") { - try { - ws("/zpool0/${compiler}") { - docker.image("0ad-${compiler}:latest").inside { - sh "build/workspaces/update-workspaces.sh -j1 --jenkins-tests" - - sh "cd build/workspaces/gcc/ && make -j1 config=debug" - try { - sh "binaries/system/test_dbg > cxxtest-debug-${compiler}.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-debug-${compiler}.xml")) - throw e - } finally { - catchError { - sh "sed -i 's/date/timestamp/g' cxxtest-debug-${compiler}.xml" - } - stash includes: "cxxtest-debug-${compiler}.xml", name: "tests-debug-${compiler}" - } - - sh "cd build/workspaces/gcc/ && make -j1 config=release" - try { - sh "binaries/system/test > cxxtest-release-${compiler}.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-release-${compiler}.xml")) - throw e - } finally { - catchError { - sh "sed -i 's/date/timestamp/g' cxxtest-release-${compiler}.xml" - } - stash includes: "cxxtest-release-${compiler}.xml", name: "tests-release-${compiler}" - } - } - } - - sh "sudo zfs destroy zpool0/${compiler}@latest" - sh "sudo zfs snapshot zpool0/${compiler}@latest" - } catch (e) { - sh "sudo zfs rollback zpool0/${compiler}@latest" - throw e - } - } - } -} - -pipeline { - agent { - node { - label 'LinuxSlave' - customWorkspace '/zpool0/trunk' - } - } - parameters { - string(name: 'SVN_REV', defaultValue: '', description: 'For instance 21000') - string(name: 'PHID', defaultValue: '', description: 'Phabricator ID') - } - - stages { - stage("Update") { - steps { - sh "svn cleanup 2>/dev/null || true" - svn "https://svn.wildfiregames.com/public/ps/trunk@${params.SVN_REV}" - sh "svn st --no-ignore | cut -c 9- | xargs rm -rf" - sh "svn revert -R ." - } - } - stage("Volume updates") { - steps { - script { parallel volumeUpdatesMap } - } - } - stage("Build") { - steps { - script { parallel buildsMap } - } - post { - always { - script { - for(compiler in compilers) { - catchError { unstash "tests-debug-${compiler}" } - catchError { unstash "tests-release-${compiler}" } - } - } - catchError { junit 'cxxtest*.xml' } - } - failure { - sh "sudo zfs rollback zpool0/trunk@latest" - } - success { - sh "sudo zfs destroy -R zpool0/trunk@latest" - sh "sudo zfs snapshot zpool0/trunk@latest" - } - } - } - stage("Data checks") { - steps { - sh "cd source/tools/entity/ && perl checkrefs.pl --check-map-xml --validate-templates" - } - } - } - - post { - always { - step([$class: 'PhabricatorNotifier']) - } - } -} diff --git a/build/jenkins/pipelines/linux.Jenkinsfile b/build/jenkins/pipelines/linux.Jenkinsfile new file mode 100644 index 0000000000..d63939dc51 --- /dev/null +++ b/build/jenkins/pipelines/linux.Jenkinsfile @@ -0,0 +1,120 @@ +/* Copyright (C) 2024 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +// This pipeline builds the game on Linux (with min and max supported versions of GCC and clang) and runs tests. + +pipeline { + agent none + stages { + stage("Setup") { + agent { + node { + label 'LinuxAgent' + customWorkspace 'workspace/linux' + } + } + steps { + discoverGitReferenceBuild() + sh "cd build/jenkins/dockerfiles/ && docker build -t buster-base -f buster-base.Dockerfile ." + } + } + stage("Linux Build") { + failFast true + + matrix { + axes { + axis { + name 'JENKINS_COMPILER' + values 'gcc7' //, 'gcc14', 'clang8', 'clang18' + } + axis { + name 'JENKINS_PCH' + values 'pch' //, 'no-pch' + } + } + + agent { + dockerfile { + label 'LinuxAgent' + customWorkspace "workspace/${JENKINS_COMPILER}-${JENKINS_PCH}" + dir 'build/jenkins/dockerfiles' + filename "${JENKINS_COMPILER}.Dockerfile" + } + } + + stages { + stage("Pre-build") { + steps { + sh "git lfs pull -I binaries/data/tests" + sh "git lfs pull -I \"binaries/data/mods/_test.*\"" + + sh "libraries/build-source-libs.sh -j1 2> ${JENKINS_COMPILER}-prebuild-errors.log" + script { + if (env.JENKINS_PCH == "no-pch") { + sh "build/workspaces/update-workspaces.sh -j1 --jenkins-tests --without-pch 2>> ${JENKINS_COMPILER}-prebuild-errors.log" + } else { + sh "build/workspaces/update-workspaces.sh -j1 --jenkins-tests 2>> ${JENKINS_COMPILER}-prebuild-errors.log" + } + } + } + post { + failure { + echo (message: readFile (file: "${JENKINS_COMPILER}-prebuild-errors.log")) + } + } + } + + stage("Debug Build") { + steps { + sh "cd build/workspaces/gcc/ && make -j1 config=debug" + timeout(time: 15) { + sh "cd binaries/system/ && ./test_dbg > cxxtest-debug.xml" + } + } + post { + always { + junit 'binaries/system/cxxtest-debug.xml' + } + } + } + + stage("Release Build") { + steps { + sh "cd build/workspaces/gcc/ && make -j1 config=release" + timeout(time: 15) { + sh "cd binaries/system/ && ./test > cxxtest-release.xml" + } + } + post { + always { + junit 'binaries/system/cxxtest-release.xml' + } + } + } + } + } + + post { + always { + node('LinuxSlave') { ws('workspace/linux') { + recordIssues enabledForFailure: true, qualityGates: [[threshold: 1, type: 'NEW']], tools: [clang(), gcc()] + }} + } + } + } + } +} diff --git a/build/jenkins/pipelines/macOS.Jenkinsfile b/build/jenkins/pipelines/macOS.Jenkinsfile new file mode 100644 index 0000000000..c2c79e8d02 --- /dev/null +++ b/build/jenkins/pipelines/macOS.Jenkinsfile @@ -0,0 +1,80 @@ +/* Copyright (C) 2024 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +// This pipeline builds the game on macOS (which uses the clang-10 compiler) and runs tests. + +pipeline { + agent { + node { + label 'macOSAgent' + customWorkspace 'workspace/clang10' + } + } + + stages { + stage ("Pre-build") { + steps { + discoverGitReferenceBuild() + + sh "git lfs pull -I binaries/data/tests" + sh "git lfs pull -I \"binaries/data/mods/_test.*\"" + + sh "libraries/build-macos-libs.sh -j4 2> macos-prebuild-errors.log" + sh "build/workspaces/update-workspaces.sh -j4 --jenkins-tests 2>> macos-prebuild-errors.log" + } + post { + failure { + echo (message: readFile (file: "macos-prebuild-errors.log")) + } + } + } + + stage("Debug Build") { + steps { + sh "cd build/workspaces/gcc/ && make -j4 config=debug" + timeout(time: 15) { + sh "cd binaries/system/ && ./test_dbg > cxxtest-debug.xml" + } + } + post { + always { + junit 'binaries/system/cxxtest-debug.xml' + } + } + } + + stage("Release Build") { + steps { + sh "cd build/workspaces/gcc/ && make -j4 config=release" + timeout(time: 15) { + sh "cd binaries/system/ && ./test > cxxtest-release.xml" + } + } + post { + always { + junit 'binaries/system/cxxtest-release.xml' + } + } + } + } + + post { + always { + recordIssues enabledForFailure: true, qualityGates: [[threshold: 1, type: 'NEW']], tool: clang() + } + } +} diff --git a/build/jenkins/pipelines/macos-differential.Jenkinsfile b/build/jenkins/pipelines/macos-differential.Jenkinsfile deleted file mode 100644 index 4aa8c61f90..0000000000 --- a/build/jenkins/pipelines/macos-differential.Jenkinsfile +++ /dev/null @@ -1,143 +0,0 @@ -/* Copyright (C) 2021 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -pipeline { - agent { label 'MacSlave' } - options { - skipDefaultCheckout() - } - - parameters { - string(name: 'DIFF_ID', defaultValue: '', description: 'ID of the Phabricator Differential.') - string(name: 'PHID', defaultValue: '', description: 'Phabricator ID') - booleanParam(name: 'CLEAN_WORKSPACE', defaultValue: false, description: 'Delete the workspace before compiling (NB: does not delete the compiled libraries)') - } - - stages { - stage ("Checkout") { - options { - retry(3) - } - steps { - script { - try { - sh "svn update" - } catch(e) { - sh "svn cleanup" - sleep 300 - throw e - } - } - sh "svn cleanup" - } - } - stage ("Patch") { - steps { - script { - try { - sh "arc patch --diff ${params.DIFF_ID} --force" - } catch (e) { - sh "svn st binaries/data/ | cut -c 9- | xargs rm -rfv" - sh "svn st source/ | cut -c 9- | xargs rm -rfv" - sh "svn st -q | cut -c 9- | xargs rm -rfv" - sh "svn revert -R ." - sh "arc patch --diff ${params.DIFF_ID} --force" - } - } - } - } - stage("macOS libraries build") { - steps { - sh "cd libraries/osx/ && ./build-osx-libs.sh -j4" - } - } - stage("Update workspaces") { - steps { - script { - if (params.CLEAN_WORKSPACE) { - sh "rm -rf build/workspaces/gcc" - } - sh "cd build/workspaces/ && ./update-workspaces.sh -j4 --jenkins-tests" - } - - } - } - stage("Debug Build & Tests") { - steps { - sh "cd build/workspaces/gcc/ && make -j4 config=debug 2> ../../../builderr-debug-macos.txt" - script { - try { - sh "binaries/system/test_dbg > cxxtest-debug.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-debug.xml")) - throw e - } finally { - junit "cxxtest-debug.xml" - } - } - } - } - stage("Release Build & Tests") { - steps { - sh "cd build/workspaces/gcc/ && make -j4 config=release 2> ../../../builderr-release-macos.txt" - script { - try { - sh "binaries/system/test > cxxtest-release.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-release.xml")) - throw e - } finally { - junit "cxxtest-release.xml" - } - } - } - } - } - - post { - always { - script { - catchError { - sh ''' - for file in builderr-*.txt ; do - if [ -s "$file" ]; then - echo "$file" >> .phabricator-comment - cat "$file" >> .phabricator-comment - fi - done - ''' - } - - try { - if (fileExists(".phabricator-comment")) { - step([$class: 'PhabricatorNotifier', commentOnSuccess: true, commentWithConsoleLinkOnFailure: true, customComment: true, commentFile: ".phabricator-comment"]) - } else { - step([$class: 'PhabricatorNotifier', commentWithConsoleLinkOnFailure: true]) - } - } catch(e) { - throw e - } finally { - sh "rm -f .phabricator-comment builderr-*.txt cxxtest-*.xml" - sh "svn st binaries/data/ | cut -c 9- | xargs rm -rfv" - sh "svn st source/ | cut -c 9- | xargs rm -rfv" - sh "svn st -q | cut -c 9- | xargs rm -rfv" - sh "svn revert -R ." - } - } - } - } -} diff --git a/build/jenkins/pipelines/macos-svn.Jenkinsfile b/build/jenkins/pipelines/macos-svn.Jenkinsfile deleted file mode 100644 index e79732df79..0000000000 --- a/build/jenkins/pipelines/macos-svn.Jenkinsfile +++ /dev/null @@ -1,98 +0,0 @@ -/* Copyright (C) 2021 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -pipeline { - agent { label 'MacSlave' } - - parameters { - string(name: 'SVN_REV', defaultValue: '', description: 'For instance 21000') - string(name: 'PHID', defaultValue: '', description: 'Phabricator ID') - booleanParam(name: 'CLEAN_WORKSPACE', defaultValue: false, description: 'Delete the workspace before compiling (NB: does not delete the compiled libraries)') - } - - stages { - stage("Checkout") { - options { - // Account for network errors - retry(3) - } - steps { - script { - try { - svn "https://svn.wildfiregames.com/public/ps/trunk@${params.SVN_REV}" - } catch(e) { - sh "svn cleanup" - sleep 300 - throw e - } - } - sh "svn cleanup" - } - } - stage("macOS libraries build") { - steps { - sh "cd libraries/osx/ && ./build-osx-libs.sh -j4" - } - } - stage("Update workspaces") { - steps { - script { - if (params.CLEAN_WORKSPACE) { - sh "rm -rf build/workspaces/gcc" - } - sh "cd build/workspaces/ && ./update-workspaces.sh -j4 --jenkins-tests" - } - } - } - stage("Debug Build & Tests") { - steps { - sh "cd build/workspaces/gcc/ && make -j4 config=debug" - script { - try { - sh "binaries/system/test_dbg > cxxtest-debug.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-debug.xml")) - throw e - } finally { - junit "cxxtest-debug.xml" - } - } - } - } - stage("Release Build & Tests") { - steps { - sh "cd build/workspaces/gcc/ && make -j4 config=release" - script { - try { - sh "binaries/system/test > cxxtest-release.xml" - } catch (e) { - echo (message: readFile (file: "cxxtest-release.xml")) - throw e - } finally { - junit "cxxtest-release.xml" - } - } - } - } - } - - post { - always { - step([$class: 'PhabricatorNotifier']) - } - } -} diff --git a/build/jenkins/pipelines/docker-coverage.Jenkinsfile b/build/jenkins/pipelines/static-analysis.Jenkinsfile similarity index 100% rename from build/jenkins/pipelines/docker-coverage.Jenkinsfile rename to build/jenkins/pipelines/static-analysis.Jenkinsfile diff --git a/build/jenkins/pipelines/docker-docs.Jenkinsfile b/build/jenkins/pipelines/technical-docs.Jenkinsfile similarity index 100% rename from build/jenkins/pipelines/docker-docs.Jenkinsfile rename to build/jenkins/pipelines/technical-docs.Jenkinsfile diff --git a/build/jenkins/pipelines/vs2015-autobuild.Jenkinsfile b/build/jenkins/pipelines/vs2015-autobuild.Jenkinsfile deleted file mode 100644 index 3dc393e273..0000000000 --- a/build/jenkins/pipelines/vs2015-autobuild.Jenkinsfile +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (C) 2021 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This pipeline builds Windows binaries. It is run at most daily, every -// time a commit touches the source code. - -def AtlasOption = "" -def GlooxOption = "" -def AtlasPrj = "" -def output = "" -def jobs = "2" -pipeline { - agent { label 'WindowsSlave' } - - parameters { - booleanParam(name: 'pyrogenesis', defaultValue: true, description: 'Build and commit the main executable.') - booleanParam(name: 'atlas', defaultValue: false, description: 'Build and commit the AtlasUI library.') - booleanParam(name: 'collada', defaultValue: false, description: 'Build and commit the Collada library.') - booleanParam(name: 'gloox', defaultValue: false, description: 'Build and commit the gloox wrapper.') - } - - stages { - stage("Checkout") { - options { - // Account for network errors - retry(3) - } - steps { - script { - try { - checkout([$class: 'SubversionSCM', locations: [[credentialsId: 'redacted', local: '.', remote: 'https://svn.wildfiregames.com/svn/ps/trunk']]]) - } catch(e) { - bat "svn cleanup" - sleep 300 - throw e - } - } - bat "svn cleanup" - } - } - - stage('Setup workspace') { - steps { - bat "del binaries\\system\\pyrogenesis.pdb binaries\\system\\pyrogenesis.exe" - script { - if (env.atlas == 'true') { - echo "atlas is enabled" - AtlasOption = "--atlas" - AtlasPrj = "/t:AtlasUI /t:ActorEditor" - bat "(robocopy /MIR C:\\wxwidgets-3.1.4\\lib libraries\\win32\\wxwidgets\\lib) ^& IF %ERRORLEVEL% LEQ 1 exit 0" - bat "(robocopy /MIR C:\\wxwidgets-3.1.4\\include libraries\\win32\\wxwidgets\\include) ^& IF %ERRORLEVEL% LEQ 1 exit 0" - bat "del binaries\\system\\AtlasUI.dll" - } - if (env.gloox == 'true') { - echo "gloox is enabled" - GlooxOption = "--build-shared-glooxwrapper" - bat "del binaries\\system\\glooxwrapper.pdb binaries\\system\\glooxwrapper.lib binaries\\system\\glooxwrapper.dll" - bat "del binaries\\system\\glooxwrapper_dbg.pdb binaries\\system\\glooxwrapper_dbg.lib binaries\\system\\glooxwrapper_dbg.dll" - } - if (env.collada == 'true') { - echo "collada is enabled" - bat "del binaries\\system\\Collada.dll" - } - output = bat(returnStdout: true, script: 'svnversion source -n').trim() - output = (output.readLines().drop(1).join("").toInteger() + 1) - } - bat "cd build\\workspaces && update-workspaces.bat ${AtlasOption} ${GlooxOption} --large-address-aware --jenkins-tests" - bat "echo L\"${output}\" > build\\svn_revision\\svn_revision.txt" - bat "echo ${output}" - } - } - - stage ('Build') { - steps { - bat("cd build\\workspaces\\vs2017 && \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\MSBuild.exe\" pyrogenesis.sln /nologo /p:XPDeprecationWarning=false /p:XPDeprecationWarning=false /m:${jobs} /p:PlatformToolset=v141_xp /t:pyrogenesis ${AtlasPrj} /t:test /p:Configuration=Release") - } - } - - stage ('Build debug glooxwrapper') { - when { environment name: 'gloox', value: 'true'} - steps { - bat("cd build\\workspaces\\vs2017 && \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\MSBuild.exe\" pyrogenesis.sln /nologo /p:XPDeprecationWarning=false /p:XPDeprecationWarning=false /m:${jobs} /p:PlatformToolset=v141_xp /t:glooxwrapper /p:Configuration=Debug") - } - } - - stage ('Tests') { - steps { - bat 'binaries\\system\\test.exe' - } - } - - stage ('Commit') { - options { - // Account for network errors - retry(3) - } - steps { - bat "svn changelist --remove --recursive --cl commit ." - script { - if (env.pyrogenesis == 'true') { - bat "svn changelist commit binaries\\system\\pyrogenesis.pdb binaries\\system\\pyrogenesis.exe" - } - if (env.atlas == 'true') { - bat "svn changelist commit binaries\\system\\AtlasUI.dll binaries\\system\\ActorEditor.exe" - } - if (env.collada == 'true') { - bat "svn changelist commit binaries\\system\\Collada.dll" - } - if (env.gloox == 'true') { - bat "svn changelist commit binaries\\system\\glooxwrapper.dll binaries\\system\\glooxwrapper.lib binaries\\system\\glooxwrapper.pdb binaries\\system\\glooxwrapper_dbg.dll binaries\\system\\glooxwrapper_dbg.lib binaries\\system\\glooxwrapper_dbg.pdb" - } - } - withCredentials([usernamePassword(credentialsId: 'redacted', passwordVariable: 'SVNPASS', usernameVariable: 'SVNUSER')]) { - bat 'svn commit --username %SVNUSER% --password %SVNPASS% --no-auth-cache --non-interactive --changelist commit -m "[Windows] Automated build."' - } - } - } - } - - post { - always { - bat "svn revert -R ." - } - } -} diff --git a/build/jenkins/pipelines/vs2015-differential.Jenkinsfile b/build/jenkins/pipelines/vs2015-differential.Jenkinsfile deleted file mode 100644 index 8a27fb72e6..0000000000 --- a/build/jenkins/pipelines/vs2015-differential.Jenkinsfile +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (C) 2022 Wildfire Games. - * This file is part of 0 A.D. - * - * 0 A.D. is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 0 A.D. 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with 0 A.D. If not, see . - */ - -// This pipeline is used to build patches on MSVC 15.0 (Visual Studio 2017). - -def jobs = "2" -def visualStudioPath = "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\MSBuild.exe\"" -def cleanFiles() { - bat 'powershell.exe "svn st -q | ForEach-Object { Remove-Item -ErrorAction Ignore -Recurse -Force -Verbose -LiteralPath $_.substring(8) } " ' - bat 'powershell.exe "svn st binaries/data | ForEach-Object { Remove-Item -ErrorAction Ignore -Recurse -Verbose -Force -LiteralPath $_.substring(8) } " ' - bat 'powershell.exe "svn st source/ | ForEach-Object { Remove-Item -ErrorAction Ignore -Recurse -Force -Verbose -LiteralPath $_.substring(8) } " ' - bat 'svn revert -R .' -} -pipeline { - agent { label 'WindowsSlave' } - options { - skipDefaultCheckout() - } - - parameters { - string(name: 'DIFF_ID', defaultValue: '', description: 'ID of the Phabricator Differential.') - string(name: 'PHID', defaultValue: '', description: 'Phabricator ID') - } - - stages { - stage ('Checkout') { - options { - retry(3) - } - steps { - script { - try { - svn "https://svn.wildfiregames.com/public/ps/trunk" - } catch(e) { - bat "svn cleanup" - sleep 300 - throw e - } - } - bat "svn cleanup" - } - } - stage ('Patch') { - steps { - script { - try { - bat "arc patch --diff ${params.DIFF_ID} --force" - } catch (e) { - cleanFiles() - bat "arc patch --diff ${params.DIFF_ID} --force" - } - } - } - } - stage ('Update-Workspace') { - steps { - bat "(robocopy /MIR /NDL /NJH /NJS /NP /NS /NC C:\\wxwidgets3.0.4\\lib libraries\\win32\\wxwidgets\\lib) ^& IF %ERRORLEVEL% LEQ 1 exit 0" - bat "(robocopy /MIR /NDL /NJH /NJS /NP /NS /NC C:\\wxwidgets3.0.4\\include libraries\\win32\\wxwidgets\\include) ^& IF %ERRORLEVEL% LEQ 1 exit 0" - bat "cd build\\workspaces && update-workspaces.bat --atlas --build-shared-glooxwrapper --jenkins-tests" - } - } - stage ('Debug: Build') { - steps { - dir('build\\workspaces\\vs2017'){ - bat("${visualStudioPath} pyrogenesis.sln /nologo /p:XPDeprecationWarning=false /m:${jobs} /p:PlatformToolset=v141_xp /t:pyrogenesis /t:AtlasUI /t:test /p:Configuration=Debug -clp:Warningsonly -clp:ErrorsOnly > ..\\..\\..\\build-errors-debug.txt 2>&1") - } - } - post { - always { - bat "if exist build-errors-debug.txt type build-errors-debug.txt" - } - } - } - stage ('Debug: Test') { - options { - timeout(time: 30) - } - steps { - catchError { - script { - try { - bat 'binaries\\system\\test_dbg.exe > cxxtest_debug.xml' - } catch(err) { - echo (message: readFile (file: "cxxtest_debug.xml")) - } - } - } - } - post { - failure { - echo (message: readFile (file: "cxxtest_debug.xml")) - archiveArtifacts artifacts: "cxxtest_debug.xml", fingerprint: true - } - always { - junit "cxxtest_debug.xml" - archiveArtifacts artifacts: "cxxtest_debug.xml", fingerprint: true - } - } - } - stage ('Release: Build') { - steps { - dir('build\\workspaces\\vs2017'){ - bat("${visualStudioPath} pyrogenesis.sln /nologo /p:XPDeprecationWarning=false /m:${jobs} /p:PlatformToolset=v141_xp /t:pyrogenesis /t:AtlasUI /t:test /p:Configuration=Release -clp:Warningsonly -clp:ErrorsOnly > ..\\..\\..\\build-errors-release.txt 2>&1") - } - } - post { - always { - bat "if exist build-errors-release.txt type build-errors-release.txt" - } - } - } - stage ('Release: Test') { - options { - timeout(time: 30) - } - steps { - bat 'binaries\\system\\test.exe > cxxtest_release.xml' - } - post { - failure { - echo (message: readFile (file: "cxxtest_release.xml")) - } - always { - junit "cxxtest_release.xml" - } - } - } - } - post { - always { - script { - catchError { - bat 'powershell.exe "if (![String]::IsNullOrWhiteSpace((Get-Content -ErrorAction Ignore -Path build-errors-debug.txt))) { Add-Content .phabricator-comment Debug: }" ' - bat "if exist build-errors-debug.txt type build-errors-debug.txt >> .phabricator-comment" - bat 'powershell.exe "if (![String]::IsNullOrWhiteSpace((Get-Content -ErrorAction Ignore -Path build-errors-release.txt))) { Add-Content .phabricator-comment Release: }" ' - bat "if exist build-errors-release.txt type build-errors-release.txt >> .phabricator-comment" - } - try { - if (fileExists(".phabricator-comment")) { - bat "if exist .phabricator-comment type .phabricator-comment" - step([$class: 'PhabricatorNotifier', commentOnSuccess: true, commentWithConsoleLinkOnFailure: true, customComment: true, commentFile: ".phabricator-comment"]) - } - } catch(e) { - throw e - } finally { - bat 'del .phabricator-comment' - bat 'del build-errors-debug.txt' - bat 'del build-errors-release.txt' - bat 'del cxxtest_*.xml' - cleanFiles() - } - } - } - } -} diff --git a/build/jenkins/pipelines/windows.Jenkinsfile b/build/jenkins/pipelines/windows.Jenkinsfile new file mode 100644 index 0000000000..db0424c012 --- /dev/null +++ b/build/jenkins/pipelines/windows.Jenkinsfile @@ -0,0 +1,68 @@ +/* Copyright (C) 2024 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +// This pipeline builds the game on Windows (which uses the MSVC 15.0 compiler from Visual Studio 2017) and runs tests. + +def visualStudioPath = "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\MSBuild.exe\"" +def buildOptions = "/p:PlatformToolset=v141_xp /p:XPDeprecationWarning=false /t:pyrogenesis /t:AtlasUI /t:test /m:2 /nologo -clp:NoSummary" + +pipeline { + agent { + node { + label 'WindowsAgent' + customWorkspace 'workspace/vs2017' + } + } + + stages { + stage ("Pre-build") { + steps { + discoverGitReferenceBuild() + + bat "git lfs pull -I binaries/data/tests" + bat "git lfs pull -I \"binaries/data/mods/_test.*\"" + + bat "cd libraries && get-windows-libs.bat" + bat "(robocopy /MIR /NDL /NJH /NJS /NP /NS /NC C:\\wxwidgets3.0.4\\lib libraries\\win32\\wxwidgets\\lib) ^& IF %ERRORLEVEL% LEQ 1 exit 0" + bat "(robocopy /MIR /NDL /NJH /NJS /NP /NS /NC C:\\wxwidgets3.0.4\\include libraries\\win32\\wxwidgets\\include) ^& IF %ERRORLEVEL% LEQ 1 exit 0" + bat "cd build\\workspaces && update-workspaces.bat --atlas --jenkins-tests" + } + } + + stage ("Release Build") { + steps { + dir('build\\workspaces\\vs2017'){ + bat("${visualStudioPath} pyrogenesis.sln /p:Configuration=Release ${buildOptions}") + } + timeout(time: 5) { + bat "cd binaries\\system && test.exe > cxxtest-release.xml" + } + } + post { + always { + junit 'binaries/system/cxxtest-release.xml' + } + } + } + } + + post { + always { + recordIssues enabledForFailure: true, qualityGates: [[threshold: 1, type: 'NEW']], tool: msBuild() + } + } +}