Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion pmm/v3/pmm3-api-tests.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@ library changelog: false, identifier: 'lib@master', retriever: modernSCM([

pipeline {
agent {
label 'agent-amd64'
label params.AGENT_ARCH == 'arm64' ? 'agent-arm64' : 'agent-amd64'
}
parameters {
choice(
choices: ['amd64', 'arm64'],
description: 'CPU architecture of the agent that runs the server container and tests',
name: 'AGENT_ARCH'
)
string(
defaultValue: 'https://github.com/percona/pmm',
description: 'Url for pmm repository',
Expand Down
13 changes: 12 additions & 1 deletion pmm/v3/pmm3-aws-staging-start.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ pipeline {
description: 'WatchTower docker container version (image-name:version-tag, ex: perconalab/watchtower:dev-latest)',
name: 'WATCHTOWER_VERSION'
)
choice(
choices: ['amd64', 'arm64'],
description: 'CPU architecture of the staging VM (arm64 = AWS Graviton t4g.xlarge)',
name: 'SERVER_ARCH'
)
string(
defaultValue: '3-dev-latest',
description: 'PMM Client version ("3-dev-latest" for main branch, "latest" or "X.X.X" for released version, "pmm3-rc" for Release Candidate, "http://..." for feature build)',
Expand Down Expand Up @@ -174,7 +179,13 @@ pipeline {
stage('Run VM') {
steps {
// This sets envvars: SPOT_PRICE, REQUEST_ID, IP, AMI_ID
runSpotInstance('t3.xlarge')
script {
if (params.SERVER_ARCH == 'arm64') {
runSpotInstance('t4g.xlarge', 'arm64')
} else {
runSpotInstance('t3.xlarge')
}
}

withCredentials([sshUserPrivateKey(credentialsId: 'aws-jenkins', keyFileVariable: 'KEY_PATH', passphraseVariable: '', usernameVariable: 'USER')]) {
sh '''
Expand Down
16 changes: 10 additions & 6 deletions pmm/v3/pmm3-image-scanning.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,25 @@ pipeline {
steps {
script {
sh """
trivy image --severity HIGH,CRITICAL --format table -o trivy-server-report.txt ${params.PMM_SERVER_IMAGE}
trivy image --severity HIGH,CRITICAL --format template --template "@html.tpl" -o trivy-server-report.html ${params.PMM_SERVER_IMAGE}
trivy image --platform linux/amd64 --severity HIGH,CRITICAL --format table -o trivy-server-report-amd64.txt ${params.PMM_SERVER_IMAGE}
trivy image --platform linux/amd64 --severity HIGH,CRITICAL --format template --template "@html.tpl" -o trivy-server-report-amd64.html ${params.PMM_SERVER_IMAGE}
trivy image --platform linux/arm64 --severity HIGH,CRITICAL --format table -o trivy-server-report-arm64.txt ${params.PMM_SERVER_IMAGE}
trivy image --platform linux/arm64 --severity HIGH,CRITICAL --format template --template "@html.tpl" -o trivy-server-report-arm64.html ${params.PMM_SERVER_IMAGE}
"""
archiveArtifacts artifacts: 'trivy-server-report.*', allowEmptyArchive: true
archiveArtifacts artifacts: 'trivy-server-report-*.*', allowEmptyArchive: true
}
}
}
stage('Scan PMM Client') {
steps {
script {
sh """
trivy image --severity HIGH,CRITICAL --format table -o trivy-client-report.txt ${params.PMM_CLIENT_IMAGE}
trivy image --severity HIGH,CRITICAL --format template --template "@html.tpl" -o trivy-client-report.html ${params.PMM_CLIENT_IMAGE}
trivy image --platform linux/amd64 --severity HIGH,CRITICAL --format table -o trivy-client-report-amd64.txt ${params.PMM_CLIENT_IMAGE}
trivy image --platform linux/amd64 --severity HIGH,CRITICAL --format template --template "@html.tpl" -o trivy-client-report-amd64.html ${params.PMM_CLIENT_IMAGE}
trivy image --platform linux/arm64 --severity HIGH,CRITICAL --format table -o trivy-client-report-arm64.txt ${params.PMM_CLIENT_IMAGE}
trivy image --platform linux/arm64 --severity HIGH,CRITICAL --format template --template "@html.tpl" -o trivy-client-report-arm64.html ${params.PMM_CLIENT_IMAGE}
"""
archiveArtifacts artifacts: 'trivy-client-report.*', allowEmptyArchive: true
archiveArtifacts artifacts: 'trivy-client-report-*.*', allowEmptyArchive: true
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions pmm/v3/pmm3-package-testing-amd64.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ library changelog: false, identifier: 'lib@master', retriever: modernSCM([
void runStaging(String DOCKER_VERSION, ADMIN_PASSWORD, CLIENTS) {
stagingJob = build job: 'pmm3-aws-staging-start', parameters: [
string(name: 'DOCKER_VERSION', value: DOCKER_VERSION),
string(name: 'SERVER_ARCH', value: params.SERVER_ARCH),
string(name: 'CLIENT_VERSION', value: '3-dev-latest'),
string(name: 'DOCKER_ENV_VARIABLE', value: '-e PMM_ENABLE_TELEMETRY=0 -e PMM_DATA_RETENTION=48h -e PMM_PERCONA_PLATFORM_ADDRESS=https://check-dev.percona.com:443 -e PMM_ENABLE_NOMAD=1'),
string(name: 'CLIENTS', value: CLIENTS),
Expand Down Expand Up @@ -114,6 +115,10 @@ pipeline {
description: 'PMM Server docker container version (image-name:version-tag)',
name: 'DOCKER_VERSION',
trim: true)
choice(
choices: ['amd64', 'arm64'],
description: 'Architecture of the PMM server staging VM',
name: 'SERVER_ARCH')
string(
defaultValue: latestVersion,
description: 'PMM Version for testing',
Expand Down
5 changes: 5 additions & 0 deletions pmm/v3/pmm3-package-testing-arm64.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ library changelog: false, identifier: 'lib@master', retriever: modernSCM([
void runStaging(String DOCKER_VERSION, ADMIN_PASSWORD, CLIENTS) {
stagingJob = build job: 'pmm3-aws-staging-start', parameters: [
string(name: 'DOCKER_VERSION', value: DOCKER_VERSION),
string(name: 'SERVER_ARCH', value: params.SERVER_ARCH),
string(name: 'CLIENT_VERSION', value: '3-dev-latest'),
string(name: 'DOCKER_ENV_VARIABLE', value: '-e PMM_ENABLE_TELEMETRY=0 -e PMM_DATA_RETENTION=48h -e PMM_PERCONA_PLATFORM_ADDRESS=https://check-dev.percona.com:443 -e PMM_ENABLE_NOMAD=1'),
string(name: 'CLIENTS', value: CLIENTS),
Expand Down Expand Up @@ -114,6 +115,10 @@ pipeline {
description: 'PMM Server docker container version (image-name:version-tag)',
name: 'DOCKER_VERSION',
trim: true)
choice(
choices: ['arm64', 'amd64'],
description: 'Architecture of the PMM server staging VM',
name: 'SERVER_ARCH')
string(
defaultValue: latestVersion,
description: 'PMM Version for testing',
Expand Down
5 changes: 5 additions & 0 deletions pmm/v3/pmm3-package-tests-matrix-amd64.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ void runPackageTest(String GIT_BRANCH, DOCKER_VERSION, PMM_VERSION, TESTS, INSTA
packageTestJob = build job: 'pmm3-package-testing', parameters: [
string(name: 'GIT_BRANCH', value: GIT_BRANCH),
string(name: 'DOCKER_VERSION', value: DOCKER_VERSION),
string(name: 'SERVER_ARCH', value: params.SERVER_ARCH),
string(name: 'PMM_VERSION', value: PMM_VERSION),
string(name: 'TESTS', value: TESTS),
string(name: 'INSTALL_REPO', value: INSTALL_REPO),
Expand Down Expand Up @@ -38,6 +39,10 @@ pipeline {
description: 'PMM Server docker container version (image-name:version-tag)',
name: 'DOCKER_VERSION',
trim: true)
choice(
choices: ['amd64', 'arm64'],
description: 'Architecture of the PMM server staging VM',
name: 'SERVER_ARCH')
string(
defaultValue: latestVersion,
description: 'PMM Version for testing',
Expand Down
5 changes: 5 additions & 0 deletions pmm/v3/pmm3-package-tests-matrix-arm64.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ void runPackageTest(String GIT_BRANCH, DOCKER_VERSION, PMM_VERSION, TESTS, INSTA
packageTestJob = build job: 'pmm3-package-testing-arm', parameters: [
string(name: 'GIT_BRANCH', value: GIT_BRANCH),
string(name: 'DOCKER_VERSION', value: DOCKER_VERSION),
string(name: 'SERVER_ARCH', value: params.SERVER_ARCH),
string(name: 'PMM_VERSION', value: PMM_VERSION),
string(name: 'TESTS', value: TESTS),
string(name: 'INSTALL_REPO', value: INSTALL_REPO),
Expand Down Expand Up @@ -38,6 +39,10 @@ pipeline {
description: 'PMM Server docker container version (image-name:version-tag)',
name: 'DOCKER_VERSION',
trim: true)
choice(
choices: ['arm64', 'amd64'],
description: 'Architecture of the PMM server staging VM',
name: 'SERVER_ARCH')
string(
defaultValue: latestVersion,
description: 'PMM Version for testing',
Expand Down
180 changes: 180 additions & 0 deletions pmm/v3/pmm3-server-autobuild-amd.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
library changelog: false, identifier: 'lib@master', retriever: modernSCM([
$class: 'GitSCMSource',
remote: 'https://github.com/Percona-Lab/jenkins-pipelines.git'
]) _

pipeline {
agent {
label params.USE_ONDEMAND ? 'agent-amd64-ondemand' : 'agent-amd64'
}
parameters {
string(
defaultValue: 'v3',
description: 'Tag/Branch for pmm-submodules repository',
name: 'GIT_BRANCH')
choice(
// default is 'experimental'
choices: ['experimental', 'testing'],
description: 'Repository to push packages to',
name: 'DESTINATION')
booleanParam(
defaultValue: false,
description: 'Use on-demand instances instead of spot (for RC/Release builds)',
name: 'USE_ONDEMAND'
)
}
options {
buildDiscarder(logRotator(numToKeepStr: '30'))
skipDefaultCheckout()
disableConcurrentBuilds()
}
environment {
PATH_TO_SCRIPTS = 'sources/pmm/src/github.com/percona/pmm/build/scripts'
}
stages {
stage('Prepare') {
steps {
git poll: true,
branch: GIT_BRANCH,
url: 'http://github.com/Percona-Lab/pmm-submodules'
script {
env.VERSION = sh(returnStdout: true, script: "cat VERSION").trim()
}
sh '''
set -o errexit
git submodule update --init --jobs 10
git submodule status

git rev-parse --short HEAD > shortCommit
echo "UPLOAD/pmm3-components/yum/${DESTINATION}/${JOB_NAME}/pmm/${VERSION}/${GIT_BRANCH}/$(cat shortCommit)/${BUILD_NUMBER}" > uploadPath
'''
script {
if (params.DESTINATION == "testing") {
env.DOCKER_LATEST_TAG = "${VERSION}-rc${BUILD_NUMBER}-amd64"
env.DOCKER_RC_TAG = "${VERSION}-rc-amd64"
} else {
env.DOCKER_LATEST_TAG = "3-dev-latest-amd64"
}
}

archiveArtifacts 'uploadPath'
stash includes: 'uploadPath', name: 'uploadPath'
archiveArtifacts 'shortCommit'
slackSend botUser: true, channel: '#pmm-notifications', color: '#0000FF', message: "[${JOB_NAME}]: build started - ${BUILD_URL}"
}
}
stage('Build client source') {
steps {
sh "${PATH_TO_SCRIPTS}/build-client-source"
stash includes: 'results/source_tarball/*.tar.*', name: 'source.tarball'
uploadTarball('source')
}
}
stage('Build client binary') {
steps {
sh "${PATH_TO_SCRIPTS}/build-client-binary"
stash includes: 'results/tarball/*.tar.*', name: 'binary.tarball'
uploadTarball('binary')
}
}
stage('Build client source rpm') {
steps {
sh "${PATH_TO_SCRIPTS}/build-client-srpm"
stash includes: 'results/srpm/pmm*-client-*.src.rpm', name: 'rpms'
uploadRPM()
}
}
stage('Build client binary rpm') {
steps {
sh '''
set -o errexit

${PATH_TO_SCRIPTS}/build-client-rpm

mkdir -p tmp/pmm-server/RPMS/
cp results/rpm/pmm*-client-*.rpm tmp/pmm-server/RPMS/
'''
stash includes: 'tmp/pmm-server/RPMS/*.rpm', name: 'rpms'
uploadRPM()
}
}
stage('Build server packages') {
steps {
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'pmm-staging-slave', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
sh '''
set -o errexit

${PATH_TO_SCRIPTS}/build-server-rpm-all
'''
}
stash includes: 'tmp/pmm-server/RPMS/*/*/*.rpm', name: 'rpms'
uploadRPM()
}
}
stage('Build server docker') {
steps {
withCredentials([
usernamePassword(credentialsId: 'hub.docker.com', passwordVariable: 'PASS', usernameVariable: 'USER')]) {
sh '''
echo "${PASS}" | docker login -u "${USER}" --password-stdin
'''
}
sh '''
set -o errexit

export DOCKER_TAG=perconalab/pmm-server:$(date -u '+%Y%m%d%H%M')-amd64
export DOCKERFILE=Dockerfile.el9
if [ -n "${DOCKER_RC_TAG}" ]; then
export PMM_PERCONA_PLATFORM_ADDRESS=https://check.percona.com
fi

${PATH_TO_SCRIPTS}/build-server-docker

if [ -n "${DOCKER_RC_TAG}" ]; then
docker tag ${DOCKER_TAG} perconalab/pmm-server:${DOCKER_RC_TAG}
docker push perconalab/pmm-server:${DOCKER_RC_TAG}
fi
docker tag ${DOCKER_TAG} perconalab/pmm-server:${DOCKER_LATEST_TAG}
docker push ${DOCKER_TAG}
docker push perconalab/pmm-server:${DOCKER_LATEST_TAG}
echo "${DOCKER_LATEST_TAG}" > DOCKER_TAG
echo "${DOCKER_TAG}" > TIMESTAMP_TAG
'''
script {
env.IMAGE = sh(returnStdout: true, script: "cat DOCKER_TAG").trim()
env.TIMESTAMP_TAG = sh(returnStdout: true, script: "cat TIMESTAMP_TAG").trim()
}
withCredentials([string(credentialsId: 'LAUNCHABLE_TOKEN', variable: 'LAUNCHABLE_TOKEN')]) {
sh '''
set -o errexit
pip3 install --user --upgrade launchable~=1.0 || true
launchable verify || true
echo "$(git submodule status)" || true

export DOCKER_IMAGE_ID=$(docker inspect perconalab/pmm-server:${IMAGE} -f "{{.Id}}") || true

launchable record build --name "${DOCKER_IMAGE_ID}" --lineage "perconalab/pmm-server:${IMAGE}" || true
'''
}
}
}
}
post {
success {
script {
slackSend botUser: true, channel: '#pmm-notifications', color: '#00FF00', message: "[${JOB_NAME}]: build finished - ${IMAGE}, URL: ${BUILD_URL}"
if (params.DESTINATION == "testing") {
currentBuild.description = "RC Build v3 (amd64), Image:" + env.IMAGE
slackSend botUser: true, channel: '#pmm-qa', color: '#00FF00', message: "[${JOB_NAME}]: RC build finished - ${IMAGE}, URL: ${BUILD_URL}"
}
}
}
failure {
script {
echo "Pipeline failed"
slackSend botUser: true, channel: '#pmm-notifications', color: '#FF0000', message: "[${JOB_NAME}]: build ${currentBuild.result}, URL: ${BUILD_URL}"
slackSend botUser: true, channel: '#pmm-qa', color: '#FF0000', message: "[${JOB_NAME}]: build ${currentBuild.result}, URL: ${BUILD_URL}"
}
}
}
}
Loading