美文网首页持续集成后端资源精选Docker
基于Docker+Jenkins+Gitlab搭建持续集成环境

基于Docker+Jenkins+Gitlab搭建持续集成环境

作者: billJiang | 来源:发表于2017-08-14 20:06 被阅读7386次

    最近使用docker+jenkins+gitlab搭建了持续集成环境,原理如下图所示(没有画图,引用了http://www.jianshu.com/p/358bfb64e3a6的图):

    随着DevOps理念和敏捷理念的发展,我们希望通过自动化技术,加快项目的迭代。尤其是当使用微服务方案后,面临在大量的项目构建和部署工作,借助于jenkins的持续集成,可以快速把应用打包成docker镜像,实现自动部署。

    持续集成.png

    如图演示了以下的场景:

    • 开发者向自己的gitlab网站提交了代码
    • jenkins通过定时任务检测到了代码有变成,执行自动化构建过程
    • jenkins在自动化构建脚本中调用docker命令将构建好的镜像push 私有镜像注册中心
    • 同时,jenkins也可以直接执行remote shell启动构建好的容器
    • 构建失败或者成功,可以及时将结果推送给相关人员,比如测试人员,安排测试
    • 服务端可以手动通过docker命令,从镜像仓库中心拉取镜像,进行手动部署

    我搭建的环境都是在本地,gitlab、jenkins、docker私有仓库都部署在本地,以下是操作步骤:

    搭建docker私有仓库

    使用docker拉取registry镜像,然后启动容器

    docker run -d -p 5000:5000 -v ~/docker-registry:/tmp/registry registry
    

    这样就可以在本地运行一个私有镜像注册中心,通过镜像名称前缀127.0.0.1:5000可以将镜像推送到这个地址

    搭建gitlab

    拉取gitlab镜像,并启动

    docker pull gitlab/gitlab-ce
    
    sudo docker run --detach \
    --hostname gitlab.bill.com \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume ~/gitlab/config:/etc/gitlab \
    --volume ~/gitlab/logs:/var/log/gitlab \
    --volume ~/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest
    

    因为部署在本地,又指定了gitlab.bill.com作为域名,所以在/etc/hosts配置下,这样可以通过域名访问gitlab。

    127.0.0.1 gitlab.bill.com
    

    初次登录可以修改密码,或者重新注册一个用户,我注册了一新用户,并在gitlab中创建了一个demo项目

    demo.png

    创建了一个空项目后,然后根据github上的提示,将本地的git项目推送到gitlab


    Gitlab_http.png

    上传完后Gitlab项目如下:


    Demo sourcecode.png

    搭建jenkins

    安装jenkins
    使用docker 下载jenkins镜像 jenkinsci/jenkins,并启动

    docker run -d \
    -p 8080:8080 \
    -p 50000:50000 \
    --name jenkins \
    --link gitlab:gitlab.bill.com \
    -u root \
    -v ~/jenkins:/var/jenkins_home  \
    -v /usr/share/maven:/usr/local/maven \
    -v /usr/lib/jvm/jdk1.8:/usr/local/jdk 
    jenkinsci/jenkins:latest
    

    8080端口是jenkins的端口,5000端口是master和slave通信端口(没错,jenkins可以部署集群,在本次中没有配置)
    并将宿主机maven和jdk映射到对应的容器目录上,同时通过配置--link连接gitlab,因为要从gitlab下代码。

    初次启动的时候,可以通过docker logs -f jenkins查看控制台的密码,通过这个密码登录系统,执行创建用户等操作

    安装插件
    启动项目后,下载所需的插件(尤其要下载Git Plugin和Maven Intergration Plugin插件),如果缺少Maven Integration Plugin插件,在创建job时,不会有新建一个maven项目选项

    jenkins plugin.png

    注意:在Global Tool Configuration中配置Maven和Jdk,按道理可以配置通过配置JAVA_HOME 和MAVEN_HOME,分别指向/usr/local/jdk,/usr/local/maven,但是通过测试JAVA_HOME生效了,但MAVEN_HOME没成效,提示说没有找到maven,所以又通过自动化安装重新配置了maven

    自动安装maven.png

    配置项目
    新建一个项目,输入项目名称demo,并选择Maven project,然后在配置中做如下配置:

    General Info.png Source Code Management.png Build Triggers.png

    每隔5检查是否有新代码发布,如果有则自动执行构建

    Pre Steps.png Build Settings.png

    点开项目,点击左侧菜单build now则立马开始一次构建,点开当前构建信息,左侧Console Output中,可查看构建的明细

    Console Output.png

    集成docker部署

    在上述的命令中,基本完成集成,但是还没有使用docker,构建的jar包也无法推送到测试环境或者生产环境,我们可以通过如下思路解决:

    在项目生成jar包之后,调用项目中Dockerfile文件,使用docker构建镜像,将镜像推送到私有镜像中心的同时,使用该镜像启动一个容器(启动前删除同名容器)

    代码如下所示:

    # 定义变量
    API_NAME="demo"
    API_VERSION="0.0.1"
    API_PORT=58080
    IMAGE_NAME="127.0.0.1:5000/billjiang/$API_NAME:$BUILD_NUMBER"
    CONTAINER_NAME=$API_NAME-$API_VERSION
    
    # 进入target 目录复制Dockerfile 文件
    cd $WORKSPACE/target
    cp classes/Dockerfile .
    
    #构建docker 镜像
    docker build -t $IMAGE_NAME .
    
    #推送docker镜像
    docker push $IMAGE_NAME
    
    #删除同名docker容器
    cid=$(docker ps | grep "$CONTAINER_NAME" | awk '{print $1}')
    if [ "$cid" != "" ]; then
       docker rm -f $cid
    fi
    
    #启动docker 容器
    docker run -d -p $API_PORT:8080 --name $CONTAINER_NAME $IMAGE_NAME
    
    #删除 Dockerfile 文件
    rm -f Dockerfile
    

    以上未声明的变量$WORKSPACE为jenkins的变量

    Post Steps中通过配置以上Execute shell命令,并不能成功执行,发现在Console Output中出现docker not found 的错误,是因为jenkins 的容器没有安装docker。所以解决这个问题要么jenkins不使用docker容器安装,要自己安装一个带有docker的jenkins容器,当然还有docker in docker的类似解决方案,本人觉得独立安装jenkins也许算的上一种比较好的方案。

    我的个人博客地址为http://code.admineap.com 欢迎访问

    相关文章

      网友评论

      • bdeb7a0780de:同学 你的Dockerfile 能否共享下啊?
      • cooling2016:大神,你的图一用什么工具画的
      • 27dfd545cb75:老哥 没看到你最后的docker 问题 搞了两天到现在没解决:cry::cry::cry::cry::cry:
      • 活这么大就没饱过:启用jenkins时候的指令第三行的端口号是5000还是50000?
      • billJiang:如果是 jenkins连接不上gitlab,在使用docker启动jenkins时配置--link
        1yy:恩.使用啦--link 不行,后来添加啦gitlab.rb-->gitlab_rails['gitlab_ssh_host'] = '192.168.1.1' & external_url 'http://192.168.1.1' 就可以提交代码啦,
        现在有报啦一个 "pom.xml' 没有这个文件 错误 ,maven 我也是在jenkins里面安装的,但应该还是????
      • 1yy:问下,我用根据你的配置无法上传gitlab ,请问如何解决...报错如下
        ssh: connect to host gitlab.test.com port 22: Connection timed out
        fatal: Could not read from remote repository.
        Please make sure you have the correct access rights

      本文标题:基于Docker+Jenkins+Gitlab搭建持续集成环境

      本文链接:https://www.haomeiwen.com/subject/ijyurxtx.html