阿里云Kubernetes服务上搭建jenkins环境并完成应用构建到部署的流水线作业

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文主要演示如何在阿里云Kubernetes服务上快速搭建jenkins持续集成环境,并基于提供的示例应用快速完成应用源码编译、镜像构建和推送以及应用部署的流水线。

本文主要演示如何在阿里云Kubernetes服务上快速搭建jenkins持续集成环境,并基于提供的示例应用快速完成应用源码编译、镜像构建和推送以及应用部署的流水线。

先决条件:
阿里云Kubernetes集群。

建议: 建议用户先按照以下文档安装部署ack-jenkins应用, 然后成功运行构建任务示例demo-pipeline, 再依照此构建任务示例改造自己的构建任务配置。

1. 快速部署ack-jenkins

容器服务-Kubernetes -> 市场 -> 应用目录 -> ack-jenkins:

image

点击 参数 菜单修改 AdminPassword 字段, 选择Kubernetes集群、填写命名空间发布名称并点击 创建

image

访问jenkins服务并登陆:
image

image

ps:如未设置登陆密码,则可在部署完毕后使用如下命名查看:

$ printf $(kubectl get secret --namespace ci jenkins-ci-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

2. 配置 Kubernetes Cloud

2.1 配置 Kubernetes Cloud

Jenkins使用Kubernetes Plugin连接Kubernetes集群并动态生成和释放slave pod,关于slave pod的模板配置需要在 系统管理 -> 系统配置 -> 云 中进行配置

  • 名称:kubernetes;
  • Kubernetes 地址:https://kubernetes.default.svc.cluster.local:443;jenkins 系统安装在当前集群中,可以使用内部服务端点访问集群的 API Server
  • Kubernetes 命名空间:jenkins;动态 slave pod 会在命名空间 jenkins 下生成和销毁
    点击 测试 按钮验证连接无误:

image.png

  • Jenkins 地址:http://ack-jenkins-default:8080;slave pod连接jenkins master使用的服务端点
  • Jenkins 通道:ack-jenkins-default-agent:50000;slave pod使用jnlp连接jenkins master
    image.png
  • Pod Templates -> 名称: slave-pipeline; slave pod名称
  • Pod Templates -> 命名空间:jenkins
  • Pod Templates -> 标签列表:slave-pipeline;jenkins 构建任务通过此标签选择使用哪个模板生成slave pod
    image.png
  • Pod Templates -> 容器列表 -> jnlp;用于jnlp连接jenkins master
    image.png
  • Pod Templates -> 容器列表 -> kaniko;用于构建和推送容器镜像
    image.png
  • Pod Templates -> 容器列表 -> maven:用于maven构建和打包应用
    image.png
  • Pod Templates -> 容器列表 -> kubectl:用于kubectl命令行部署应用
    image.png
  • Pod Templates -> 环境变量;为kaniko设置DOCKER_CONFIG指定docker.json文件路径
    创建jenkins-docker-cfg secret用于镜像仓库权限设置

本示例中使用了阿里云镜像服务提供的杭州区域镜像仓库:

$ docker login -u xxx -p xxx registry-vpc.cn-beijing.aliyuncs.com
Login Succeeded
$ kubectl create secret generic jenkins-docker-cfg -n ci --from-file=/root/.docker/config.json

配置slave pod启动时挂载 secret jenkins-docker-cfg:
image.png

如果需要设置maven缓存目录,可以挂载hostPath volume 或者共享存储卷到/root/.m2/repository:
image.png

如果需要更改 settings.xml,先创建 ConfigMap:

kubectl create configmap maven-config --from-file=settings.xml -n jenkins

再配置挂载到slave pod:
image.png

如果需要部署应用到本集群,可以在slave pod中使用ServiceAccount通过kubectl部署,配置ServiceAccount:
image.png

2.2 创建构建任务

创建构建任务cicd-pipeline,拉取源码项目https://github.com/haoshuwei/jenkins-demo.git,分支master;maven打包构建,kaniko构建和推送容器镜像;kubectl部署到本集群。
在本示例中,需要打包容器镜像为:registry-vpc.cn-beijing.aliyuncs.com/haoshuwei24/application-demo:20200915
则配置构建参数如下:
image.png
构建任务配置如下:
image.png
执行构建:
image.png
可以在 https://github.com/haoshuwei/jenkins-demo.git 中查看Jenkinsfile内容。

3 连接外部集群

连接外部集群需要创建和使用证书
示例:创建k8sCertAuth证书
在此步骤中,我们需要先创建和配置一个名称为k8sCertAuth的集群证书, 点击 凭证 添加证书:
image
image
image
保存。

3. 详解构建任务示例demo-pipeline

demo-pipeline 构建任务完成的持续集成/持续交付任务为:拉取源码、构建应用war包、打包和推送容器镜像以及部署应用到k8s集群。示例源码项目地址为https://github.com/AliyunContainerService/jenkins-demo.git , 整个构建流程会按照示例项目中Jenkinsfile声明的内容执行构建。

3.1 demo-pipeline的任务配置

demo-pipeline设置了4个构建参数,分别为origin_repo repo image_tagbranchbranch 用于指定本次构建拉取应用源码仓库的哪个分支, 另外3个变量用于构建和推送应用容器镜像的地址,例如示例应用的容器镜像要推送到 registry.cn-hangzhou.aliyuncs.com/ack-cicd/ack-jenkins-demo:latest, 则origin_reporegistry.cn-hangzhou.aliyuncs.com/ack-cicd, repoack-cicd,image_taglatest
image

构建任务中配置从Git仓库拉取源码并指定Jenkinsfile路径:
image

3.2 Jenkinsfile解析

我们在示例源码项目的Jenkinsfilejenkins-demo/Jenkinsfile中定义了以下内容:

pipeline{
      // 定义groovy脚本中使用的环境变量
      environment{
        // 将构建任务中的构建参数转换为环境变量
        IMAGE_TAG =  sh(returnStdout: true,script: 'echo $image_tag').trim()
        ORIGIN_REPO =  sh(returnStdout: true,script: 'echo $origin_repo').trim()
        REPO =  sh(returnStdout: true,script: 'echo $repo').trim()
        BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()
      }

      // 定义本次构建使用哪个标签的构建环境,本示例中为 “slave-pipeline”
      agent{
        node{
          label 'slave-pipeline'
        }
      }

      // "stages"定义项目构建的多个模块,可以添加多个 “stage”, 可以多个 “stage” 串行或者并行执行
      stages{
        // 定义第一个stage, 完成克隆源码的任务
        stage('Git'){
          steps{
            git branch: '${BRANCH}', credentialsId: '', url: 'https://github.com/AliyunContainerService/jenkins-demo.git'
          }
        }

        // 添加第二个stage, 运行源码打包命令
        stage('Package'){
          steps{
              container("maven") {
                  sh "mvn package -B -DskipTests"
              }
          }
        }


        // 添加第三个stage, 运行容器镜像构建和推送命令, 用到了environment中定义的groovy环境变量
        stage('Image Build And Publish'){
          steps{
              container("kaniko") {
                  sh "kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${ORIGIN_REPO}/${REPO}:${IMAGE_TAG} --skip-tls-verify"
              }
          }
        }

        // 添加第四个stage, 部署应用到指定k8s集群
        stage('Deploy to Kubernetes') {
            parallel {
                    steps {
                        container('kubectl') {
                            step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
                        }
                    }
            }
        }
      }
}
3.2.1 environment{} 代码块

用于获取构建参数并转换为Jenkinsfile中使用的环境变量。

3.2.2 agent{} 代码块

用于指定本次构建使用的构建节点标签为slave-pipeline。 进入 系统管理 -> 系统设置 -> 云 可以看到Kubernetes云的配置, 此配置用于定义如何动态创建构建节点:
image
image
image
image

我们可以从上图的Kubernetes云配置中看到, 当我们执行构建任务时,jenkins会动态连接本集群的api server url:https://kubernetes.default.svc.cluster.local:443jenkins 命名空间下创建 slave pod slave-pipeline-xxx, 此slave pod包含4个containers, 分别为用于slave连接master的jnlp、用于maven编译打包java源码的maven、用于容器镜像构建和部署的kaniko以及用于部署k8s应用的kubectl

当使用kaniko容器进行容器镜像构建和推送时, 我们需要获取镜像推送到仓库的权限, 这个权限是以k8s secret的方式挂载到slave-pipeline-xxx的pod里的,环境变量DOCKER_CONFIG则定义了kaniko获取镜像仓库推送权限文件的默认路径。 在此我们需要创建名为jenkins-docker-cfg的secret:

在一台linux机器上执行以下命令:

$ docker login -u xxx -p xxx registry.cn-hangzhou.aliyuncs.com
$ kubectl create secret generic jenkins-docker-cfg -n ci --from-file=/root/.docker/config.json
3.2.3 stages{}代码块

stages{}代码块定义了多个stage,分别完成持续集成/持续部署过程中的不同步骤。

3.2.3.1 源码拉取

源码仓库中一般包含Jenkinsfile Dockerfile deployment.yaml等文件

stage('Git'){
  steps{
    git branch: '${BRANCH}', credentialsId: '', url: 'https://github.com/AliyunContainerService/jenkins-demo.git'
  }
}
3.2.3.2 maven编译和打包源码

maven编译的时候,用户通常会想使用缓存功能, maven缓存需要使用NAS共享存储,创建nas volume并挂载到Kubernetes云的slave-pipeline模板上, 类似jenkins-docker-cfg的挂载。

stage('Package'){
  steps{
    container("maven") {
      sh "mvn package -B -DskipTests"
    }
  }
}
3.2.3.3 kaniko构建和推送镜像

kaniko工具构建容器镜像可以不依赖docker daemon进程,在用户态空间完成镜像构建和推送, 更安全可靠。

stage('Image Build And Publish'){
  steps{
    container("kaniko") {
      sh "kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${ORIGIN_REPO}/${REPO}:${IMAGE_TAG} --skip-tls-verify"
    }
  }
}
3.2.3.4 kubectl部署k8s应用
stage('Deploy to Kubernetes') {
  steps {
    container('kubectl') {
      step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
    }
  }
}

在此步骤中,我们需要先创建和配置一个名称为k8sCertAuth的集群证书, 点击 凭证 添加证书:
image
image
image
保存。

variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG' 字段声明需要替换deployment.yaml文件中的哪些环境变量。

4. 系统配置详解

4.1 构建环境配置说明

(1)kubernetes集群动态分配构建pod的配置;
image

(2)slave-pipeline 使用了4个container分别完成流水线中各个stage的构建,Kubernetes Pod Templates配置

container jnlp:
image
container kaniko:
image
container kubectl:
image
container maven:
image

(3) 使用到的构建镜像:

  • jnlp 用于构建节点jnlp连接master:

    jenkinsci/jnlp-slave:3.35-5
  • maven 用于mvn打包构建:

     maven:3.6.2-jdk-14
  • kaniko 用于镜像构建和推送:

    registry.cn-hangzhou.aliyuncs.com/acs/kaniko:v0.14.0
  • kubectl 用于kubectl部署应用:

    registry.cn-hangzhou.aliyuncs.com/acs/kubectl:1.14.8

    (4) kaniko配置镜像仓库权限:

image

4.2 示例项目说明

(1)示例项目中使用的源码仓库

https://github.com/AliyunContainerService/jenkins-demo.git

(2)kaniko 构建和推送docker镜像说明

kaniko可以不依赖docker daemon并在用户空间执行完成Dockerfile中的每一行命令,最终完成docker镜像的构建和推送。

kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${origin_repo}/${repo}:${image_tag}

(3)部署应用到Kubernetes集群插件说明

插件配置如下:
image

对应的Pipeline语法为:

step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])

