rekt-theme/Jenkinsfile

240 lines
5.9 KiB
Plaintext
Raw Permalink Normal View History

2018-07-13 09:26:54 +00:00
def gitBranchSlugUnderscore = env.BRANCH_NAME.replaceAll(/[^A-Za-z0-9]/, "_")
def gitBranchSlugDash = env.BRANCH_NAME.replaceAll(/[^A-Za-z0-9]/, "-")
2018-07-13 12:21:24 +00:00
// Stack name under which to deploy the stack, must not conflict with other
// projects!
def dockerStackName = "rekttheme_${gitBranchSlugUnderscore}"
// Hostnames
/*
| Component | master | develop | other branches |
| --- | --- | --- | --- |
| Frontend | https://rekt-theme.icedream.tech | https://develop.review.rekt-theme.icedream.tech | https://${gitBranchSlugDash}.review.rekt-theme.icedream.tech |
*/
def projectDomainBase = 'rekt-theme.icedream.tech'
def projectReviewDomainBase = "review.${projectDomainBase}"
def projectTag = "latest"
def projectFrontendHostname = projectDomainBase
if (env.BRANCH_NAME != "master") {
projectTag = gitBranchSlugDash
projectFrontendHostname = "${gitBranchSlugDash}.${projectReviewDomainBase}"
}
// How to access the swarm manager of the deployment infrastructure
2019-03-15 21:28:09 +00:00
def dockerSwarmManagerUrl = 'tcp://dn-cos-docker-a.dmz.hzn-b.serverkomplex.de:2375'
2018-07-13 12:21:24 +00:00
def dockerSwarmManagerCredentials = 'docker_socket_project_gitea_icedream'
// Docker image version tags
def dockerVersion = '18.03'
def dockerComposeVersion = '1.21.2'
2018-07-13 09:26:54 +00:00
// Fully qualified docker images to pull
2018-07-13 12:21:24 +00:00
def dockerImage = "docker:${dockerVersion}"
def dockerComposeImage = "docker/compose:${dockerComposeVersion}"
2018-07-13 09:26:54 +00:00
def nodeImage = "node:8"
// Fully qualified names for our project images
def dockerProjectImageNamespace = "docker.dreamnetwork.oss:5000/icedream/rekt-theme"
def dockerProjectFrontendImageName = dockerProjectImageNamespace
2018-07-13 09:26:54 +00:00
// Abort build under some conditions
@NonCPS
def shouldSkip() {
if (currentBuild.changeSets != null) {
def skipMarkerFound = false;
for (changeSet in currentBuild.changeSets) {
for (entry in changeSet) {
// Check for [ci skip]
skipMarkerFound = !!(entry.comment =~ /\[ci\s+skip\]/)
}
}
if (skipMarkerFound) {
echo "Skipping CI as last commit contains [ci skip]."
return true
}
}
return false
}
node {
checkout scm
}
if (shouldSkip()) {
manager.buildNotBuilt()
return
}
pipeline {
agent none
options {
ansiColor('xterm')
}
2018-07-13 12:21:24 +00:00
environment {
REKTTHEME_FRONTEND_HOSTNAME = "${projectFrontendHostname}"
}
2018-07-13 09:26:54 +00:00
stages {
2018-07-13 10:14:33 +00:00
stage('yarn:install') {
2018-07-13 09:26:54 +00:00
agent {
docker {
label 'docker'
image nodeImage
}
}
steps {
sh "yarn"
2018-07-13 10:14:33 +00:00
stash name: 'node_modules', includes: 'node_modules/**'
}
}
2018-07-13 12:21:24 +00:00
2018-07-13 10:14:33 +00:00
stage('code-quality:lint') {
parallel {
stage('code-quality:lint:eslint') {
agent {
docker {
label 'docker'
image nodeImage
}
}
environment {
NODE_ENV = "testing"
}
steps {
unstash 'node_modules'
sh "yarn lint:eslint -f checkstyle -o checkstyle_eslint.xml || true"
stash name: 'lint-eslint', includes: 'checkstyle_eslint.xml'
}
}
stage('code-quality:lint:sass') {
agent {
docker {
label 'docker'
image nodeImage
}
}
environment {
NODE_ENV = "testing"
}
steps {
unstash 'node_modules'
2018-07-15 22:19:03 +00:00
writeFile file: 'checkstyle_sass.xml', text: '<?xml version="1.0" encoding="utf-8"?><checkstyle version="4.3"></checkstyle>'
sh "yarn lint:sass -f checkstyle -o checkstyle_sass.xml || true"
stash name: 'lint-sass', includes: 'checkstyle_sass.xml'
2018-07-13 10:14:33 +00:00
}
}
2018-07-13 09:26:54 +00:00
}
}
2018-07-13 12:21:24 +00:00
2018-07-13 09:26:54 +00:00
stage('code-quality:lint-publish') {
agent {
docker {
label 'docker'
image 'busybox'
}
}
steps {
2018-07-13 10:14:33 +00:00
unstash 'lint-sass'
unstash 'lint-eslint'
checkstyle canRunOnFailed: true, pattern: 'checkstyle_*.xml'
2018-07-13 09:26:54 +00:00
}
}
2018-07-13 12:21:24 +00:00
2018-07-13 09:26:54 +00:00
stage('build') {
agent {
docker {
label 'docker && linux && amd64'
image nodeImage
}
}
steps {
2018-07-13 10:14:33 +00:00
unstash 'node_modules'
sh "yarn build:production"
stash name: 'dist', includes: 'dist/**'
2018-07-13 09:26:54 +00:00
dir("dist") {
archiveArtifacts '**'
}
}
}
2018-07-13 12:21:24 +00:00
stage('build:image') {
agent {
docker {
label 'docker && linux && amd64'
image dockerImage
// pass through to host Docker instance
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
environment {
REKTTHEME_FRONTEND_IMAGE = "${dockerProjectFrontendImageName}:${projectTag}"
}
steps {
sh """
apk add --no-cache python3 py3-pip
pip3 install docker-compose==${dockerComposeVersion}
"""
unstash 'dist'
2018-07-13 12:21:24 +00:00
sh """
export PATH="$PATH:/var/tmp/deps/docker-compose"
cd deployment
docker-compose build \"frontend\"
docker-compose push \"frontend\"
"""
sh "docker inspect -f \"REKTTHEME_FRONTEND_IMAGE={{index .RepoDigests 0}}\" \"${dockerProjectFrontendImageName}:${projectTag}\" > deployment/frontend.env"
stash includes: 'deployment/frontend.env', name: 'deploymentFrontendEnv'
}
}
stage('predeploy') {
parallel {
stage('predeploy:stack-config') {
agent {
docker {
label 'docker'
image dockerImage
}
}
steps {
sh """
apk add --no-cache python3 py3-pip
pip3 install docker-compose==${dockerComposeVersion}
"""
unstash "deploymentFrontendEnv"
sh """
export PATH="$PATH:/var/tmp/deps/docker-compose"
cd deployment
for envfile in ./*.env; do
source \"\${envfile}\"
done
export REKTTHEME_FRONTEND_IMAGE
docker-compose config > .docker-compose.yml
"""
archive "deployment/.docker-compose.yml"
stash includes: 'deployment/.docker-compose.yml', name: 'finalStackConfig'
}
}
}
}
stage('deploy') {
agent {
label 'docker'
}
steps {
unstash "finalStackConfig"
script {
docker.withServer(dockerSwarmManagerUrl, dockerSwarmManagerCredentials) {
sh "docker stack rm ${dockerStackName}"
sleep 10
sh "cd deployment && docker stack deploy -c .docker-compose.yml ${dockerStackName}"
}
currentBuild.description = """
- Frontend web server:\thttps://${env.REKTTHEME_FRONTEND_HOSTNAME}
"""
}
}
}
2018-07-13 09:26:54 +00:00
}
}