diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000000000000000000000000000000000000..3c22a775e17dd6238c9f47a5c79d768844eec679
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,93 @@
+// Packaging validation for supported GNU/Linux systems.
+//
+// Note: To work on this script without having to push a commit each
+// time, use the jenkins-cli command (see:
+// https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Usage_CLI_de_Jenkins).
+pipeline {
+    agent {
+        label 'guix'
+    }
+
+    environment {
+        TARBALLS = '/opt/ring-contrib' // set the cache directory
+    }
+
+    options {
+        ansiColor('xterm')
+    }
+
+    stages {
+        stage('Check configuration') {
+            when { not { expression { fileExists TARBALLS } } }
+            steps {
+                error "The ${TARBALLS} directory does not exist. \
+See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
+            }
+        }
+
+        stage('Fetch submodules') {
+            steps {
+                echo 'Updating relevant submodules to their latest commit'
+                sh 'git submodule update --init --recursive --remote' +
+                   'daemon lrc client-gnome client-qt'
+            }
+        }
+
+        stage('Generate release tarball') {
+            steps {
+                // The bundled tarballs included in the release
+                // tarball depend on what is available on the host.
+                // To ensure it can be shared across all different
+                // GNU/Linux distributions, generate it in a minimal
+                // container.  Wget uses GnuTLS, which looks up its
+                // certs from /etc/ssl/certs.
+                sh '''
+                   #!/usr/bin/env bash
+                   test -f $HOME/.bashrc && . $HOME/.bashrc
+                   guix environment --container --network -E TARBALLS --share=$TARBALLS \
+                       --expose=$SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt --ad-hoc \
+                       coreutils \
+                       gcc-toolchain \
+                       git-minimal \
+                       grep \
+                       gzip \
+                       make \
+                       nss-certs \
+                       pkg-config \
+                       python \
+                       sed \
+                       tar \
+                       wget \
+                       xz -- make release-tarball
+                   '''
+            }
+        }
+
+        stage('Build packages') {
+            environment {
+                DISABLE_CONTRIB_DOWNLOADS = 'TRUE'
+                // The following password is used to register with the
+                // RHEL subscription-manager tool, required to build on RHEL.
+                PASS = credentials('developers-redhat-com')
+            }
+            steps {
+                script {
+                    def targetsText = sh script: 'make -s list-package-targets', returnStdout: true
+                    def targets = targetsText.split('\n')
+                    def stages = [:]
+
+                    targets.each { target ->
+                        // Note: The stage calls are wrapped in closures, to
+                        // delay their execution.
+                        stages["${target}"] =  {
+                            stage("stage: ${target}") {
+                                sh "make ${target}"
+                            }
+                        }
+                    }
+                    parallel stages
+                }
+            }
+        }
+    }
+}