pipeline { agent any environment { DOCKER_REGISTRY='git.massivebox.net' BUILDER_NAME='mbuilder' SERVICE='ecodash/ecodash' } stages { stage('Run linter and build') { agent { docker { image 'golang' } } steps { checkout scm sh 'curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin' sh 'go mod tidy' sh 'golangci-lint run' sh 'env GOOS=linux GOARCH=amd64 go build -o app src/main/main.go' stash includes: 'app', name: 'ecodash-x86' sh 'env GOOS=linux GOARCH=arm go build -o app src/main/main.go' stash includes: 'app', name: 'ecodash-arm' stash includes: 'jenkins/Dockerfile', name: 'dockerfile' stash includes: 'templates/**', name: 'templates' } } stage('Build x86 container') { steps { unstash 'dockerfile' unstash 'ecodash-x86' unstash 'templates' sh 'docker build -t ecodash .' } } stage('Prepare buildx') { steps { sh """ docker run --privileged --rm tonistiigi/binfmt --install all docker context create $BUILDER_NAME docker context use $BUILDER_NAME docker buildx create $BUILDER_NAME docker buildx use $BUILDER_NAME docker buildx inspect --bootstrap """ } } stage('Build arm container') { steps { unstash 'dockerfile' unstash 'ecodash-arm' unstash 'templates' sh 'docker buildx build --platform linux/arm64 -t ecodash .' } } stage('Publish container on tag latest') { when { branch 'master' } steps { withCredentials([usernamePassword(credentialsId: 'gitea-credentials', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { sh 'docker login -u $USER -p $PASSWORD $DOCKER_REGISTRY' } sh """ docker image tag ecodash $DOCKER_REGISTRY/$SERVICE:$TAG docker push $DOCKER_REGISTRY/$SERVICE:$TAG """ } } } post { always { // cleanup sh """ docker context rm -f $BUILDER_NAME docker buildx use default """ } } }