-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathJenkinsfile
104 lines (97 loc) · 4.46 KB
/
Jenkinsfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
pipeline {
agent any
options {
disableConcurrentBuilds()
timestamps()
buildDiscarder(logRotator(numToKeepStr: '1'))
}
environment {
BUILD_FOLDER = "${'builds/' + env.BRANCH_NAME + '/' + env.BUILD_NUMBER}"
IMAGE_NAME = "${'movie-api-php.' + env.BRANCH_NAME + '.' + env.BUILD_NUMBER}"
SSH_CMD = "${'ssh ' + env.DEPLOY_USER + '@' + env.DEPLOY_HOST}"
}
stages {
stage('Prepare') {
steps {
checkout scm
sh '${SSH_CMD} "mkdir -p ~/${BUILD_FOLDER}"'
sh 'tar --exclude .git -cpf - . |${SSH_CMD} "tar -C ~/${BUILD_FOLDER} -xpf -"'
}
}
stage('Build') {
steps {
// this step is only needed if the src/vendor folder is left out of the repo
//sh '${SSH_CMD} "cd ~/${BUILD_FOLDER} && ./composer-install.sh"'
sh '${SSH_CMD} "docker build -t ${IMAGE_NAME} ~/${BUILD_FOLDER}"'
}
}
stage('Test') {
environment {
RUNNING_CONTAINER = sh(returnStdout: true, script: '${SSH_CMD} "docker container ls -f publish=8080/tcp -q"').trim()
MYSQL_PASSWORD = credentials('MYSQL_PASSWORD')
TMDB_API_KEY = credentials('TMDB_API_KEY')
}
steps {
script {
// if a container is already running, we can stop it or fail the test
if (env.RUNNING_CONTAINER) {
//sh '${SSH_CMD} "docker stop ${RUNNING_CONTAINER}"'
echo "cannot run tests because a container is already running on port 8080"
// will this still run our cleanup?
exit 1
}
}
sh '${SSH_CMD} "docker run -d -e \'MYSQL_HOST_READ=${MYSQL_HOST_READ}\' -e \'MYSQL_HOST_WRITE=${MYSQL_HOST_WRITE}\' -e \'MYSQL_DATABASE=${MYSQL_DATABASE}\' -e \'MYSQL_USER=${MYSQL_USER}\' -e \'MYSQL_PASSWORD=${MYSQL_PASSWORD}\' -e \'TMDB_API_KEY=${TMDB_API_KEY}\' --rm --name ${IMAGE_NAME} -p 8080:80 ${IMAGE_NAME}"'
// TODO: add a retry to test for port 8080 connection
// TODO: run curl tests
// TODO: how will we test JWT authentication?
// - generate a token from Cognito user pool?
// - force test user?
echo 'Run tests'
sh '${SSH_CMD} "docker stop ${IMAGE_NAME}"'
// this should always run if we built the image - unless the branch is master, then we'll keep it for production deployment
//script {
//}
}
}
stage('Deploy') {
when {
branch 'master'
}
environment {
// get original deploy container
PREVIOUS_CONTAINER = sh(returnStdout: true, script: '${SSH_CMD} "docker container ls -f publish=80/tcp -q"').trim()
MYSQL_PASSWORD = credentials('MYSQL_PASSWORD')
TMDB_API_KEY = credentials('TMDB_API_KEY')
}
steps {
script {
// TODO: the service is down for about 1 second here, there's a better way
// stop original deploy container
if (env.PREVIOUS_CONTAINER) {
sh '${SSH_CMD} "docker stop ${PREVIOUS_CONTAINER}"'
}
}
// start new container
sh '${SSH_CMD} "docker run -d -e \'MYSQL_HOST_READ=${MYSQL_HOST_READ}\' -e \'MYSQL_HOST_WRITE=${MYSQL_HOST_WRITE}\' -e \'MYSQL_DATABASE=${MYSQL_DATABASE}\' -e \'MYSQL_USER=${MYSQL_USER}\' -e \'MYSQL_PASSWORD=${MYSQL_PASSWORD}\' -e \'TMDB_API_KEY=${TMDB_API_KEY}\' --name ${IMAGE_NAME} -p 80:80 ${IMAGE_NAME}"'
// TODO: run final tests
// TODO: switch back to original container if test fails
// TODO: clean up the original container if test passes?
echo 'Deploy to production complete'
}
}
}
post {
always {
// TODO: want to cleanup, but is this safe?
sh '${SSH_CMD} "rm -r ~/${BUILD_FOLDER}"'
// TODO: also cleanup docker images if not the master branch
script {
// stop original deploy container
if (env.BRANCH_NAME != 'master') {
sh '${SSH_CMD} "docker image rm ${IMAGE_NAME}"'
}
}
}
}
}