前言

现在越来越多的企业和组织在项目管理方式上采用了持续集成和持续部署的方式,Jenkins作为开源的持续集成解决方案获得了广泛的使用。Jenkins不仅可以搭建在企业私有数据中心中,也可以搭建在公有云之上,并利用公有云的廉价和弹性的能力来满足企业持续增长的业务需求。在私有数据中心中,基于jenkins的持续集成平台通常配备有N个master节点和M个agent节点,不同的agent节点提供了不同的构建环境来支持不同种语言的编译和构建,这种jenkins的集群大部分是固定节点数目的,当构建任务增多的时候,后续的任务需要在队列中等待agent中的构建任务结束后才能得以执行,并不具备动态增加agent的能力,Azure Slave Plugin是基于jenkins的一个插件,它的作用就是能够动态扩充和缩减jenkins集群中agent的数量,真正做到按需分配。

Azure Slave Plugin简介

Azure Slave Plugin是基于jenkins的一个插件,它主要的作用就是在Azure公有云上动态分配和销毁agent节点来满足企业持续集成环境中的不可预见性的构建任务的增加和减少,当构建任务增加的时候,动态在Azure中创建一个agent来构建任务,当agent节点空闲的时候,销毁agent来节省资源。Azure Slave Plugin通过Azure management API来和Azure公有云进行交互,创建对应的虚机,存储等资源, 目前支持创建windows和linux的agent。

Azure Slave Plugin核心源码解读

Azure Slave Plugin由下面几个核心组件构成:

  • AzureCloud: 继承自hudson.slaves.Cloud, 其中包含一系列的配置选项,比如Azure的subscriptionID, serviceManagementURL等等,jenkins master节点通过这些参数去连接Azure。
  • AzureSlaveTemplate: 这个组件用来配置在Azure上动态分配的agent节点。其中包含了虚机的型号,对应的操作系统镜像的类型,系统初始化脚本,虚机所在的网络等等。AzureSlaveTemplate配置中有个标签选项,构建任务可以通过这个标签来检索到需要在哪台agent上执行构建。
  • AzureManagementServiceDelegate:这个组件用来真正执行需要发送到Azure上的创建资源的各种命令。这些命令包含了创建虚机,创建存储,创建云服务或者虚拟网络,还有初始化构建工作和善后处理等。
  • AzureSlave: 这个组件就是agent,jenkins通过和AzureSlave的交互来把构建任务分配到Slave上面

下图是这几个组件的工作流程:

这里写图片描述

搭建过程

