debian-forge-composer/schutzbot/Jenkinsfile
Martin Sehnoutka 509964bede image-tests: don't use random names for CI artifacts
When using random names for artifacts like AWS snapshots, or Azure
images, it becomes hard to clean them up in case of CI failure. See this
issue for more details:
https://github.com/osbuild/osbuild-composer/issues/942

This PR introduces predictable names so that we can easily determine
which artifact belongs to which PR and therefore we can decide to wipe
all resources that are not needed any more.
2020-09-15 14:30:51 +02:00

598 lines
20 KiB
Groovy

pipeline {
agent none
environment {
AWS_REGION = "us-east-2"
AWS_BUCKET = "imagebuilder-jenkins-testing-use2"
}
options {
timestamps()
ansiColor('xterm')
// Cancel the pipeline if it runs for more than three hours.
timeout(
time: 3,
unit: "HOURS"
)
}
stages {
stage("Prepare 🤔") {
agent { label "schutzbot" }
options {
// Don't checkout the git repository here. It just clogs
// up the Jenkins disk space and does nothing for us.
skipDefaultCheckout()
}
steps {
sh (
label: "Get environment variables",
script: "env | sort"
)
}
}
stage("Mock build 👷🏻") {
// Halt the pipeline immediately if a single mock build fails.
// A failure to build an RPM is serious and must be
// investigated.
failFast true
parallel {
stage('F31') {
agent { label "f31cloudbase && x86_64 && aws" }
environment {
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
sh "schutzbot/ci_details.sh"
retry(3) {
sh "schutzbot/mockbuild.sh"
}
stash (
includes: 'osbuild-mock.repo',
name: 'fedora31'
)
}
}
stage('F32') {
agent { label "f32cloudbase && x86_64 && aws" }
environment {
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
sh "schutzbot/ci_details.sh"
retry(3) {
sh "schutzbot/mockbuild.sh"
}
stash (
includes: 'osbuild-mock.repo',
name: 'fedora32'
)
}
}
stage('EL8') {
agent { label "rhel8cloudbase && x86_64 && aws" }
environment {
AWS_CREDS = credentials('aws-credentials-osbuildci')
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production')
}
steps {
sh "schutzbot/ci_details.sh"
retry(3) {
sh "schutzbot/mockbuild.sh"
}
stash (
includes: 'osbuild-mock.repo',
name: 'rhel8cdn'
)
}
}
stage('EL8.3') {
agent { label "rhel83cloudbase && x86_64 && aws" }
environment {
AWS_CREDS = credentials('aws-credentials-osbuildci')
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production-beta')
}
steps {
sh "schutzbot/ci_details.sh"
retry(3) {
sh "schutzbot/mockbuild.sh"
}
stash (
includes: 'osbuild-mock.repo',
name: 'rhel83'
)
}
}
}
}
stage("Testing 🍌") {
parallel {
stage('F31 Base') {
agent { label "f31cloudbase && x86_64 && aws" }
environment { TEST_TYPE = "base" }
steps {
unstash 'fedora31'
run_tests('base')
}
post {
always {
preserve_logs('fedora31-base')
}
}
}
stage('F31 Image') {
agent { label "f31cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "image"
AWS_CREDS = credentials('aws-credentials-osbuildci')
AZURE_CREDS = credentials('azure')
OPENSTACK_CREDS = credentials("psi-openstack-creds")
VCENTER_CREDS = credentials('vmware-vcenter-credentials')
DISTRO_CODE = "fedora31"
}
steps {
unstash 'fedora31'
run_tests('image')
}
post {
always {
preserve_logs('fedora31-image')
}
}
}
stage('F31 Integration') {
agent { label "f31cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
unstash 'fedora31'
run_tests('integration')
}
post {
always {
preserve_logs('fedora31-integration')
}
}
}
stage('F32 Base') {
agent { label "f32cloudbase && x86_64 && aws" }
environment { TEST_TYPE = "base" }
steps {
unstash 'fedora32'
run_tests('base')
}
post {
always {
preserve_logs('fedora32-base')
}
}
}
stage('F32 Image') {
agent { label "f32cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "image"
AWS_CREDS = credentials('aws-credentials-osbuildci')
AZURE_CREDS = credentials('azure')
OPENSTACK_CREDS = credentials("psi-openstack-creds")
VCENTER_CREDS = credentials('vmware-vcenter-credentials')
DISTRO_CODE = "fedora32"
}
steps {
unstash 'fedora32'
run_tests('image')
}
post {
always {
preserve_logs('fedora32-image')
}
}
}
stage('F32 Integration') {
agent { label "f32cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
unstash 'fedora32'
run_tests('integration')
}
post {
always {
preserve_logs('fedora32-integration')
}
}
}
stage('F32 OSTree') {
agent { label "f32cloudbase && psi && x86_64" }
steps {
unstash 'fedora32'
run_tests('ostree')
}
post {
always {
preserve_logs('fedora32-ostree')
}
}
}
stage('EL8 Base') {
agent { label "rhel8cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "base"
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production')
}
steps {
unstash 'rhel8cdn'
run_tests('base')
}
post {
always {
preserve_logs('rhel8-base')
}
}
}
stage('EL8 Image') {
agent { label "rhel8cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "image"
AWS_CREDS = credentials('aws-credentials-osbuildci')
AZURE_CREDS = credentials('azure')
OPENSTACK_CREDS = credentials("psi-openstack-creds")
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production')
VCENTER_CREDS = credentials('vmware-vcenter-credentials')
DISTRO_CODE = "rhel8"
}
steps {
unstash 'rhel8cdn'
run_tests('image')
}
post {
always {
preserve_logs('rhel8-image')
}
}
}
stage('EL8 Integration') {
agent { label "rhel8cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production')
}
steps {
unstash 'rhel8cdn'
run_tests('integration')
}
post {
always {
preserve_logs('rhel8-integration')
}
}
}
stage('EL8.3 Base') {
agent { label "rhel83cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "base"
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production-beta')
}
steps {
unstash 'rhel83'
run_tests('base')
}
post {
always {
preserve_logs('rhel83-base')
}
}
}
stage('EL8.3 Image') {
agent { label "rhel83cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "image"
AWS_CREDS = credentials('aws-credentials-osbuildci')
AZURE_CREDS = credentials('azure')
OPENSTACK_CREDS = credentials("psi-openstack-creds")
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production-beta')
VCENTER_CREDS = credentials('vmware-vcenter-credentials')
DISTRO_CODE = "rhel83"
}
steps {
unstash 'rhel83'
run_tests('image')
}
post {
always {
preserve_logs('rhel83-image')
}
}
}
stage('EL8.3 Integration') {
agent { label "rhel83cloudbase && x86_64 && aws" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production-beta')
}
steps {
unstash 'rhel83'
run_tests('integration')
}
post {
always {
preserve_logs('rhel83-integration')
}
}
}
stage('EL8.3 OSTree') {
agent { label "rhel83cloudbase && psi && x86_64" }
steps {
unstash 'rhel83'
run_tests('ostree')
}
post {
always {
preserve_logs('rhel83-ostree')
}
}
}
}
}
}
post {
success {
node('schutzbot') {
script {
if (env.BRANCH_NAME == 'master') {
telegramSend "💚 CI passed for osbuild-composer master branch ${env.BUILD_URL}"
}
}
}
}
unsuccessful {
node('schutzbot') {
script {
if (env.BRANCH_NAME == 'master') {
telegramSend "💣 CI failed for osbuild-composer master branch ${env.BUILD_URL}"
}
}
}
}
}
}
pipeline {
// test against RHEL nightly builds
agent none
// TODO: do we need to disable triggering via GitHub pull requests ???
triggers {
cron('@daily')
}
environment {
AWS_REGION = "us-east-2"
AWS_BUCKET = "imagebuilder-jenkins-testing-use2"
}
options {
timestamps()
ansiColor('xterm')
// Cancel the pipeline if it runs for more than three hours.
timeout(
time: 3,
unit: "HOURS"
)
}
stages {
stage("Prepare 🤔") {
agent { label "schutzbot" }
options {
// Don't checkout the git repository here. It just clogs
// up the Jenkins disk space and does nothing for us.
skipDefaultCheckout()
}
steps {
sh (
label: "Get environment variables",
script: "env | sort"
)
// don't build, use RPMs from the nightly trees
sh "schutzbot/prepare-rhel-nightly.sh"
stash (
includes: 'osbuild-mock.repo',
name: 'rhel8nightly'
)
stash (
includes: 'rhel-8.json',
name: 'rhel8json'
)
stash (
includes: 'rhel-8-beta.json',
name: 'rhel8betajson'
)
stash (
includes: 'COMPOSE_ID',
name: 'compose_id'
)
}
}
stage("Testing 🍌") {
parallel {
stage('EL8 Base') {
agent { label "rhel8cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "base"
}
steps {
unstash 'rhel8nightly'
unstash 'rhel8json'
unstash 'rhel8betajson'
run_tests('dummy-base')
}
post {
always {
preserve_logs('rhel8-base')
}
}
}
stage('EL8 Image') {
agent { label "rhel8cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "image"
AWS_CREDS = credentials('aws-credentials-osbuildci')
AZURE_CREDS = credentials('azure')
OPENSTACK_CREDS = credentials("psi-openstack-creds")
VCENTER_CREDS = credentials('vmware-vcenter-credentials')
}
steps {
unstash 'rhel8nightly'
unstash 'rhel8json'
unstash 'rhel8betajson'
run_tests('dummy-image')
}
post {
always {
preserve_logs('rhel8-image')
}
}
}
stage('EL8 Integration') {
agent { label "rhel8cloudbase && psi && x86_64" }
environment {
TEST_TYPE = "integration"
AWS_CREDS = credentials('aws-credentials-osbuildci')
}
steps {
unstash 'rhel8nightly'
unstash 'rhel8json'
unstash 'rhel8betajson'
run_tests('dummy-integration')
}
post {
always {
preserve_logs('rhel8-integration')
}
}
}
}
}
}
//TODO: send messages via Email too
// TODO: how do we make the contents of COMPOSE_ID available as env.COMPOSE_ID
post {
success {
node('schutzbot') {
script {
telegramSend "💚 CI passed for ${env.COMPOSE_ID} see ${env.BUILD_URL}"
}
}
}
unsuccessful {
node('schutzbot') {
script {
telegramSend "💣 CI failed for ${env.COMPOSE_ID} see ${env.BUILD_URL}"
}
}
}
}
}
// Set up a function to hold the steps needed to run the tests so we don't
// need to copy/paste the same lines over and over above.
void run_tests(test_type) {
// Get CI machine details.
sh (
label: "Get CI machine details",
script: "schutzbot/ci_details.sh"
)
// Deploy the Image Builder packages and services.
sh (
label: "Deploy",
script: "schutzbot/deploy.sh"
)
// Run the base tests.
if (test_type == 'base') {
sh (
label: "Base tests",
script: "schutzbot/run_base_tests.sh"
)
}
if (test_type == 'image') {
sh (
label: "Image tests",
script: "schutzbot/run_image_tests.sh"
)
}
if (test_type == 'ostree') {
sh (
label: "OSTree tests",
script: "test/image-tests/ostree.sh"
)
}
if (test_type == 'integration') {
// Run the qcow2 test.
sh (
label: "Integration test: QCOW2",
script: "test/image-tests/qemu.sh qcow2"
)
// Run the openstack test.
sh (
label: "Integration test: OpenStack",
script: "test/image-tests/qemu.sh openstack"
)
// Run the VHD/Azure test.
sh (
label: "Integration test: VHD",
script: "test/image-tests/qemu.sh vhd"
)
// Run the AWS test.
sh (
label: "Integration test: AWS",
script: "test/image-tests/aws.sh"
)
}
}
// Move logs to a unique location and tell Jenkins to capture them on success
// or failure.
void preserve_logs(test_slug) {
// Save the systemd journal.
sh "journalctl --boot > systemd-journald.log"
// Make a directory for the log files and move the logs there.
sh "mkdir ${test_slug} && mv *.log *.jpg ${test_slug}/ || true"
// Artifact the logs.
archiveArtifacts (
allowEmptyArchive: true,
artifacts: "${test_slug}/*.log,${test_slug}/*.jpg"
)
}