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

前提条件

部署Jenkins

建议先按照以下步骤安装部署ack-jenkins应用,成功运行构建任务示例demo-pipeline, 再依照此构建任务示例改造您的构建任务配置。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,选择市场 > 应用目录
  3. 阿里云应用页签中,单击ack-jenkins
  4. 应用目录 - ack-jenkins页面配置相关参数。
    1. 单击参数页签。
    2. 选择Kubernetes集群以及命名空间,填写发布名称
      命名空间
      说明 建议选择自定义命名空间或default命名空间。本示例中选择自定义命名空间ci
    3. 可选:修改AdminPassword字段,并单击创建

      如果您未设置登录密码,即未修改AdminPassword字段,Jenkins部署成功后系统会自动生成密码,默认密码为admin

  5. 访问并登录Jenkins。
    1. 在控制台左侧导航栏中,单击集群
    2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    3. 在集群管理页左侧导航栏中,选择网络 > 服务
    4. 选择上个步骤设置的命名空间,然后单击ack-jenkins-default服务的外部端点,登录并访问Jenkins系统。
  6. 配置Jenkins的新手入门
    1. 新手入门配置页面,单击安装推荐的插件
    2. 插件安装完成后,在新手入门实例配置页面,单击保存并完成
    3. 实例配置保存完成后,单击开始使用Jenkins
  7. 构建demo-pipeline并访问应用服务。
    1. 在Jenkins首页,单击demo-pipeline构建图标。
      demo-pipeline
    2. 根据您的镜像仓库信息修改构建参数。本示例中源码仓库分支为master,镜像为registry.cn-beijing.aliyuncs.com/ack-cicd/ack-jenkins-demo:latest
      构建参数
    3. 单击开始构建
      测试Kubernetes集群动态分配的Jenkins Slave Pod与Jenkins Master是否连接正常。

      执行构建后,Jenkins从Kubernetes集群动态创建一个Slave Pod运行本次构建任务。关于示例应用代码,请参见jenkins-demo-GitHubjenkins-demo-haoshuwei

    4. 查看状态,若构建成功则表示Jenkins on Kubernetes运行正常。
      Build History

Kubernetes Cloud的配置说明

Jenkins使用Kubernetes Plugin连接Kubernetes集群并动态生成和释放Slave Pod。

  1. 在左侧导航栏选择返回工作台
  2. 在Jenkins系统左侧导航栏选择系统管理
  3. 管理Jenkins页面的系统配置下单击节点管理
  4. 节点列表页面左侧导航栏选择Configure Clouds
  5. 配置集群页面单击Kubernetes Cloud details...

    在部署ack-jenkins时已自动化配置Kubernetes Cloud,以下为各个参数的具体说明:

    参数 说明
    名称 默认为kubernetes构建pod
    Kubernetes地址 默认为https://kubernetes.default.svc.cluster.local:443,Jenkins系统安装在当前集群中,可以使用内部服务端点访问集群的API Server。
    Kubernetes命名空间 默认为default,动态Slave Pod会在命名空间default下生成和销毁。
    Jenkins地址 默认为http://ack-jenkins-default:8080,Slave Pod连接Jenkins Master使用的服务端点。
    Jenkins通道 默认为ack-jenkins-default-agent:50000,Slave Pod使用Jnlp连接Jenkins Master。
  6. 配置集群页面单击Pod Templates...,再单击Pod Templates details...

    在部署ack-jenkins时已自动化配置Pod Templates,以下为各个参数的具体说明:

    参数 说明
    名称 默认为slave-pipeline,Slave Pod的名称。Container jnlp
    命名空间 默认为jenkins
    标签列表 默认为slave-pipeline,Jenkins构建任务通过此标签选择模板生成Slave Pod。
    容器列表 jnlp用于连接Jenkins Master。
    kaniko用于构建和推送容器镜像。Container kaniko
    maven用于构建和打包应用。Container maven
    kubectl用于部署应用。Container kubectl

为Slave Pod配置maven缓存

