ci/cd技术专题「jenkins实战系列」jenkinsfile+dockerfile实现自动部署(代码片段)

洛神灬殇 洛神灬殇     2023-01-02     350

关键词:

每日一句

没有人会因学问而成为智者。学问或许能由勤奋得来,而机智与智慧却有懒于天赋。

前提概要

  • Jenkins下用DockerFile自动部署Java项目,项目的部署放心推向容器化时代机制。
  • 本节需要对jenkinsfile有点了解,对dockerfile有点了解,对shell有点了解,对docker有点了解

环境准备

新建-构建一个Maven项目

需要提一下,现在新安装的没有这个选项,需要在插件里安装一下 Maven Integration

java配置,其他配置查看以前文章

发布到服务器,DockerFile部署自动构建

Publish SSH配置

执行流程

  1. jenkins拉取代码仓库中的代码
  2. jenkins执行jenkinsfile文件(可指定文件名)
  3. 先在jenkins所在的服务器将拉取的项目build成docker镜像
  4. 将镜像发布到镜像仓库
  5. 在应用服务器的节点上将该镜像拉取下来(私有仓库需要用户名/密码)
  6. 在应用服务器上执行该镜像

jenkins配置

创建一个Pipeline SCM项目 jenkins项目名为sample-tezst (和发布的工程名保持一致)

  • Definition选择 【Pipeline Script from SCM】

  • Branch Specifier(blank for ‘any’):选择分支

  • Additional Behaviours: 添加邮箱通知的发送者

  • Script Path: 填写使用项目中的Jenkinsfile文件的名字

应用工程配置

在工程的根目录下创建Dockerfile文件和Jenkins_docker文件

jenkinsfile_docker文件内容如下:

docker集成docker部署
pipeline 
    agent label 'master'
    tools
        maven 'maven'
    
    environment 
        GIT_PROJECT_ADDR="git@gitee.com:uncleqiao/springboot-test.git" //项目的git地址
        JENKINS_WORKSPACE="/root/.jenkins/workspace"    //jenkins存放文件的地址
        PROJECT_NAME="$JOB_NAME"  			        // 项目名
        JAR_NAME="sample-tezst-0.0.1-SNAPSHOT.jar"   // 项目生成的jar的名字
        IMAGE_NAME="sample-tezst"                    // 镜像名一般和项目名相同
        IMAGE_ADDR="repository/qiao_namespace/$IMAGE_NAME"    // 镜像的位置
        VERSION_ID="$BUILD_ID"
    
    stages 
        stage('pullCode')
            steps
                echo 'This is a pullCode step'
                //git branch: "$BRANCH", credentialsId: '1001', url: "$GIT_PROJECT_ADDR"
                checkout scm
            
        
        stage('Build') 
            steps
                echo 'This is a Build step'
                // 在有Jenkinsfile同一个目录下(项目的根目录下)
                sh 'mvn clean package -Dmaven.test.skip=true'
            
        
        // 创建目录(如果不存在),并把jar文件上传到该目录下
        stage('ssh') 
            steps
                echo 'push jar to target server'
                sh '''
                    ole_image_id=`docker images|grep $IMAGE_NAME|grep $VERSION_ID|awk 'print $3'`
                    if [[ -n "$ole_image_id" ]]; then
                        docker rmi -f $ole_image_id
                    fi
                    docker build -f  Dockerfile --build-arg jar_name=$JAR_NAME -t $IMAGE_NAME:$VERSION_ID .
                    new_image_id=`docker images|grep $IMAGE_NAME|grep $VERSION_ID|awk 'print $3'`
                    sudo docker tag $new_image_id $IMAGE_ADDR:$VERSION_ID
                    sudo docker push $IMAGE_ADDR:$VERSION_ID
                '''
            
        
        stage('run') 
            // 在应用服务器节点 test
            agent 
                node 
                    label 'test'
                    //customWorkspace "$SERVER_TARGET_PATH"  //此参数会初始化目录 注意填写
                
            
            options 
                // 不让它切换到节点上自动从仓库拉取项目
                skipDefaultCheckout()
            
            steps 
                echo 'pull image and docker run'
                withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) 
                    sh '''
                        sudo docker login --username=yourusername --password=yourpassword ccr.ccs.tencentyun.com
                        sudo docker pull $IMAGE_ADDR:$VERSION_ID

                        container_id=`docker ps|grep $IMAGE_ADDR:$VERSION_ID|awk 'print $1'`
                        if [ -n "$container_id" ]; then
                        	docker rm -f "$container_id"
                        fi
                        old_pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk 'print $2'`
                        if [[ -n $old_pid ]]; then
                            kill -9 $old_pid
                        fi
                        old_image=`docker images|grep $IMAGE_ADDR|grep $VERSION_ID`
                        if [[ -n $old_image ]]; then
                            old_image_id=`echo $old_image|awk 'print $3'`
                            docker rmi -f $old_image_id
                        fi
                        sudo docker run --name "$PROJECT_NAME_$VERSION_ID" -p 9001:8081 -d $IMAGE_ADDR:$VERSION_ID
                    '''
                
            
        
    

