# docker项目部署脚本
# DevOps流程
`Poll SCM: H/5 * * * * # 每5分钟检查一次代码是否更新,更新则自动部署
(1) Shell脚本自动部署方式
#!/usr/bin/env bash
# the project name
PROJECT_NAME=devops-doc
# init nodejs environment
npm install
# build project
npm run docs:build
# search container
DOCKER_CONTAINER_LIST=`docker ps -a | grep ${PROJECT_NAME} | awk '{ print $1}'`
if [ ${DOCKER_CONTAINER_LIST} ];then
# stop container
docker stop ${DOCKER_CONTAINER_LIST}
# remove container
docker rm ${DOCKER_CONTAINER_LIST}
fi
# search images
DOCKER_IMAGE_LIST=`docker images | grep ${PROJECT_NAME} | awk '{ print $3}'`
if [ ${DOCKER_IMAGE_LIST} ];then
# remove images
docker rmi -f ${DOCKER_IMAGE_LIST}
fi
# create new image
docker build -t ${PROJECT_NAME}:latest .
# start container
docker run -idt --name ${PROJECT_NAME} -p 9090:80 ${PROJECT_NAME}:latest
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
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
(2) 流水线(pipeline)自动部署方式
#!groovy
pipeline{
agent any
environment{
REPOSITORY="https://gitee.com/dkgee/devops-doc.git"
PROJECT_NAME="devops-doc"
SCRIPT_PATH="/home/scripts"
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
}
/*
parameters{
choice(
choices: 'dev\nprod',
description: 'choose deploy environment',
name: 'deploy_env'
)
string (name: 'version', defaultValue: '1.0.0', description: 'build version')
}
*/
stages {
stage('获取代码'){
steps {
echo "start fetch code from git:${REPOSITORY}"
sh 'git config --global http.sslVerify false'
dir ("${env.WORKSPACE}") {
git branch: 'master', credentialsId: '30a994f9-ed98-4c75-a79a-b5f45822c0a4', url: 'https://gitee.com/dkgee/devops-doc.git'
}
}
}
stage('代码静态检查'){
steps {
echo "start code check"
}
}
stage('安装依赖包'){
steps {
dir ("${env.WORKSPACE}") {
sh """
echo "init nodejs env"
npm install
"""
}
}
}
stage('构建项目'){
steps {
dir ("${env.WORKSPACE}") {
sh """
echo "build ${PROJECT_NAME} dist"
npm run docs:build
"""
}
}
}
stage('检查并清理历史容器'){
steps {
dir ("${env.WORKSPACE}") {
sh """
echo "Clean container"
if [ `docker ps -a | grep ${PROJECT_NAME} | awk '{ print \$1}'` ];then
docker stop ${PROJECT_NAME}
docker rm ${PROJECT_NAME}
fi
"""
}
}
}
stage('检查并清理历史镜像'){
steps {
dir ("${env.WORKSPACE}") {
sh """
if [ `docker images | grep ${PROJECT_NAME} | awk '{ print \$3}'` ];then
docker rmi -f ${PROJECT_NAME}:latest
fi
"""
}
}
}
stage('构建镜像'){
steps {
dir ("${env.WORKSPACE}") {
sh """
echo "Build docker images"
docker build -t ${PROJECT_NAME}:latest .
"""
}
}
}
stage('启动镜像'){
steps {
dir ("${env.WORKSPACE}") {
sh """
echo "start ${PROJECT_NAME}"
docker run -idt --name ${PROJECT_NAME} -p 9090:80 ${PROJECT_NAME}:latest
"""
}
}
}
}
}
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
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
流水线(pipeline)部署效果图展示
说明
流水线能够以清晰直观的界面看到每步执行的过程,如当前执行阶段、耗费时间。如果哪步出现问题,可以快速定位。相比Shell脚本部署方式,这种方式除了shell脚本语言外,还需 熟悉pipeline语法。