ITPub博客

基于Jenkins+Git+Docker的持续集成(下)

原创 作者:junsansi 时间:2017-03-03 09:53:13 1 删除 编辑

    

    接上篇  基于Jenkins+Git+Docker的持续集成(上)

    三、配置docker宿主机

在我们的这套解决方案里,是在Jenkins中通过SSH调用docker宿主机中的脚本实现镜像和容器的管理维护,因此,这里我们首先创建好相关的目录和脚本文件,以便在后续的部署环境,能够直接使用。

提示:以下操作是在docker宿主机端执行,如非特别说明,均是在root用户下操作。

首先创建目录

root@docker01:~# mkdir /data/dockerfiles/scripts -p

编辑维护用的脚本文件:

root@docker01:~# vi /data/dockerfiles/scripts/deploy.sh

增加下列内容:

#!/bin/bash

############################################

# this script function is :               

# deploy new docker container            

#                                         

# USER        YYYY-MM-DD - ACTION         

# junsansi    2016-01-25 - CREATED       

#                                         

############################################ 

parasnum=5

# function

help_msg()

{

cat << help

+----------------------------------------------------+

+ Error Cause:

+ you enter $# parameters

+ the total paramenter number must be $parasnum

+ 1st :DOCKER_NAME

+ 2nd :PROJECT_NAME

+ 3rd :PROJECT_VERSION

+ 4th :SOURCE_PORT

+ 5th :DESTINATION_PORT

+----------------------------------------------------+

help

} 

# ----------------------------------------------------

# Check parameter number

# ----------------------------------------------------

