docker + jenkins + git + maven自动化构建与部署

准备工作

  1. 安装好最新docker
  2. docker 分别pull 以下镜像 jenkins:2.0-beta-1 tomcat mysql(mysql只用来做测试项目的数据库,有其它数据库服务器的可以不下载)
  3. 下载maven 解压mkdir -p /dockerworkspace/maven && tar zxf apache-maven-3.3.9-bin.tar.gz -C /dockerworkspace/maven
  4. 下载jdk tar zxf jdk*.tar.gz -C /dockerworkspace/java/ && mv /dockerworkspace/java/jdk* /dockerworkspace/java/jdk

本教程所有工具和数据目录存放于/dockerworkspace目录下

安装jenkins

1
2
3
4
5
6
7
docker run -d --name jenkins
-p 8080:8080
-p 50000:50000
-v /dockerworkspace/jenkins:/var/jenkins_home
-v /dockerworkspace/maven/apache-maven-3.3.9:/usr/local/maven
-v /dockerworkspace/java/jdk:/usr/local/jdk
jenkins:2.0-beta-1

访问jenkins:8080(jenkins改成服务器地址) ,然后输入以下查看到的密码Unlock Jenkins

1
cat /dockerworkspace/jenkins/secrets/initialAdminPassword

Customize Jenkins步骤时选择左边的Install suggested plugins

等待插件安装完成, 然后填写管理员信息

配置Jenkins

  1. 登陆jenkins, 进入系统管理-插件管理-可选插件 搜索ssh plugin 然后安装, 安装界面选择安装好后重启jenkins

  2. 进入系统管理-系统管理-可选插件 - SSH remote hosts 填写部署tomcat项目的host信息

  3. 设置邮件发送服务器

    1. 进入系统管理-系统管理-Jenkins Location系统管理员邮件地址
    2. 邮件通知 中QQ企业邮箱设置如下(发件人的邮箱地址要和上面系统管理员邮件地址一致不然会报错)
  4. JDK配置

    1. 进入系统管理-Global Tool Configuration - jdk
    2. 点新增JDK,别名:jdk JAVA_HOME填写/usr/local/jdk(我截图里用的是ibm家的jdk)
  5. Maven配置

    1. 进入系统管理-Global Tool Configuration - Maven
    2. 点新增Maven,别名:maven MAVEN_HOME填写/usr/local/maven

新建测试项目

本教程中git管理端用的是gogs

  1. 创建jenkins中的maven 项目

    1. 在jenkins首页点击新建选择构建一个maven项目 填写项目名称test_tomcat

      (如果没有这项请安装插件Maven Integration plugin)

    2. 源码管理中选择git, 填写项目的git信息(Credentials点新增可以添加git的认证信息,支持帐户名密码,ssh key 等方式. 源码浏览器在构建项目时的修改记录可以直接连接到git平台)

  2. 构建触发器

    1. 身份验证令牌 可以随意填写一个任意长度的字符串, 也可以填写uuid之类的, 并记录下来, 以后会用到
  3. Post Steps (部署部份配合主机上的一人脚本使用,脚本内容往下看)

    1. 选择Run only if build succeeds只在构建成功时运行
    2. Add post-build step 选择Execute shell script on remote host using ssh 然后选择服务器和执行脚本信息
  4. 在gogs上创建git hook (这一步在gitlab或github应该也有相应的方法)
    1. 进入上面构建的git项目首页-仓库设置-管理git钩子-post-update
    2. 填写以下脚本 (请把环境变量改为自己相应的服务器信息)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #!/bin/sh
      # 请修改以下环境变量

      SERVER=http://127.0.0.1:8080 #jenkins服务器地址
      TOKEN=jenkins1270018080hosttesttomcat #jenkins项目的 身份验证令牌
      JENKINS_USER=admin #jenkins用户
      JENKINS_PWD=admin # jenkins用户密码
      JENKINS_PROJECT=test_tomcat # jenkins项目名

      echo "Startting Build War File On Jenkins's Server"
      echo "Setting Token On The Jenkins's Server......"
      CRUMB=$(curl -s --user $JENKINS_USER:$JENKINS_PWD \
      $SERVER/crumbIssuer/api/xml?xpath=concat\(//crumbRequestField,%22:%22,//crumb\))
      echo "Trigger Jenkins's Server Start Building......"
      curl -s --user $JENKINS_USER:$JENKINS_PWD -H "$CRUMB" $SERVER/job/$JENKINS_PROJECT/build?token=$TOKEN
      echo "Jenkins's Server Build Success!"

tomcat 服务器配置

1
2
3
4
5
6
7
docker run -d
--name test_tomcat
-p 8888:8080
-v /dockerworkspace/tomcat/webapps:/usr/local/tomcat/webapps
-v /dockerworkspace/java/jdk:/usr/local/jdk
-e "JAVA_HOME=/usr/local/jdk"
tomcat

测试用mysql服务器

1
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=admin -d mysql

创建一个脚本文件vim /dockerworkspace/tomcat/deploy.sh 内容如下

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
#!/bin/sh
SERVER=http://127.0.0.1:8080 #jenkins服务器地址
TOKEN=jenkins1270018080hosttesttomcat #jenkins项目的 身份验证令牌
JENKINS_USER=admin #jenkins用户
JENKINS_PWD=admin # jenkins用户密码
JENKINS_PROJECT=test_tomcat # jenkins项目名
MAVEN_GROUPID=net.lxy520.test_tomcat #maven项目pom.xml的groupId
MAVEN_NAME=ROOT #maven项目pom.xml的groupId
MAVEN_VERSION=1.2.6 #maven项目pom.xml的groupId
CONTAINER=test_tomcat #tomcat docker 的容器id或名称

echo "设置Jenkins服务器为$SERVER"
echo "向服务器请求token"
CRUMB=$(curl -s --user $JENKINS_USER:$JENKINS_PWD \
$SERVER/crumbIssuer/api/xml?xpath=concat\(//crumbRequestField,%22:%22,//crumb\))
echo "下载war文件......"
curl -s --user $JENKINS_USER:$JENKINS_PWD -H "$CRUMB" "$SERVER/job/$JENKINS_PROJECT/lastStableBuild/${MAVEN_GROUPID}\$${MAVEN_NAME}/artifact/$MAVEN_GROUPID/$MAVEN_NAME/$MAVEN_VERSION/${MAVEN_NAME}-${MAVEN_VERSION}.war" -o ${MAVEN_NAME}-${MAVEN_VERSION}.war
echo "下载完成!"
CURRENT=`pwd`
echo "临时存放路径:$CURRENT/${MAVEN_NAME}-${MAVEN_VERSION}.war"
echo "暂停Tomcat服务..."
docker stop $CONTAINER
echo "覆盖项目..."
rm -rf /dockerworkspace/tomcat/webapps/ROOT.war /dockerworkspace/tomcat/webapps/ROOT
mv ${MAVEN_NAME}-${MAVEN_VERSION}.war /dockerworkspace/tomcat/webapps/ROOT.war
echo "重启Tomcat服务..."
docker start $CONTAINER
echo "Tomcat启动成功."

测试

在本地项目中git push, 查看jenkins会不会自动构建,然后检查docker中的容器是否正确部署