轻量级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、部署机器等凭证编写不易,如需转载,请注明出处
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |