# docker项目部署脚本

# DevOps流程

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) 流水线(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

流水线(pipeline)部署效果图展示

1616

说明

流水线能够以清晰直观的界面看到每步执行的过程,如当前执行阶段、耗费时间。如果哪步出现问题,可以快速定位。相比Shell脚本部署方式,这种方式除了shell脚本语言外,还需 熟悉pipeline语法。

上次更新: 2020-04-13 19:32:29