前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Jenkins pipeline流水线构建docker镜像和发布

使用Jenkins pipeline流水线构建docker镜像和发布

作者头像
Ryan-Miao
发布2019-01-03 15:27:02
5.8K0
发布2019-01-03 15:27:02
举报
文章被收录于专栏:Ryan MiaoRyan Miao

新建一个pipeline job

选择Pipeline任务,然后进入配置页面。

对于Pipeline, Definition选择 "Pipeline script from SCM".

需要注意的是Script Path, 这里要指定项目中Jenkinsfile文件的具体位置。默认是根目录。我这里是maven的一个子模块,所以嵌套一层。

项目中添加Jenkinsfile

关于Jenkinsfile可以查阅w3c翻译整理的文档: https://www.w3cschool.cn/jenkins/jenkins-qc8a28op.html

以下是我自己的Jenkinsfile,这里用作注释和备忘

代码语言:javascript
复制
node('slave001') {


    stage('Prepare') {
        echo "1.Prepare Stage"
        checkout scm
        pom = readMavenPom file: 'location/pom.xml'
        docker_host = "docker.ryan-miao.com"
        img_name = "${pom.groupId}-${pom.artifactId}"
        docker_img_name = "${docker_host}/${img_name}"
        echo "group: ${pom.groupId}, artifactId: ${pom.artifactId}, version: ${pom.version}"
        echo "docker-img-name: ${docker_img_name}"
        script {
            build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
            if (env.BRANCH_NAME != 'master' && env.BRANCH_NAME != null) {
                build_tag = "${env.BRANCH_NAME}-${build_tag}"
            }
        }
    }

    stage('Test') {
        echo "2.Test Stage"
        sh "mvn test"
    }
    stage('Build') {
        echo "3.Build Docker Image Stage"
        sh "mvn package  -Dmaven.test.skip=true"
        sh "docker build -t ${docker_img_name}:${build_tag} " +
                " --build-arg SPRING_PROFILE=prod " +
                " --build-arg JAR_FILE=target/${pom.artifactId}-${pom.version}.jar " +
                " ./location/"
    }

    stage('Push') {
        echo "4.Deploy jar and Push Docker Image Stage"
        sh "mvn deploy -Dmaven.test.skip=true"
        sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:latest"
        sh "docker tag ${docker_img_name}:${build_tag} ${docker_img_name}:${pom.version}"
        withCredentials([usernamePassword(credentialsId: 'docker-register', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
            sh "docker login -u ${dockerUser} -p ${dockerPassword} docker.ryan-miao.com"
            sh "docker push ${docker_img_name}:latest"
            sh "docker push ${docker_img_name}:${pom.version}"
            sh "docker push ${docker_img_name}:${build_tag}"
        }
    }

    //stash 'complete-build'

}

if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == null) {
    timeout(time: 10, unit: 'MINUTES') {
        input '确认要部署线上环境吗?'
    }
}


node('slave001'){
    stage('Deploy') {
        //unstash 'complete-build'
        echo "5. Deploy Stage"

        sh "sed -i 's/<IMG_NAME>/${img_name}:${build_tag}/' location/k8s.yaml"
        sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' location/k8s.yaml"
        sh "/data/opt/kubernetes/client/bin/kubectl apply -f ${WORKSPACE}/location/k8s.yaml --record"
    }

}
  • node('slave001') { 最外层必须是node节点,这里单独制定运行的jenkins节点,通常不用指定,由jenkins master分配任务即可。这种写法属于Scripted Pipeline。
  • stage('Prepare') {} stage是一个阶段的语法,括号里阶段名称。脚本从node开始,按顺序向下执行。遇到的第一个stage就是第一个阶段。
  • 使用echo xxxx来输出文字,给出进度信息。
  • checkout scm 是Jenkins固定获取代码的方法,会输出Check out from version control。
  • pom = readMavenPom file: 'location/pom.xml' 是读取workspace下相对目录的pom文件。这个需要Jenkins 安装Pipeline Utility Steps插件。通过${pom.groupId}-${pom.artifactId}来获取pom信息. 我的pom在子module location里。
  • docker_host = "docker.ryan-miao.com" 声明一个全局的变量,如果只想在方法体 {}中使用,可以加def
  • ${docker_host} 变量可以通过这样类似shell的方式获取。
  • build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() 用来获取git的commit id
  • Build阶段执行docker命令打包,把我们的变量传递到Dockerfile. 我的Dockerfile同样在子module location下。
  • withCredentials可以调用存储在Jenkins里的凭证。这个需要安装Credentials Binding Plugin.
  • input会产生一个交互式的按钮,需要手动点击通过才会继续,否则暂停。这个只是暂停下一步,线程还在运行。所以,需要单独提出node之外,再添加一个超时设置。参见“input” step blocks executor
  • stash暂存文件,参见官方文档. 主要用来把这次build过程中的某个文件给暂存,只在本次build有效。本次不需要。
  • timeout 主要用来设置超时,参见官方文档, 时间单位有: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS。这里等待用户确认是否继续,若超过10分钟还没有确认,则停止。

看起来,似乎完美的从代码编译,打包,构建docker镜像,推送到仓库,设置触发了部署。但离真正生产方案还有距离。因为你不可能编译结束就直接上生产。真实的流程应该是: checkout->build->test-> 部署到测试环境 -> 对测试环境的自动化测试 -> 部署到生产环境。

如何做到build once, deploy many

我这里的pipeline步骤里没有多环境串联部署。这里部署到测试环境了,如果测试通过之后,想要部署生产环境应该怎么下一步呢?想要手动点一下某个按钮,就可以将部署在测试环境的这个版本的镜像部署到prod。input显然不满足需求。

第一,记录当前测试环境的镜像id;第二,提供一个生产prod job,可以手动输入镜像id进行部署.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新建一个pipeline job
  • 项目中添加Jenkinsfile
  • 如何做到build once, deploy many
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档