ToB企服应用市场:ToB评测及商务社交产业平台
标题:
轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline
[打印本页]
作者:
tsx81429
时间:
2023-3-9 08:27
标题:
轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline
轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline
尽自己的绵薄之力,为开源技术分享添砖加瓦
1,设置pipeline
2,设置git仓库地址、用户名、密码
3,生成流水线脚本
4,编写pipeline_配置发布服务器、harbor、jar包目录等
5,编写pipeline_配置dockerfile、docker编译命令等
6
,编写pipeline_配置连接部署服务器、docker启动、删除容器命令等
============================部署后端pieplie范例脚本============================
相关变量都以xxx代替,请自行替换
1 pipeline{
2 agent any
3 environment {
4 HARBOR_HOST = "192.168.xxx.xxx:xxx"
5 HARBOR_USER = "xxx"
6 HARBOR_PASSWORD = "xxx"
7 HARBOR_PROJECT = "xxx"
8 PROJECT_NAME = "xxx"
9 DEPLOY_ENV = "test"
10 DEPLOY_PORT = "xxx"
11 PACKAGE_PATH = "./xxx/xxx/xxx.jar"
12 BUILD_VERSION = createVersion()
13 CLEAR_NONE_SSH = "n=`docker images | grep '<none>' | wc -l`; if [ \$n -gt 0 ]; then docker rmi `docker images | grep '<none>' | awk '{print \$3}'`; fi"
14 DEPLOY_REMOTE_01 = "192.168.100.xxx"
15 DEPLOY_REMOTE_02 = "192.168.100.xxx"
16 }
17 tools{
18 // 添加环境,名称为Jenkins全局配置中自己定义的别名
19 jdk 'jdk1.8.0_11'
20 maven 'apache-maven-3.6.2'
21 }
22 stages{
23 stage("拉取代码"){
24 //check CODE
25 steps {
26 checkout([$class: 'GitSCM', branches: [[name: '$Tag']], extensions: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'http://xxx:xxx/xxx/xxx.git']]])
27 }
28 }
29 stage("maven构建"){
30 steps {
31 sh "mvn clean package -P ${DEPLOY_ENV} -P jdk8 -Dmaven.test.skip=true"
32 }
33 }
34 stage("构建docker镜像,并push到harbor当中"){
35 //docker push
36 steps {
37 sh '''cat << EOF > Dockerfile
38 FROM openjdk:8-jre
39 MAINTAINER hawksoft hawksoft@qq.com
40 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
41 COPY ${PACKAGE_PATH} /app.jar
42 ENTRYPOINT ["java", "-Xmx512m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
43 CMD ["--spring.profiles.active=${DEPLOY_ENV}"]
44 '''
45 sh 'cat Dockerfile'
46 sh 'ls -l'
47 sh "docker build -t ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION ."
48 sh "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
49 sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
50 sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
51 }
52 }
53 stage("拉取docker镜像,并部署发布"){
54 steps {
55 deployAndRun("${DEPLOY_REMOTE_01}")
56 deployAndRun("${DEPLOY_REMOTE_02}")
57 }
58 }
59 }
60 }
61
62 // 定义一个版本号作为当次构建的版本,输出结果 20221209248576_103
63 def createVersion() {
64 return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
65 }
66
67 // 声明一个方法,其中 withCredentials 是 Jenkins 凭据管理中添加过的凭据
68 def conRemote(ip){
69 def remote = [:]
70 remote.name = "test--->>>${PROJECT_NAME}------>>>>>>>${ip}"
71 remote.host = ip
72 remote.port = xxx
73 remote.allowAnyHosts = true
74 withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'password', usernameVariable: 'userName')]) {
75 remote.user = "${userName}"
76 remote.password = "${password}"
77 }
78 return remote
79 }
80
81 // 部署运行
82 def deployAndRun(ip){
83 // 登录harbor
84 sshCommand remote: conRemote(ip), command: "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
85 // 更新或下载镜像
86 sshCommand remote: conRemote(ip), command: "docker pull ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
87 // 打印所有镜像
88 sshCommand remote: conRemote(ip), command: "docker images"
89 try{
90 // 停止指定名称容器
91 sshCommand remote: conRemote(ip), command: "docker stop ${PROJECT_NAME}"
92 // 删除指定名称容器
93 sshCommand remote: conRemote(ip), command: "docker rm ${PROJECT_NAME}"
94 // 启动容器
95 sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:xxx -v /home/docker/${PROJECT_NAME}/logs:/logs ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
96 // 删除未使用到的镜像
97 sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
98 // 清理none镜像
99 sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
100 }
101 catch (e){
102 // 启动容器
103 sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:xxx -v /home/docker/${PROJECT_NAME}/logs:/logs ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
104 // 删除未使用到的镜像
105 sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
106 // 清理none镜像
107 sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
108 }
109 }
复制代码
============================部署前端pieplie范例脚本============================
相关变量都以xxx代替,请自行替换
1 pipeline{
2 agent any
3 environment {
4 HARBOR_HOST = "192.168.100.xxx:xxx"
5 HARBOR_USER = "xxx"
6 HARBOR_PASSWORD = "xxx"
7 HARBOR_PROJECT = "xxx"
8 PROJECT_NAME = "xxx"
9 DEPLOY_ENV = "test"
10 PACKAGE_PATH = "./dist"
11 BUILD_VERSION = createVersion()
12 CLEAR_NONE_SSH = "n=`docker images | grep '<none>' | wc -l`; if [ \$n -gt 0 ]; then docker rmi `docker images | grep '<none>' | awk '{print \$3}'`; fi"
13 DEPLOY_REMOTE_01 = "192.168.xxx.xxx"
14 DEPLOY_PORT = "xxx"
15 }
16 tools{
17 // 添加环境,名称为Jenkins全局配置中自己定义的别名
18 nodejs 'node-v14.17.6'
19 }
20 stages{
21 stage("拉取代码"){
22 //check CODE
23 steps {
24 checkout([$class: 'GitSCM', branches: [[name: '$Tag']], extensions: [], userRemoteConfigs: [[credentialsId: 'xxx', url: 'http://xxx/xxx/xxx.git']]])
25 }
26 }
27 stage("build构建"){
28 steps {
29 sh '''
30 cnpm install
31 cnpm run build:${DEPLOY_ENV}
32 '''
33 }
34 }
35 stage("构建docker镜像,并push到harbor当中"){
36 //docker push
37 steps {
38 sh 'pwd'
39 sh '''cat << EOF > Dockerfile
40 # 设置基础镜像
41 FROM nginx:latest
42 # 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
43 COPY ${PACKAGE_PATH} /usr/share/nginx/html/
44 EXPOSE 80
45 CMD ["nginx", "-g", "daemon off;"]
46 '''
47 sh 'cat Dockerfile'
48 sh 'ls -l'
49 sh "docker build -t ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION ."
50 sh "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
51 sh "docker push ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
52 sh "docker rmi ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
53 }
54 }
55 stage("拉取docker镜像,并部署发布"){
56 steps {
57 deployAndRun("${DEPLOY_REMOTE_01}")
58 }
59 }
60 }
61 }
62
63 // 定义一个版本号作为当次构建的版本,输出结果 20211029532456_17
64 def createVersion() {
65 return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
66 }
67
68 // 声明一个方法,其中 withCredentials 是 Jenkins 凭据管理中添加过的凭据
69 def conRemote(ip){
70 def remote = [:]
71 remote.name = "dev-${PROJECT_NAME}------>>>>>>>${ip}"
72 remote.host = ip
73 remote.port = xxx
74 remote.allowAnyHosts = true
75 withCredentials([usernamePassword(credentialsId: 'xxx', passwordVariable: 'password', usernameVariable: 'userName')]) {
76 remote.user = "${userName}"
77 remote.password = "${password}"
78 }
79 return remote
80 }
81
82 // 部署运行
83 def deployAndRun(ip){
84 // 登录harbor
85 sshCommand remote: conRemote(ip), command: "docker login -u ${HARBOR_USER} -p '${HARBOR_PASSWORD}'" + " ${HARBOR_HOST}"
86 // 更新或下载镜像
87 sshCommand remote: conRemote(ip), command: "docker pull ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
88 // 打印所有镜像
89 sshCommand remote: conRemote(ip), command: "docker images"
90 try{
91 // 停止指定名称容器
92 sshCommand remote: conRemote(ip), command: "docker stop ${PROJECT_NAME}"
93 // 删除指定名称容器
94 sshCommand remote: conRemote(ip), command: "docker rm ${PROJECT_NAME}"
95 // 启动容器
96 sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:80 ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
97 // 删除未使用到的镜像
98 sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
99 // 清理none镜像
100 sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
101 }
102 catch (e){
103 // 启动容器
104 sshCommand remote: conRemote(ip), command: "docker run -idt --name ${PROJECT_NAME} --restart=always -p ${DEPLOY_PORT}:80 ${HARBOR_HOST}/${HARBOR_PROJECT}/${PROJECT_NAME}:$BUILD_VERSION"
105 // 删除未使用到的镜像
106 sshCommand remote: conRemote(ip), command: "docker image prune -a -f"
107 // 清理none镜像
108 sshCommand remote: conRemote(ip), command: "${CLEAR_NONE_SSH}"
109 }
110 }
复制代码
7,执行构建
第一次进入时只有master,需要先选master构建,而后下次构建时就会出现可供选择的branch或tag了
8,通过发布日志、harbor、portainer验证及查看发布情况
至此,轻量级CI/CD发布部署环境搭建及使用_07_jenkins配置pipeline
轻量级CI/CD发布部署环境搭建及使用_01_基本介绍
轻量级CI/CD发布部署环境搭建及使用_02_docker安装jenkins
轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor
轻量级CI/CD发布部署环境搭建及使用_04_docker安装nexus3
轻量级CI/CD发布部署环境搭建及使用_05_jenkins配置jdk、nodejs、maven、python2
轻量级CI/CD发布部署环境搭建及使用_06_jenkins配置git、harbor、部署机器等凭证
编写不易,如需转载,请注明出处
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4