注意:

if [ -n str ] 这个命令在使用的时候如果str为空,也是true,可以使用 if [ -n s t r − a " str -a " stra"strx" != “x” ]或者使用if [[ -n s t r ] ] 来判断 s h e l l 语法中, str ]]来判断 shell语法中, str]]来判断shell语法中,()` 和 `` (两个单引号) 可以在子shell中执行命令,但是这儿$()不支持

idea没有jenkinsfile的语法提示,很容易出错,这个很难受

步骤一:拉取项目 在【pullCode】步骤中

checkout scm , 这个scm是创建jenkins流水线时选择的,属于特殊变量,代表了你的仓库信息,自动从仓库中获取项目

步骤二: 【Build】

将拉取下来的项目进行编译并打包

步骤三:【build_image】

将打包好的项目build成docker镜像,然后推送到镜像仓库(这里可以分成两步)

获取已经存在的镜像
ole_image_id=`docker images| grep $IMAGE_NAME | grep $VERSION_ID|awk 'print $3'`
删掉存在的镜像
if [[ -n "$ole_image_id" ]]; then
	docker rmi -f $ole_image_id
fi
  • 通过项目根目录下的Dockerfile来构建镜像
    • -f:[filename] --build-arg <key=value> 给Dockerfile传递参数
    • -t:镜像的名称:版本 这里我将jenkins的构建次数当作镜像的版本
docker build -f Dockerfile --build-arg jar_name=$JAR_NAME -t $IMAGE_NAME:$VERSION_ID .
获取构建好的镜像的id
new_image_id=`docker images | grep $IMAGE_NAME | grep $VERSION_ID | awk 'print $3'`
根据生成的镜像,tag出一个名称空间不同的镜像
sudo docker tag $new_image_id repoistory/qiao_namespace/$IMAGE_NAME:$VERSION_ID
将镜像仓库能够识别的镜像推送到仓库
sudo docker push repoistory/qiao_namespace/$IMAGE_NAME:$VERSION_ID

步骤四:【run】

应用服务器拉取项目并且运行, 这一步要选择节点(应用服务器,如果是集群,就不用节点用scp登陆吧)

登陆到镜像仓库
sudo docker login --username=yourusername --password=yourpassword repository
从仓库中拉取刚才生成的镜像
sudo docker pull repository/qiao_namespace/$IMAGE_NAME:$VERSION_ID
查看已经存在的容器, 存在则删掉 存在则删掉 这里应该是一个数组,有点小问题,待修改
container_id=`docker ps | grep $IMAGE_ADDR:$VERSION_ID | awk 'print $1'`
if [ -n "$container_id" ]; then
	docker rm -f "$container_id"
fi
查看已经运行的同版本的项目, 存在则删掉
pid=`ps -ef | grep $JAR_NAME| grep -v grep | awk 'print $2'`
if [[ -n $pid ]]; then
	kill -9 $pid
fi
查看已经存在的镜像
old_image=`docker images|grep $IMAGE_ADDR|grep $VERSION_ID`
if [[ -n $old_image ]]; then
	old_image_id=`echo $old_image|awk 'print $3'`
    docker rmi -f $old_image_id
fi

运行容器

sudo docker run --name "$PROJECT_NAME_$VERSION_ID" -p 9001:8081 -d $IMAGE_ADDR:$VERSION_ID

Dockerfile

文件内容如下

FROM repository/qiao_namespace/myjdk8:v1
默认jar包的名字 注意分隔符为 :- 这里是由jenkinsfile中build dockerfile时传递过来的
ARG jar_name=jar_name:-sample-teszt-0.0.1-SNAPSHOT.jar
RUN 用于容器内部执行命令
RUN mkdir -p /usr/local/project
WORKDIR /usr/local/project
将项目放到/usr/local/project下
COPY ./target/sample-teszt-0.0.1-SNAPSHOT.jar ./
EXPOSE 8081
CMD java -jar -Dserver.port=8081 springboot-test-0.0.1-SNAPSHOT.jar

执行完毕后我们登陆到应用服务器,看到容器已经启动

ci/cd技术专题「jenkins实战系列」jenkins+pipeline构建自动化部署(代码片段)

前提引言Jenkins的精髓是Pipeline(流水线技术),那为什么要用Pipeline呢?实现自动化构建,其中Pipeline能够将以前project中的配置信息以steps的方式放在一个脚本里,将原本独立运行于单个或者多个节点的任务连接起来&... 查看详情

ci/cd技术专题「jenkins实战系列」总结归纳jenkins的安装使用和配置流程介绍(代码片段)

...git提交代码Jenkins自动化将项目部署在Linux服务器。Jenkins技术原理篇版本控制服务Jenki 查看详情

ci/cd技术专题「jenkins实战系列」jenkinsfile+dockerfile实现自动部署(代码片段)

每日一句没有人会因学问而成为智者。学问或许能由勤奋得来,而机智与智慧却有懒于天赋。前提概要Jenkins下用DockerFile自动部署Java项目,项目的部署放心推向容器化时代机制。本节需要对jenkinsfile有点了解,对dockerf... 查看详情

ci/cd技术专题「jenkins实战系列」如何通过gitlab对接jenkins构建提交自动触发部署构建体系指南(上部)(代码片段)

前因后果最近,发现我们公司的自动化体系做的实在是不咋地,每次提交push完代码之后,还需要登录到服务器进行执行下docker脚本,之后才能拿到镜像,一说到这里我就要吐了,CI/CD做的简直是一团糟࿰... 查看详情

ci/cd技术专题「jenkins实战系列」全流程介绍jenkins环境搭建+基础部署配置(windows->linux)(代码片段)

背景在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试;前后端分离后,经常会修改接口,然后重... 查看详情

docker与jenkins的自动化ci/cd流水线实战(代码片段)

docker与jenkins的自动化CI/CD流水线实战在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git... 查看详情

jenkins与docker的自动化ci/cd实战(代码片段)

...就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git实现一套CI自动化发布流程。一、发布流程设计工作流程:开发人员提交代码到Git版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜... 查看详情

jenkins与docker的自动化ci/cd实战(代码片段)

...布流程设计工作流程:开发人员提交代码到Git版本仓库;Jenkins人工/定时触发项目构建;Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;Jenkins在Docker主机创建容器并发布。环境规划如下:角色IPGit/Registry192.168.56.11Docker19... 查看详情

jenkins与docker的自动化ci/cd流水线实战(代码片段)

Jenkins与Docker的自动化CI/CD流水线实战标签(空格分隔):docker的部分一:什么是CI/CD二:发布流程设计三:部署Git仓库并上传测试代码一:什么是CI/CD持续集成(ContinuousIntegration,CI):代码合并、构建、部署、测试都在一起,不... 查看详情

docker与jenkins的自动化ci/cd流水线实战(svn)

准备安装完成以下环境:1、svn2、jdk3、maven4、tomcat5、jenkins项目代码测试(php/java):https://github.com/lizhenliang配置svn1、查看结构trunk:主干分支branches:其他分支tags:打标记将代码最终打到tags目录下,打成版本号标记,然后再jenk... 查看详情

ci/cd系列之阿里云云效2020应用篇(代码片段)

...介绍,出于好奇便点进去看了看,刚开始以为云效是类似Jenkins的一套自动化部署方案,了解之后发现云效的野心很大哦,从需求管理、业务开发、代码管理、缺陷测试、部署上线全方位掌控,试图提供一站式DevOps平台,将原先... 查看详情

自动化运维|云原生架构下的产品自动化发布快速部署和持续交付实战之路(代码片段)

...和维护这样一个发布系统所需要的时间投入。在引入CI/CD技术之前,公司测试人员自动化打包主要依赖Jenkins实现,在配置任务的源码、构建触发器、构建环境、构建、构建后操作等步骤后,可以触发构建任务。相比传... 查看详情

docker最全教程——从理论到实战(十四)

...。  为了降低容器的使用门槛以及便于大家将容器技术应用于开发和实践,当前教程大部分线上实践结合TKE(腾讯云容器服务)来进行讲解和实践。当本系列内容讲解完成后,笔者将再单独讲解Kubernetes(k8s)。最后,长... 查看详情

ci/cd之jenkins(代码片段)

jenkinsCI/CD简介jenkins简介jenkins安装安装jenkins插件安装中文插件安装流水线插件安装gitlab插件jenkins和gitlab联动jenkins轮询检查gitlab代码变更使用webhook实时检查gitlab代码变更推送dockerfile文件自动构建镜像新增agent节点jenkins用户管理CI... 查看详情

ci/cd之jenkins(代码片段)

jenkinsCI/CD简介jenkins简介jenkins安装安装jenkins插件安装中文插件安装流水线插件安装gitlab插件jenkins和gitlab联动jenkins轮询检查gitlab代码变更使用webhook实时检查gitlab代码变更推送dockerfile文件自动构建镜像新增agent节点jenkins用户管理CI... 查看详情

ci/cd之jenkins+gitlab(代码片段)

文章目录一、Jenkinx+Gitlab持续集成环境概述(1)什么是CI/CD(2)Jenkins概述(3)Gitlab概述(4)Gitlab和Github的区别(5)Jenkins配合Gitlab持续集成系统的工作流程二、部署持续集成环境(1&... 查看详情

springboot技术专题「开发实战系列」一起搭建属于自己的springbootadmin的技术要素

SpringBootAdmin的介绍说明SpringBootAdmin是开源社区孵化的项目,用于对SpringBoot应用的管理和监控。SpringBootAdmin分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client),服务端和客户端之间采用http通讯方式实现数据交互;单体项... 查看详情

jenkins&gitee实现持续集成ci/cd工具免费推荐(代码片段)

文章目录1.Jenkins&Gitee持续集成流程2.Jenkins安装Gitee插件3.插件配置4.安装NodeJS5.新建构建任务5.1General5.2源码管理5.3触发器配置5.4构建环境5.5构建脚本6.Vue项目部署前面介绍了一些CI/CD持续集成的工具,如circleci、travisci、giteego... 查看详情