随着DevOps理念和敏捷理念的发展,咱们但愿经过自动化技术,加快项目的迭代。尤为是当使用微服务方案后,面临在大量的项目构建和部署工做,借助于jenkins的持续集成,能够快速把应用打包成docker镜像,实现自动部署。javascript
如图演示了如下的场景:css
我搭建的环境都是在本地,gitlab、jenkins、docker私有仓库都部署在本地,如下是操做步骤:java
使用docker拉取registry镜像,而后启动容器linux
docker run -d -p 5000:5000 -v ~/docker-registry:/tmp/registry registry
这样就能够在本地运行一个私有镜像注册中心,经过镜像名称前缀127.0.0.1:5000能够将镜像推送到这个地址git
拉取gitlab镜像,并启动github
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。docker
127.0.0.1 gitlab.bill.com
初次登陆能够修改密码,或者从新注册一个用户,我注册了一新用户,并在gitlab中建立了一个demo项目shell
建立了一个空项目后,而后根据github上的提示,将本地的git项目推送到gitlabruby
上传完后Gitlab项目以下:bash
安装jenkins
使用docker 下载jenkins镜像 jenkinsci/jenkins,并启动
docker run -d \
-p 8080:8080 \ -p 50000:50000 \ --name jenkins \ --link gitlab:gitlab.bill.com \ -u root \
-v /opt/data/jenkins:/var/jenkins_home \
-v /opt/data/jenkins/wars:/usr/share/jenkins \
-v /opt/data/jenkins/ref:/usr/share/jenkins/ref \
-v /usr/share/maven:/usr/local/maven \
-v /usr/lib/jvm/jdk1.8:/usr/local/jdk \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
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项目选项
注意:在Global Tool Configuration中配置Maven和Jdk,按道理能够配置经过配置JAVA_HOME 和MAVEN_HOME,分别指向/usr/local/jdk
,/usr/local/maven
,可是经过测试JAVA_HOME生效了,但MAVEN_HOME没成效,提示说没有找到maven,因此又经过自动化安装从新配置了maven
配置项目
新建一个项目,输入项目名称demo
,并选择Maven project
,而后在配置中作以下配置:
每隔5检查是否有新代码发布,若是有则自动执行构建
点开项目,点击左侧菜单build now
则立马开始一次构建,点开当前构建信息,左侧Console Output
中,可查看构建的明细
在上述的命令中,基本完成集成,可是尚未使用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的变量