声明的变量ORIGIN_REPO,REPO,IMAGE_TAG可在构建执行时把deployment.yaml文件中对应的变量值替换为实际值:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins-java-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: jenkins-java-demo
  template:
    metadata:
      labels:
        app: jenkins-java-demo
    spec:
      containers:
      - name: jenkins-java-demo
        image: ${ORIGIN_REPO}/${REPO}:${IMAGE_TAG}
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-java-demo
spec:
  ports:
  - port: 80
    targetPort: 8080
    name: jenkins-java-demo
  selector:
    app: jenkins-java-demo
  type: LoadBalancer

(4)Jenkinsfile说明

pipeline{
      // 定义groovy脚本中使用的环境变量
      environment{
        // 本示例中使用DEPLOY_TO_K8S变量来决定把应用部署到哪套容器集群环境中,如“Production Environment”, “Staging001 Environment”等
        IMAGE_TAG =  sh(returnStdout: true,script: 'echo $image_tag').trim()
        ORIGIN_REPO =  sh(returnStdout: true,script: 'echo $origin_repo').trim()
        REPO =  sh(returnStdout: true,script: 'echo $repo').trim()
        BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()
      }

      // 定义本次构建使用哪个标签的构建环境,本示例中为 “slave-pipeline”
      agent{
        node{
          label 'slave-pipeline'
        }
      }

      // "stages"定义项目构建的多个模块,可以添加多个 “stage”, 可以多个 “stage” 串行或者并行执行
      stages{
        // 定义第一个stage, 完成克隆源码的任务
        stage('Git'){
          steps{
            git branch: '${BRANCH}', credentialsId: '', url: 'https://github.com/AliyunContainerService/jenkins-demo.git'
          }
        }

        // 添加第二个stage, 运行源码打包命令
        stage('Package'){
          steps{
              container("maven") {
                  sh "mvn package -B -DskipTests"
              }
          }
        }


        // 添加第四个stage, 运行容器镜像构建和推送命令, 用到了environment中定义的groovy环境变量
        stage('Image Build And Publish'){
          steps{
              container("kaniko") {
                  sh "kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${ORIGIN_REPO}/${REPO}:${IMAGE_TAG}"
              }
          }
        }


        stage('Deploy to Kubernetes') {
            parallel {
                stage('Deploy to Production Environment') {
                    when {
                        expression {
                            "$BRANCH" == "master"
                        }
                    }
                    steps {
                        container('kubectl') {
                            step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
                        }
                    }
                }
                stage('Deploy to Staging001 Environment') {
                    when {
                        expression {
                            "$BRANCH" == "latest"
                        }
                    }
                    steps {
                        container('kubectl') {
                            step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
                        }
                    }
                }
            }
        }
      }
    }

