Skip to content

Jenkins Cluster in Docker on Aliyun

chuchengcao edited this page Nov 23, 2015 · 3 revisions

阿里云上使用Docker部署Jenkins集群

Jenkins是一个跨平台的持续集成和构建工具,在网上可以找到很多关于该工具的介绍,此处不再赘述。本文则是给出了一个相对简单的示例,介绍了如何在阿里云ECS上使用Docker部署和使用Jenkins集群。读者需要对以下Docker相关内容有一定的理解:

  1. Docker Machine
  2. Docker Machine ECS Driver
  3. Docker Swarm
  4. Docker Compose

由于国内连接DockerHub很慢且失败概率很高,建议首先通过阿里云开发者平台申请免费加速器,详见国内加速访问Docker相关资源一文。

后面涉及到的加速器地址均用https://<your_mirror_accelerate_address>.mirror.aliyuncs.com代替

创建ECS Swarm集群

使用Docker Machine创建ECS Swarm集群,需要满足如下先决条件:

  • 首先,安装配置Docker开发环境,如果是Windows或Mac用户请先安装docker-toolbox(版本要求大于等于1.9)
  • 其次,需要拥有阿里云的账号,并创建Access Key ID和Access Key Secret以供Docker Machine使用ECS开放API创建虚机

注意:测试过程中会创建相应的虚拟机,请保证账号余额充足并及时释放虚拟机

创建步骤:

  1. 基于DockerHub提供的Discovery API创建token,用于集群发现

    docker run swarm create
    
  2. 配置相关环境变量

    export ECS_ACCESS_KEY_ID=<your_access_key_id>
    export ECS_ACCESS_KEY_SECRET=<your_access_key_secret>
    export ECS_REGION=cn-beijing
    # Mirror of docker engine packages
    export MACHINE_DOCKER_INSTALL_URL=http://docker-mirror.oss-cn-hangzhou.aliyuncs.com/
    
  3. 使用docker-machine创建Swarm master。由于Jenkins会使用较多内存,默认的ecs.t1.small只有1G内存,运行起来会比较吃力。所以下面创建的机器均使用2G内存的ecs.s1.small实例

    docker-machine create \
    	--driver aliyunecs \
    	--aliyunecs-instance-type=ecs.s1.small \
    	--swarm \
    	--swarm-master \
    	--swarm-discovery=token://<token> \
    	--engine-opt registry-mirror=https://<your_mirror_accelerate_address>.mirror.aliyuncs.com \
    	swarm-ecs-master
    
  4. 使用docker-machine创建两个Swarm nodes

    docker-machine create \
    	--driver aliyunecs \
    	--aliyunecs-instance-type=ecs.s1.small \
    	--swarm \
    	--swarm-discovery=token://<token> \
    	--engine-opt registry-mirror=https://<your_mirror_accelerate_address>.mirror.aliyuncs.com \
    	swarm-ecs-node-1
    	
    docker-machine create \
    	--driver aliyunecs \
    	--aliyunecs-instance-type=ecs.s1.small \
    	--swarm \
    	--swarm-discovery=token://<token> \
    	--engine-opt registry-mirror=https://<your_mirror_accelerate_address>.mirror.aliyuncs.com \
    	swarm-ecs-node-2
    
    
  5. 确认集群信息

    eval $(docker-machine env --swarm swarm-ecs-master)
    docker info
    

    docker info将返回Swarm集群的信息,确认包含上面创建的三个机器信息

    Containers: 4
    Images: 3
    Role: primary
    Strategy: spread
    Filters: health, port, dependency, affinity, constraint
    Nodes: 3
     swarm-ecs-master: 115.29.52.89:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.018 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-32-generic, operatingsystem=Ubuntu 14.04.2 LTS, provider=aliyunecs, storagedriver=aufs
     swarm-ecs-node-1: 139.129.29.70:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.018 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-32-generic, operatingsystem=Ubuntu 14.04.2 LTS, provider=aliyunecs, storagedriver=aufs
     swarm-ecs-node-2: 139.129.29.75:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.018 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=3.13.0-32-generic, operatingsystem=Ubuntu 14.04.2 LTS, provider=aliyunecs, storagedriver=aufs
    CPUs: 3
    Total Memory: 3.053 GiB
    

使用Compose部署Jenkins

简单起见,本文直接使用eeacms/jenkins提供的配置和镜像部署Jenkins,如读者在安全和使用上有定制化的需求建议使用自行创建的镜像。部署详细步骤如下:

  1. 下载eeacms/jenkins,用于部署配置

    git clone https://github.com/eea/eea.docker.jenkins.git
    cd eea.docker.jenkins
    

    由于这里创建的机器资源有限,作为示例这里去掉docker-compose.yml配置中master下的postfix(邮件相关),即如下部分:

    links:
      - postfix
    
  2. 部署Jenkins master和slave

    docker-compose up -d master worker
    

    通过docker ps -a可以看到上述命令创建的3个容器,如下所示:

    CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                                                        NAMES
    eac52ef8834e        eeadockerjenkins_data   "sh"                     26 minutes ago      Exited (0) 19 minutes ago                                                                swarm-ecs-node-2/eeadockerjenkins_data_1
    d74cb435b1f6        eeacms/jenkins:slave    "/bin/sh -c /bin/jenk"   3 days ago          Up 19 minutes                                                                            swarm-ecs-node-2/eeadockerjenkins_worker_1
    0b8377eb1e58        eeacms/jenkins:master   "/usr/local/bin/jenki"   3 days ago          Up 19 minutes               139.129.29.75:50000->50000/tcp, 139.129.29.75:80->8080/tcp   swarm-ecs-node-2/0b8377eb1e_0b8377eb1e_eeadockerjenkins_master_1
    
  3. 初始化Jenkins master配置,确保slave连接到master。

    从上面返回的PORTS信息可以看到,这里Jenkins对外暴露的IP:端口为139.129.29.75:80。通过浏览器打开http://139.129.29.75:80,显示页面如下:

    Jenkins

    点击左侧列表中的“系统管理”,再选择“系统设置”。在显示的配置页面上无需修改,直接点击应用。过一小段时间后,即可看到左侧列表的“构建执行状态”显示为一个master和一个slave,如下所示:

    Jenkins Slave

示例:配置和使用Jenkins

本小节基于前面部署的Jenkins集群,给出了一个简单的自动构建示例,示例将根据触发条件自动从Github上克隆一份HelloWorld代码并编译、运行。配置步骤如下:

  1. 配置任务

    • 首先新建一个任务,选择“构建一个自由风格的软件项目” NewJob
    • 然后在接下来的详细配置页面配置“源码管理”,选择Git,并设置仓库地址为https://github.com/learnclang/1-helloworld.git GitRepo
    • 选择“构建触发器”为Poll SCM,设置“日程表”为H/5 * * * *,表示每5分钟检查一次代码是否有更新,如果有就执行接下来的构建操作 Trigger
    • 增加一个构建步骤,选择“Execute shell”,填写相关编译运行命令 BuildStep
    • 保存配置
  2. 执行任务

    完成配置后,等待约5分钟即可看到首次运行的结果(也可以选择手动触发执行任务) JobState

    通过Build History进入到任务“#1”的详情,然后点击左侧的“Console Output”,即可看到所有的执行结果 JobOutput