随着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 /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项目选项

 
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的变量

基于Docker+Jenkins+Gitlab搭建持续集成环境的更多相关文章

  1. Jenkins+Gitlab搭建持续集成(CI)环境

    利用Jenkins+Gitlab搭建持续集成(CI)环境 Permalink: 2013-09-08 22:04:00 by hyhx2008in intern tags: jenkins gitla ...

  2. 基于 Jenkins 快速搭建持续集成环境--转

    源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...

  3. Jenkins 快速搭建持续集成环境

    持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域 ...

  4. 基于 Jenkins 快速搭建持续集成环境

      什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火 ...

  5. jenkins + Git 搭建持续集成环境

    持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前 ...

  6. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...

  7. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...

  8. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境

    前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...

  9. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境

    使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一) 2015-01-14 20:28 by 飘扬的红领巾, 4322 阅读, 5 评论, 收藏, 编辑 ...

随机推荐

  1. 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)

    摘要: 数据挖掘.机器学习和推荐系统中的评测指标—准确率(Precision).召回率(Recall).F值(F-Measure)简介. 引言: 在机器学习.数据挖掘.推荐系统完成建模之后,需要对模型 ...

  2. intllij IDE 中git ignore 无法删除target目录下的文件

    原因: git的本地忽略设置必须保证git的远程仓库分支上没有这个要忽略的文件,如果远程分支上存在这个文件,本地在设置ignore 这个文件,将会失败,无法commit忽略.(有人说是git的bug, ...

  3. Rocket MQ 1 - 用

    参考 http://www.iocoder.cn/categories/RocketMQ/ ; https://www.jianshu.com/nb/16219849 首先上启动方法,分别启动name ...

  4. 【原】 The Linux Command Line - Permissions

    id - display user identity chmod - umask -

  5. Shiro HashedCredentialsMatcher 认证匹配

    Shiro 提供了用于加密密码和验证密码服务的 CredentialsMatcher 接口,而 HashedCredentialsMatcher 正是 CredentialsMatcher 的一个实现 ...

  6. c++ 面试题(操作系统篇)

    1,消息队列: https://kb.cnblogs.com/page/537914/ 2,fork中父进程和子进程的资源联系: https://blog.csdn.net/weixin_422506 ...

  7. mybatis多表关联

    1.比如我有两个一个是菜单表t_menu,一个是权限表t_jurisdiction.表结构如下: 2.我想要将这两个表关联,查询特定的role_id下的菜单情况,这也是我们经常用在权限管理系统中的做法 ...

  8. [leetcode]265. Paint House II粉刷房子(K色可选)

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  9. [leetcode]54. Spiral Matrix螺旋矩阵

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  10. Django formset

    一 什么是formset Form组件或ModelForm用于做一个表单验证而formset是用于做多个表单的验证组件,用于做批量操作 二 formset的使用方法 1 设置form信息 class ...