From 49f66df1f80ba6863f890f8f64b246d12ed6653d Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 22 Oct 2024 15:13:08 +0000 Subject: [PATCH] jenkins: Add a pipeline This is going to help us to achieve better code quality and compatibility because we will automatically build Pakfire for a couple of common distributions and run it through Clang's Static Analyzer. Signed-off-by: Michael Tremer --- Jenkinsfile | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 000000000..f659d9e06 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,292 @@ +pipeline { + agent none + + stages { + /* + Run Pakfire through Clang's Static Analyzer... + */ + stage("Clang Static Analyzer") { + agent { + docker { + image "debian:bookworm-backports" + + // Run as root inside the containers to install dependencies + args "-u root" + + customWorkspace "${JOB_NAME}/${BUILD_ID}/clang-static-analyzer" + } + } + + stages { + stage("Install Dependencies") { + steps { + script { + installBuildDepsDebian("bookworm", "clang") + + // Install Clang Tools + sh "apt-get install -y clang-tools" + } + } + } + + stage("Configure") { + steps { + sh "./autogen.sh" + sh "scan-build ./configure --prefix=/usr --enable-debug" + } + } + + stage("Build") { + steps { + sh "scan-build -o scan-build-output make" + } + } + + stage("Publish Report") { + steps { + archiveArtifacts artifacts: "scan-build-output/**/*", + allowEmptyArchive: true + } + } + } + } + + /* + Run the build and test suite on various distributions... + */ + stage("Build on Multiple Distributions") { + matrix { + axes { + axis { + name "DISTRO" + values \ + "almalinux:9", \ + "archlinux:base-devel", \ + "debian:trixie", \ + "debian:bookworm-backports", \ + "fedora:latest", \ + "fedora:rawhide", \ + "ubuntu:24.10", \ + "ubuntu:24.04" + } + + axis { + name "COMPILER" + values "gcc", "clang" + } + } + + agent { + docker { + image "${DISTRO}" + + // Run as root inside the containers to install dependencies + args "-u root" + + customWorkspace "${JOB_NAME}/${BUILD_ID}/${env.DISTRO.replace(":", "-")}/${env.COMPILER}" + } + } + + stages { + stage("Install Dependencies") { + steps { + script { + // Arch Linux + if (env.DISTRO.contains("archlinux")) { + installBuildDepsArchLinux(env.DISTRO, env.COMPILER) + + // Fedora, Alma Linux, etc. + } else if (env.DISTRO.contains("fedora") || env.DISTRO.contains("almalinux")) { + installBuildDepsRedHat(env.DISTRO, env.COMPILER) + + // Debian & Ubuntu + } else if (env.DISTRO.contains("debian") || env.DISTRO.contains("ubuntu")) { + installBuildDepsDebian(env.DISTRO, env.COMPILER) + } + } + } + } + + stage("Configure") { + steps { + // Run autogen + sh "./autogen.sh" + + // Run ./configure... + sh "CC=${env.COMPILER} ./configure --prefix=/usr --enable-debug" + } + + post { + failure { + archiveArtifacts artifacts: "config.log", + allowEmptyArchive: true + + echo "config.log has been archived" + } + } + } + + stage("Build") { + steps { + sh "make" + } + } + + stage("Check") { + steps { + script { + try { + sh "make check" + } catch (Exception e) { + unstable("Failed on ${env.DISTRO} with ${env.COMPILER}...") + } + } + } + + post { + failure { + // Archive the logs only if the stage fails + archiveArtifacts artifacts: "tests/*/*.log", + fingerprint: true, + allowEmptyArchive: true + + echo "The test logs have been archived" + } + } + } + } + } + } + } +} + +// Installs everything we need on RHEL/Fedora/etc. +def installBuildDepsRedHat(distro, compier) { + // Install basic development tools + if (distro == "fedora:rawhide") { + sh "dnf group install -y development-tools" + } else { + sh "dnf group install -y 'Development Tools'" + } + + // Enable CodeReady Builder for Almalinux 9 + if (distro.contains("almalinux:9")) { + sh "dnf config-manager --set-enabled crb" + } + + // Install our own build and runtime dependencies + sh """ + dnf install -y \ + asciidoc \ + autoconf \ + automake \ + bison \ + flex \ + intltool \ + libtool \ + pkg-config \ + ${compiler} \ + \ + elfutils-devel \ + file-devel \ + json-c-devel \ + krb5-devel \ + libarchive-devel \ + libbpf-devel \ + libcap-devel \ + libcurl-devel \ + libnl3-devel \ + libseccomp-devel \ + libsolv-devel \ + libuuid-devel \ + libzstd-devel \ + openssl-devel \ + pcre2-devel \ + python3-devel \ + sqlite-devel \ + systemd-devel \ + xz-devel + """ +} + +// Installs everything we need on Arch Linux +def installBuildDepsArchLinux(distro, compiler) { + sh "pacman -Syu --noconfirm" + sh """ + pacman -Sy \ + --needed \ + --noconfirm \ + asciidoc \ + autoconf \ + automake \ + bison \ + flex \ + intltool \ + libtool \ + pkg-config \ + ${compiler} \ + \ + curl \ + elfutils \ + json-c \ + libarchive \ + libbpf \ + libcap \ + libnl \ + libseccomp \ + libsolv \ + pcre2 \ + python3 \ + sqlite3 \ + systemd \ + util-linux-libs \ + xz \ + zstd + """ +} + +// Installs everything we need on Debian +def installBuildDepsDebian(distro, compiler) { + sh "apt-get update" + sh """ + apt-get install -y \ + --no-install-recommends \ + asciidoc \ + autoconf \ + automake \ + bison \ + build-essential \ + flex \ + intltool \ + libtool \ + pkg-config \ + ${compiler} \ + \ + libarchive-dev \ + libbpf-dev \ + libcap-dev \ + libcurl4-openssl-dev \ + libdw-dev \ + libelf-dev \ + libpython3-dev \ + libjson-c-dev \ + libkrb5-dev \ + liblzma-dev \ + libmagic-dev \ + libnl-3-dev \ + libnl-route-3-dev \ + libssl-dev \ + libpcre2-dev \ + libseccomp-dev \ + libsolv-dev \ + libsqlite3-dev \ + libsystemd-dev \ + libzstd-dev \ + uuid-dev + """ + + // On bookworm, install cURL from backports for WebSocket support + if (distro.contains("bookworm")) { + sh "apt-get install -y libcurl4-openssl-dev/bookworm-backports" + } +} -- 2.39.5