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"
|
|
|
|
|
2018-07-15 22:26:17 +00:00
|
|
|
// 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"
|
2018-07-13 12:31:54 +00:00
|
|
|
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}
|
|
|
|
"""
|
2018-07-13 12:31:54 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|