通过Jenkins容器构建镜像(2)

目录

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

上篇文章我们构建了一个Jenkins镜像,本篇我们通过一个实例使用一下上篇构建的镜像,来组成一个持续集成环境。典型的持续集成环境包含的功能包括:从源代码仓库拉取代码,源代码的编译,对编译后的代码进行单元测试、集成测试及系统测试等,测试完成后对代码的打包。这些功能可以通过Jenkins的插件来实现。

本篇的代码使用了“Using Docker”一书当中的identidock代码。它是由python语言编写的简单的web应用程序。程序的基本功能是根据用户输入的用户名,生成一个专属于该用户的图标,如下图所示:
“Identicons”
完整的程序由三部分组成:一个由Flask框架编写的web程序,一个基于redis的缓存,以及一个生成图标的web服务。这三个部分都最终都通过容器提供服务,组成微服务的架构。程序的代码主要在第一个部分即web程序部分,另外两个部分都直接使用现成的容器镜像,即一个redis镜像和一个amouat/dnmonster镜像。整个程序可以通过docker-compose组成测试环境。程序的源代码在https://github.com/andyyoung01/ci-testing/tree/master/identidock

下面我们主要关注通过上篇构建的Jenkins镜像,来拉取程序源代码,运行此程序的单元测试,在测试完成后可以通过bash脚本将程序tagging,然后推送到镜像库中等待部署。
首先,下载上篇构建的Jenkins容器镜像:

[yangdong@centos7 ~]$ docker pull registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker

为了方便持久化Jenkins容器的配置等,我们创建一个数据容器:

[yangdong@centos7 ~]$ docker run --name jenkins-data \
> registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker \
> echo  "Jenkins Data Container"
Jenkins Data Container

下面创建Jenkins服务器容器,并且通过--volumes-from命令行参数使用前面创建的数据容器,来持久化JENKINS_HOME中的数据:

[yangdong@centos7 ~]$ docker run -d -v /var/run/docker.sock:/var/run/docker.sock \
> --volumes-from jenkins-data -p 8080:8080 --name jenkins \
> registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker
4f94030e525ea573c98a8d24df2540075f5a43f091890256fb7295d137192754

容器需要一段时间初始化,此时可以通过如下命令查看容器的初始化过程:

[yangdong@centos7 ~]$ docker logs -f jenkins
...

从上面的日志输出可以查询到Jenkins服务器的初始化密码,使用此密码登录Jenkins的web界面。经过一系列的初始化后,最终进入了Jenkins的web界面。下面开始通过此web页面创建创建持续集成环境:

  1. 点击“创建一个新任务”链接。
  2. 在item name中输入项目的名称,这里输入“identidock”,然后选择“构建一个自由风格的软件项目”,点击“ok”。
  3. 在“源码管理”部分,选择Git,然后输入您自己的代码库的Repository URL,这里直接使用Git Hub作为代码库,输入“https://github.com/andyyoung01/ci-testing.git”。“Branches to build”输入想要构建的分支,这里保留默认的master分支。这部分配置了该持续集成环境从哪里拉取程序源代码。
  4. 在“构建”部分,选择“增加构建步骤”,选择“Execute shell”。在“Command”文本框中,输入下面的bash脚本:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #Enter the working directory
    cd identidock
    #Default compose args
    COMPOSE_ARGS=" -f jenkins.yml -p jenkins "
    #Make sure old containers are gone
    sudo docker-compose $COMPOSE_ARGS stop
    sudo docker-compose $COMPOSE_ARGS rm --force -v
    #build the system
    sudo docker-compose $COMPOSE_ARGS build --no-cache
    sudo docker-compose $COMPOSE_ARGS up -d
    #Run unit tests
    sudo docker-compose $COMPOSE_ARGS run --no-deps --rm -e ENV=UNIT identidock
    ERR=$?
    #Run system test if unit tests passed
    if [ $ERR -eq 0 ]; then
    IP=$(sudo docker inspect -f {{.NetworkSettings.IPAddress}} jenkins_identidock_1)
    CODE=$(curl -sL -w "%{http_code}" $IP:9090/monster/bla -o /dev/null) || true
    if [ $CODE -eq 200 ]; then
    echo "Test passed - Tagging"
    HASH=$(git rev-parse --short HEAD)
    sudo docker tag jenkins_identidock andyyoung01/identidock:$HASH
    sudo docker tag jenkins_identidock andyyoung01/identidock:newest
    echo "Pushing"
    # sudo docker login -u your-username -p your-password registry.cn-beijing.aliyuncs.com
    # sudo docker push amouat/identidock:$HASH
    # sudo docker push amouat/identidock:newest
    else
    echo "Site returned " $CODE
    ERR=1
    fi
    fi
    #Pull down the system
    sudo docker-compose $COMPOSE_ARGS stop
    sudo docker-compose $COMPOSE_ARGS rm --force -v
    return $ERR

上面的部分配置了持续集成环境的构建和测试部分,以及测试成功后对代码的打包。
最后点击“保存”按钮保存所有设置,回到该项目的主页后,点击左边的“立即构建”链接开始构建项目。这里是手动触发的构建,当然还有许多其它触发构建的方式可以配置。
稍微看一下上面的bash脚本。它是通过docker-compose来设置测试环境的。在运行了单元测试后,如果没有问题,继续运行系统测试。系统测试也成功后,对镜像打标签,然后推送到镜像存储库中(这里没有实际推送上去)。
在web页面的“Console Output”链接下,可以看到构建过程中的日志输出,如下图:
“Console Output”
可见,这里我们通过bash脚本完成了大多数的持续集成步骤。实际上,Jenkins提供了许多插件,可以用来配置整个持续集成的Pipeline。