if [ $# -ne ${parasnum} ]

then

        help_msg

        exit

fi 

# ----------------------------------------------------

# Initialize the parameter.

# ----------------------------------------------------

DOCKER_NAME=$1

PROJECT_NAME=$2

PROJ_VERSION=$3

SPORT=$4

DPORT=$5 

PROJ_VERSION=${PROJ_VERSION/"origin/"/""} 

DOCKER_FILE="/data/dockerfiles/${DOCKER_NAME}/Dockerfile"

DOCKER_FILE_DIR=/data/dockerfiles/${DOCKER_NAME}

if [ ! -d ${DOCKER_FILE_DIR} ]; then

        mkdir -p ${DOCKER_FILE_DIR}

fi 

# ----------------------------------------------------

# check docker images

# ----------------------------------------------------

DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'`

if [ -n "${DOCKER_IMAGE}" ]; then

        # check docker container

        for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'`

        do

                echo "Stop container: ${dc}"

                /usr/bin/docker stop ${dc}

                # delete while docker container was exists

                echo "##Delete exists Container_Id: "${dc}

                /usr/bin/docker rm ${dc}

        done 

        # delete while docker image was exists

        echo "##Delete exists Image: "${DOCKER_IMAGE}

        /usr/bin/docker rmi ${DOCKER_IMAGE}

fi

echo "" 

# ----------------------------------------------------

# Init dockerfile

# ----------------------------------------------------

echo "**Init dockerfile start: "${DOCKER_FILE}

echo "FROM tomcat" > ${DOCKER_FILE}

echo 'MAINTAINER junsansi "junsansi@sina.com"' >> ${DOCKER_FILE}

echo "ADD *.war /usr/local/tomcat/webapps/${PROJECT_NAME}.war" >> ${DOCKER_FILE}

echo "EXPOSE 8080" >> ${DOCKER_FILE}

echo "CMD /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out" >> ${DOCKER_FILE}

cat ${DOCKER_FILE}

echo "**Init dockerfile end." 

# ----------------------------------------------------

# Build dockerfile

# ----------------------------------------------------

cd ${DOCKER_FILE_DIR}

rm *.war -rf

mv /data/dockerfiles/war/${DOCKER_NAME}/*.war ./

echo ""

echo "##Build dockerfile for "${DOCKER_NAME}

/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} . 

# ----------------------------------------------------

# Run docker container

# ----------------------------------------------------

echo ""

echo "##Running docker container: "${DOCKER_NAME}

/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION} 

#/usr/bin/docker run ${cmd} 

echo ""


    该脚本就进行详细介绍,语法比较简单,即便是对
shell不熟悉的同学,只要认真阅读也应能理解。

为该脚本增加运行权限:

root@docker01:~# chmod +x /data/dockerfiles/scripts/deploy.sh


     修改属主为
docker用户:

root@docker01:~# chown docker:docker /data/dockerfiles -R

 

    四、配置Jenkins应用环境

    首先进行全局配置:系统管理->Global Tool Configuration

    这里请大家根据实际情况配置:

    Maven Configuration
JDK
Git
Maven

具体的配置过程,界面已经非常直观,这里就不演示了。


    接下来要配置
SSH Servers。在本例中,我们要部署和运行docker容器的服务器是172.19.10.157,因此我们需要在系统设置中,配置通过SSH连接该服务器的访问用户名和密码,如下所示:


      系统管理
->系统设置->Publish over SSH

 


如果有多个服务器可用于发布,那么可以一次性都添加进去。 

    
五、Jenkins中创建和配置发布任务

    
Jenkins主界面右侧,点击“创建一个新任务”,在页面上输出项目名称(名称完全由操作者自定义),这里我们选择构建的是MAVEN项目:

在《通用设置》中操作如下:

选中丢弃旧的构建->保持构建的最大个数为10个;

选中参数化构建->选择Git Parameter->定义名称为release_branch,因为我们内部应用的发布管理都是基于分支的,因此选择参数类型为Branch

在《源码管理》中选择Git,根据实际情况指定仓库地址和鉴权证书,Branches那里修改为前面定义的$release_branch参数名称,具体设置如下图所示:

在《Build》设置中设置Goals and options选项值为:clean package -DskipTests=true,当然,这里您也可以根据您的项目实际情况进行设置:

在《构建后操作》中选择“Send build artifacts over SSH”,通过SSH发送文件到远端,并执行远端服务器命令,配置如下:

 
      配置操作完成之后点击左下角“保存”按钮。

点击左侧“Build with Parameters”,在随后出现的页面中选择要构建项目的版本,这里目前仅只有一个版本,不管,先选中它,而后点击开始构建:


     执行部署,我们可以通过当前正在构建任务的“Console Output”来获取任务的执行情况,例如,本次构建过程中的输出日志摘要如下:


     通过日志可以看到,容器创建和启动均已成功,接下来就可以通过浏览器访问该
docker中运行的工程了:

竣工!

    六Jenkins中将同一个服务发布到多个容器

如果你有多个工程,需要部署到不同的服务器,那么参照前面2-6小节中的步骤,对目标服务器和项目进行适当配置即可。

如果你有一个工程,需要以集群方式部署到多个服务器,那么参照前面4-5小节中的步骤,新增SSH服务器,而后在“构建后操作”中加入对该服务器的部署步骤即可。

如果你有一个工程,需要以集群方式部署多个容器,那么我来演示一下嘛,尽管我们当前没有多余的服务器,不过通过docker宿主机演示这样的过程还是没什么问题。

我们仍然进入到“first_docker_project”这个项目的配置页面,在“构建后操作”设置中,点击“Add Server”新增一台服务器,配置如下 :

如果是部署到不同的服务器,那么此处只需要选择适当的SSH Server即可,不过当前的演示环境只有一台服务器,那么SSH Server还是172.19.10.157,只是要对Remote DirectoryExec command两项配置中的参数做适当调整,以避免路径冲突。

修改完成后点击保存,然后再次尝试构建,注意观察日志,等看到SUCCESS提示之后,同一个项目就被成功发布到两个容器中了。

登录到docker宿主机查看一下容器的状态:

docker@docker01:~$ docker ps -a

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                     NAMES

ed763842395e        first_docker_proj02:master   "/bin/sh -c '/usr/..."   18 seconds ago      Up 17 seconds       0.0.0.0:12000->8080/tcp   first_docker_proj02_d1

6a907dfae707        first_docker_proj01:master   "/bin/sh -c '/usr/..."   19 seconds ago      Up 18 seconds       0.0.0.0:11000->8080/tcp   first_docker_proj01_d1

docker@docker01:~$ docker images

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE

first_docker_proj01   master              4adbac00f9ed        21 seconds ago      355 MB

first_docker_proj02   master              4adbac00f9ed        21 seconds ago      355 MB

tomcat                latest              99765a0d7f44        2 days ago          355 MB


    您瞧,通过Jenkins结合Docker来进行部署,就是这么简单。(完)

    转载请联系作者!更多内容请扫描二维码,关注【IT营养师】!
下一篇: 没有了~
请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-21

  • 博文量
    646
  • 访问量
    4067863