了解更多阿里云容器服务内容,请访问 https://www.aliyun.com/product/containerservice
了解更多kaniko内容请参考:
https://github.com/GoogleContainerTools/kaniko

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5天前
|
NoSQL 数据管理 MongoDB
数据管理DMS产品使用合集之如何通过阿里云的数据管理服务(DMS)导出MongoDB数据
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
5天前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用之在阿里云Serverless中函数计算FC nginx 部署上去之后放置静态页面如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
35 0
|
5天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
17 0
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
|
5天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之在使用阿里云函数计算部署网站时,网站打开不稳定如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
22 0
|
6天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中通过调用函数如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
129 10
|
5天前
|
Kubernetes 安全 Devops
【云效流水线 Flow 测评】驾驭云海:五大场景下的云效Flow实战部署评测
云效是一款企业级持续集成和持续交付工具,提供免费、高可用的服务,集成阿里云多种服务,支持蓝绿、分批、金丝雀等发布策略。其亮点包括快速定位问题、节省维护成本、丰富的企业级特性及与团队协作的契合。基础版和高级版分别针对小型企业和大规模团队,提供不同功能和服务。此外,云效对比Jenkins在集成阿里云服务和易用性上有优势。通过实战演示了云效在ECS和K8s上的快速部署流程,以及代码质量检测和AI智能排查功能,展示了其在DevOps流程中的高效和便捷,适合不同规模的企业使用。本文撰写用时5小时,请各位看官帮忙多多支持,如有建议也请一并给出,您的建议能帮助我下一篇更加出色。
121129 10
|
13天前
|
运维 Devops
云效产品使用报错问题之yaml流水线里的 ${CI_COMMIT_REF_NAME} 失效如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
云效产品使用报错问题之yaml流水线里的 ${CI_COMMIT_REF_NAME} 失效如何解决
|
4天前
|
数据可视化 开发者
开发者评测|云效流水线 Flow
体验云效流水线Flow,图形化拖拉拽编排适合小团队,界面简洁,管理清晰。流水线编辑布局直观,支持并行步骤,方便查看日志。作为后端开发者,需求包括便捷错误日志查看、构建记录和环境区分。Flow上手简单,配置直观,功能齐全,但资源限制可能影响多任务并发。通知机制的完善将更佳。相比其他CI/CD工具,Flow功能强,性价比高,适合推荐给团队使用。
|
4天前
|
弹性计算 数据可视化
对云效流水线 Flow 的一些体验
Flow是阿里云的CI/CD工具,以其可视化界面和拖拽式构建流程简化了新手上手难度,同时提供代码检查、构建、测试及部署等功能。尽管对CI/CD概念新手仍有学习曲线,Flow的入门教程有助于理解和使用。Flow在性能和开放性上表现出色,支持多种语言和框架,能与阿里云服务集成。成本相对较低,适合与阿里云生态匹配的团队。与其他CI/CD工具比较,Flow在功能和性能上有竞争力,但最佳选择取决于团队具体需求。总体而言,Flow是值得考虑的CI/CD解决方案。
30 1
对云效流水线 Flow 的一些体验
|
5天前
|
弹性计算 Java Maven
快速使用云效流水线 Flow 发布一个项目的评测
快速使用云效流水线 Flow 发布一个项目的评测
25 2

相关产品

  • 容器服务Kubernetes版