为了简单起见,笔者将jenkins master节点搭建在了本机,通过Azure的接口去在Azure上动态创建agent。有兴趣的朋友当然可以在Azure上甚至是企业私有数据中心中搭建jenkins master节点,基本的过程都是一样的。

  1. 下载安装jenkins

    为了简单起见,笔者采用了jenkins的docker镜像,首先安装docker,安装过程这里就不赘述了,读者可以自行搜索安装教程。安装好docker后,我们可以执行docker pull jenkins命令将jenkins的官方docker镜像下载下来。

    jenkins的docker镜像下载下来以后,我们可以运行下面的命令将jenkins运行起来:

    docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home jenkins

    jenkins的docker镜像运行成功后,打开浏览器,输入http://localhost:8080, 正常情况下应该就能出现jenkins的首页了:

    这里写图片描述

    新创建一个terminal,运行docker exec <jenkins_container_id> -c cat /var/jenkins_home/secrets/initialAdminPassword获取初始登录密码(这里的<jenkins_container_id>需要替换成真实的jenkins containerID)

    接下来选择“Install Suggested Plugins”安装默认的插件,安装成功后jenkins master节点就大功告成了。

  2. 下载安装Azure Slave Plugin

    进入jenkins首页,点击“系统管理”,“插件管理”,“可选插件”进入插件安装页面:

    这里写图片描述

    搜索“Azure Slave Plugin”,找到后勾选左边的复选框,然后点击“直接安装”,稍等片刻插件就安装成功了。

  3. 配置Azure Slave Plugin

    点击“系统管理”,“系统设置”进入系统设置页面,将页面滚动到最底部,就会看到“新增一个云”的按钮,如下所示:

    这里写图片描述

    点击“新增一个云”,打开Azure Cloud配置面板:

    这里写图片描述

    • Subscription ID字段中填入对应的Azure的账户的subscriptionID
    • Management Service Certificate字段中填入管理这个Azure账号需要的证书的内容。如果已经有一个publicsetting文件的话,直接通过这个url就可以下载:https://management.core.chinacloudapi.cn/publishsettings/Index?SchemaVersion=2.0, 下载成功后,将文件中对应subscriptionID处的ManagementCertificate中的内容粘贴进去就行。
    • Max Virtual Machine Limit字段限制了在这个Subscription下面最大能创建的虚机的数量,如果超出了这个限制,Azure Slave Plugin将不会继续创建agent节点。
    • 点击“高级”按钮,在弹出的Management Service URL中填入Azure中国区的url:https://management.core.chinacloudapi.cn

    这里写图片描述

    填写完毕后,点击“Verify Configuration”来测试配置是否正确。

  4. 配置Azure Slave Template

    点击“Add Azure Virtual Machine Template”按钮,新建一个slave template:

    这里写图片描述

    点击新建后,在弹出的配置列表中填写下面的参数:

    这里写图片描述

    • name字段填写这个slave template的名称,这里可以随便填写一个字符串
    • description字段填写这个slave template的描述
    • Lables字段定义了这个slave template的一组“标签”,在新建构建任务的时候,可以通过制定和slave template一样的标签来限制当前的构建只能在特定的agent上执行。比如这里我们填写一个”ubuntu-java-buildenv“
    • Region字段中选择动态创建agent节点的地理位置,中国区对应两个”china north“,”china east”
    • Virtual Machine Size可以指定需要创建的agent的型号,比如Basic_A1,Standard_A2等等
    • Storage Account Name对应了创建agent时用到的storage,这里可以不填写,当动态创建agent的时候会自动创建
    • Retention Time定义了如果agent多长时间处于闲置状态的话,就动态回收,这里默认60分钟
    • Image Family or Id字段定义了创建的agent时对应的系统镜像,比如Ubuntu Server 14.04 LTS
    • Launch Method可选SSH和JNLP,如果agent是linux节点的话用ssh,如果是windows的话用jnlp
    • init script定义了初始化脚本,比如初始化构建环境,下载构建依赖包等等
    • username/passwd字段定义了这台agent的系统用户和密码

    点击”高级“按钮后,还可以进行更加详细的配置:

    这里写图片描述

    这里主要用到的参数有:

    • Cloud Service Name:定义了动态创建的agent所属的云服务,这些agent都属于一个子网段
    • Number of Executors:定义了同时执行构建任务的数量,如果虚机的规格相对比较好的话,可以适当增加这个数量

    至此为止,Azure Slave Plugin就配置好了。接下来我们可以创建一个构建任务来触发这个插件,动态在Azure上生成一个构建节点了。

  5. 新建构建任务测试安装结果

    点击”新建“,弹出下面的界面:

    这里写图片描述

    选择”构建一个自由风格的软件项目“,然后点击”OK“, 弹出下面的详细配置:

    这里写图片描述

    勾选”Restrict where this project can be run“,然后在Label Expression中填写我们之前创建slave template时指定的标签”ubuntu-java-buildenv“。

    配置好以后,点击”保存“,然后”立即构建“,就可以触发这个构建任务了。通过docker logs命令,我们可以看到jenkins已经动态创建了agent,并且将构建任务分配到这个节点上执行了:

    Nov 28, 2016 3:34:34 AM com.microsoftopentechnologies.azure.AzureCloud provision
    INFO: Azure Cloud: provision: start for label ubuntu-01 workLoad 1
    Nov 28, 2016 3:34:34 AM com.microsoftopentechnologies.azure.AzureCloud provision
    INFO: Azure Cloud: provision: Verifying template wangtt-a01
    Nov 28, 2016 3:34:36 AM com.microsoftopentechnologies.azure.AzureManagementServiceDelegate isValidImageID
    SEVERE: AzureManagementServiceDelegate: isValidImageID: Input might be VM Image or Image Family since ImageID is not valid
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureManagementServiceDelegate getVirtualMachineCount
    INFO: AzureManagementServiceDelegate: getVirtualMachineCount: Virtual machines count 3
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud provision
    INFO: Azure Cloud: provision: template wangtt-a01 has no validation errors
    Nov 28, 2016 3:35:08 AM hudson.slaves.NodeProvisioner$StandardStrategyImpl apply
    INFO: Started provisioning wangtt-a01 from Azure-e7de288e-5c50-4fa3-bbaa-61c62220cf89 with 1 executors. Remaining excess workload: 0
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: inside call method
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: got slave computer
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: got slave computer Azure1128030720
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: slave node ubuntu-01
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: slave template ubuntu-01
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: got slave computer Azure1128032120
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: slave node ubuntu-01
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: slave template ubuntu-01
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureCloud$1 call
    INFO: Azure Cloud: provision: Provisioning new slave for label ubuntu-01
    Nov 28, 2016 3:35:08 AM com.microsoftopentechnologies.azure.AzureManagementServiceDelegate createVirtualMachine

    ……

总结

通过上面的例子我们可以看到整个安装和配置过程是十分简单明了的,jenkins master节点不仅可以安装在Azure上,也可以部署在企业本地的数据中心,只要配置好和Azure连接的参数,我们就可以享受公有云带来的持续集成的便利,通过将构建任务放在弹性公有云上,企业可以节省搭建私有jenkins集群的成本,同时利用Azure上已有的agent的镜像来轻松构建不同语言的构建环境,大大加快了企业持续集成的速度。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