由于Slave Pod是在Kubernetes集群中动态生成的,可能运行于集群的任何一个Worker节点,所以要保证每次动态生成Slave Pod时都能使用到maven缓存,就必须使用共享存储持久化存储卷。

  1. 创建NAS共享存储持久化存储卷。具体操作,请参见使用NAS动态存储卷
    执行以下命令查看在jenkins命名空间下创建的NAS持久化存储卷。
    kubectl -n jenkins get pvc

    预期输出:

    从预期输出可得:存储卷ack-jenkins-default是Jenkins Master的/var/jenkins_home目录的持久化存储,nas-csi-pvc则是为配置maven缓存所共享的NAS持久化存储卷。

    NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    ack-jenkins-default   Bound    d-2ze8xhgzuw1t278j****                     20Gi       RWO            alicloud-disk-efficiency   3h16m
    nas-csi-pvc           Bound    nas-c6c3e703-58a9-484e-8ce5-630486ea****   20Gi       RWX            alicloud-nas-subpath       4m17s
  2. 可选:在Jenkins系统的Pod Template中添加Config Map Volume类型挂载。
    若需要为Jenkins Slave Pod挂载自定义Settings文件,则可以先创建Config Map Volume,再配置到Pod Template上。
    1. 执行以下命令创建ConfigMap。
      若需要更改settings.xml,请先创建ConfigMap。
      kubectl -n jenkins create configmap maven-config --from-file=settings.xml 
    2. 在Jenkins系统左侧导航栏选择系统管理,在管理Jenkins页面的系统配置下单击节点管理,在节点列表页面左侧导航栏选择Configure Clouds
    3. 配置集群页面单击Pod Template,再单击Pod Template details
    4. 下单击添加卷,选择Config Map Volume类型卷。
      添加卷
    5. 单击Save,保存配置。
  3. 在Jenkins系统的Pod Template中添加Persistent Volume Claim类型挂载卷。具体操作,请参见步骤2
    添加卷PVC
    结果验证
    1. 在Jenkins首页,单击demo-pipeline名称。
    2. 在Jenkins系统控制台的左侧导航栏选择配置
    3. 单击流水线页签。
    4. 脚本路径输入Jenkinsfile.maven
    5. 单击保存
    6. 在Jenkins首页,单击demo-pipeline构建图标,单击开始构建
      首次进行maven构建时,需要花费一段时间下载所有依赖包。首次构建
      再次进行maven构建,则会引用缓存的依赖包,快速完成源码打包。再次构建

使用kaniko构建和推送容器镜像

使用kaniko推送镜像时,需要设置镜像仓库的访问权限。

在本示例中,需要在Linux环境下(请注意不要在MacOS下)生成访问镜像仓库的config.json文件。例如,需要构建和推送一个镜像registry.cn-hangzhou.aliyuncs.com/haoshuwei24/jenkins-demo:20200428

  1. 执行以下命令登录镜像仓库。
    登录镜像仓库的同时会生成config.json文件。
    docker login -u <username> -p <password> registry.cn-hangzhou.aliyuncs.com

    预期输出:

    Login Succeeded
  2. jenkins命名空间下使用生成的config.json文件创建名为jenkins-docker-cfg的Secret。
    kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json
  3. 在Jenkins系统的Pod Template中配置挂载卷及环境变量。
    1. 在Jenkins系统左侧导航栏选择系统管理,在管理Jenkins页面的系统配置下单击节点管理,在节点列表页面左侧导航栏选择Configure Clouds
    2. 配置集群页面单击Pod Template,再单击Pod Template details
    3. 环境变量下单击添加环境变量,选择Environment Variable类型卷。
      环境变量及Secret卷
    4. 下单击添加卷,选择Secret Volume类型卷。
    5. 单击Save,保存配置。
    结果验证
    1. 在Jenkins首页,单击demo-pipeline名称。
    2. 在Jenkins系统控制台的左侧导航栏选择配置
    3. 单击流水线页签。
    4. 脚本路径输入Jenkinsfile.kaniko
    5. 单击保存
    6. 在Jenkins首页,单击demo-pipeline构建图标,请将构建参数修改为您实际的镜像仓库相关信息,然后单击开始构建
      查看kaniko构建日志。kaniko构建日志
    7. 查看容器镜像仓库是否已经推送成功。
      1. 登录容器镜像服务控制台
      2. 在左侧导航栏,选择实例列表
      3. 在个人版实例管理页面选择仓库管理 > 镜像仓库
      4. 镜像仓库页面,单击目标仓库右侧操作列的管理
      5. 在左侧导航栏,选择镜像版本,查看镜像是否已推送成功。镜像版本查看

升级Jenkins

若您的Jenkins环境需要更换jenkins-master镜像,由于新版本Jenkins Master的自动化脚本会向/var/jenkins_home路径写数据,为了防止覆盖已有数据,请先为/var/jenkins_home目录对应的云盘存储卷做快照备份。具体操作,请参见使用云盘存储快照