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()
+ }
+ }
+}