Springbootdockerjenkins持续集成实战操作
1 操作步骤1.1 docker安装
在虚拟机(vitualBox)下执行yum命令:
[root@centos-vagrant ~]# yum install docker
安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:
[root@centos-vagrant ~]# service docker start
查看镜像:
[root@centos-vagrant ~]# docker images
安装问题:
在执行yum install docker 命令是安装不成功的问题:
清除一下缓存:
[root@centos-vagrant ~]# yum clean all
[root@centos-vagrant ~]# yum makecache
再执行安装命令:
[root@centos-vagrant ~]# yum install docker
1.2 配置springboot
pom.xml配置:
<? xml version= "1.0" encoding= "UTF-8" ?>
< project xmlns= "http://maven.apache.org/POM/4.0.0"
xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi :schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
< modelVersion > 4.0.0 modelVersion >
< groupId > org.zz.springboot groupId >
< artifactId > springbootdemo artifactId >
< version > latest version >
< parent >
< groupId > org.springframework.boot groupId >
< artifactId > spring-boot-starter-parent artifactId >
< version > 1.5.2.RELEASE version >
parent >
< dependencies >
< dependency >
< groupId > org.springframework.boot groupId >
< artifactId > spring-boot-starter-web artifactId >
dependency >
< dependency >
< groupId > org.springframework.boot groupId >
< artifactId > spring-boot-starter-test artifactId >
< scope > test scope >
dependency >
dependencies >
< properties >
< project.build.sourceEncoding > UTF-8 project.build.sourceEncoding >
< docker.image.prefix > demo docker.image.prefix >
< spring.boot.version > 1.3.3.RELEASE spring.boot.version >
properties >
< build >
< plugins >
< plugin >
< groupId > org.springframework.boot groupId >
< artifactId > spring-boot-maven-plugin artifactId >
plugin >
< plugin >
< groupId > com.spotify groupId >
< artifactId > docker-maven-plugin artifactId >
< version > 0.4.3 version >
< configuration >
< imageName > ${docker.image.prefix}/${project.artifactId} imageName >
< dockerDirectory > src/main/docker dockerDirectory >
< resources >
< resource >
< targetPath > / targetPath >
< directory > ${project.build.directory} directory >
< include > ${project.build.finalName}.jar include >
resource >
resources >
configuration >
plugin >
plugins >
build >
project >
详见附录:pom.xml文件
创建dockerfile文件:
项目中创建"src/main/docker/Dockerfile"文件,如下:
配置dockerflie(用于生成镜像):
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD demo-1.0.jar app.jar
RUN sh -c "touch /app.jar"
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
解释下这个配置文件:
· VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
· 项目的 jar 文件作为 "app.jar" 添加到容器的
· ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间 ,添加一个系统属性指向 "/dev/urandom" 作为 Entropy Source
见附录Dockerfile 文件
编写 Spring Boot 应用:
package com.test.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication ;
import org.springframework.web.bind.annotation.RequestMapping ;
import org.springframework.web.bind.annotation.RestController ;
/**
* 主应用入口
* @author waylau.com
* @date 2016年3月19日
*/
@SpringBootApplication
@RestController
public class Application {
@RequestMapping ( "/" )
public String home() {
return "Hello Docker World."
+ "
Welcome to waylau.com" ;
}
public static void main(String[] args) {
SpringApplication. run (Application. class , args);
}
}
代码类见附件Application.java 1.3 构建 Docker Image1.3.1 虚拟机(vitualBox)挂载本地项目路径
启动虚机:
然后登录虚机:
[root@centos-vagrant ~]# ssh -p 2222 root@127.0.0.1
修改seetting文件:
[root@centos-vagrant ~]# cd /opt/apache-maven-3.5.0/conf/
修改地址: /media/sf_repository
1.3.2 生成镜像(mvn package docker:build)
重启虚机
输入命令:
[root@centos-vagrant ~]# df
进入到:
cd /media/sf_wlw_citic/workspace_task_scheduler_lose目录(也就是项目的目录):
执行命令:
[root@centos-vagrant ~]# mvn package docker:build
需要注意:
在执行mvn package docker:build ,先输入命令docker images 如果提示如下图,请先启动docker,启动命令:systemctl start docker,再执行mvn package docker:build 命令,不然构建镜像会失败。
执行后构建成为 docker镜像
输入命令:
[root@centos-vagrant ~]# docker images
可以看到demo/demo就是生成的镜像1.3.3 启动项目
运行 Docker Image(启动项目):
输入命令
[root@centos-vagrant ~]# docker run -p 8080:8080 -t demo/demo
这里指定端口为8080
运行成功:
浏览器访问:
输入http://localhost:8080/
发现访问不了,原因没有做端口映射,如下:
在虚机(vitualBox)里配置:
这个时候再输入http://localhost:8080/ 就可以访问了
1.4 杀掉已启动的镜像
先查看进程,杀掉已启动的进程:
[root@centos-vagrant ~]# docker ps
然后输入命令:
[root@centos-vagrant ~]# docker kill -s KILL bfbf6bcd0eb6
删除镜像:
先查询记录:
[root@centos-vagrant ~]# docker ps –a
可以看到有4个线程在启动,我们杀掉他们:
[root@centos-vagrant ~]# docker rm b427a2d85040 f91a2e1d0f86 0297d2ecbff3 bc5ca853a648
再查看:
线程都清掉了:
此刻执行:
[root@centos-vagrant ~]# docker images
1.5 Docker清除所有多余的docker镜像释放空间
执行:
[root@iz2ze215l4uqqv8jiei1aaz ~]# docker system prune -a –f
再执行,多余的都清除了
[root@iz2ze215l4uqqv8jiei1aaz ~]# docker images
1.6 本地虚机doc打包成tar上传至134服务器
打包镜像:
[root@centos-vagrant ~]# docker save -o /home/ hub.dashboardengine.tar hub.dashboardengine/hub.dashboardengine:latest
本地 打包成tar文件,通过ftp传输到134 服务器上
输入下列命令恢复镜像,自动加载到docker容器:
[root@centos-vagrant ~]# docker load -i /home/ hub.dashboardengine.tar
查看镜像:
[root@centos-vagrant ~]# docker images
启动项目:
[root@centos-vagrant ~]# docker run -d -p 9090:9090 -t hub.dashboardengine/hub.dashboardengine
注意:-d表示后台启动
输入地址访问:
http://10.247.32.134:9090/iot/getMsgCount
1.7 docker推送镜像至私服
把一个镜像push到私有仓库中
查看一下镜像
[root@centos-vagrant ~]# docker images
以demo/demo这个镜像为例。
接下来修改一下该镜像的tag,输入下面命令:
[root@centos-vagrant ~]# docker tag demo/demo registry.user.pcloud.citic.com/zxyw/cloud/demo/demo:tag
发现tag被修改了,接下来执行推送命令:
[root@centos-vagrant ~]# docker push registry.user.pcloud.citic.com/zxyw/cloud/demo/demo:tag
Get https://registry.user.pcloud.citic.com/v1/_ping : dial tcp 10.247.20.205:443: i/o timeout
这时会发现推送超时了,此时需要修改docker的配置文件,解决办法如下:
[root@centos-vagrant ~]# touch /etc/docker/daemon.json
[root@centos-vagrant ~]# vi /etc/docker/daemon.json
加入本地registry的地址, 如:
{ "insecure-registries":["registry.user.pcloud.citic.com"] }
需要注意:
registry.user.pcloud.citic.com为私服地址,这里我直接加在"live-restore":true的后面,然后加了一个逗号隔开。
添加主机host:
vi /etc/resolv.conf
nameserver 10.247.64.29
nameserver 10.247.64.28
vi /etc/hosts
10.247.20.205 registry.user.pcloud.citic.com
然后重启docker服务:
[root@centos-vagrant ~]# systemctl restart docker.service
执行推送命令:
[root@centos-vagrant ~]# docker push registry.user.pcloud.citic.com/zxyw/cloud/demo/demo:tag
3f5ead2a3e3b: Pushed
decb4e431a22: Pushed
aea4c1b2c226: Pushed
dcf909146faa: Pushed
23b9c7b43573: Pushed
tag: digest: sha256:a62b8f4cf6f446b81c5cb398499ef11e34bfe491a417e2959e2d05086768005e size: 1375
推送成功,1.7.1 下载私服镜像
下载私服镜像:
[root@centos-vagrant ~]# docker pull registry.user.pcloud.citic.com/zxyw/cloud/demo/demo:tag
下载成功,查看一下镜像
[root@centos-vagrant ~]# docker images
启动:
[root@centos-vagrant ~]# docker run -p 8081:8081 -t registry.user.pcloud.citic.com/zxyw/cloud/demo/demo:tag
1.8 docker-compose插件安装
输入下面命令安装插件:
[root@centos-vagrant ~]# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
安装完成后,执行运行权限:
[root@centos-vagrant ~]# sudo chmod +x /usr/local/bin/docker-compose
查看版本:
[root@centos-vagrant ~]# docker-compose --version
可以看到为当前为1.12.0版本,则安装成功。
1.8.1 创建test.yml文件
把test.yml文件放入/home/vagrant/composetest目录下:
复制下面内容到test.yml文件里:
srvmgt-app:
image: demo/demo
hostname: service
volumes:
- /tmp
ports:
- 9090:9090
environment:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.username: mysql
jdbc.password: mysql123
jdbc.url: jdbc:jdbc:mysql://10.247.33.42:3306/iot
restart: always
1.8.2 启动docker-compose
[root@centos-vagrant ~]# docker-compose up
需要注意:
启动docker-compose,需要在yml文件存在的当前目录下执行,例如:我yml文件在/home/vagrant/composetest这个目录
ps查看:
[root@centos-vagrant ~]# docker ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f66814e2b624 demo/demo "sh -c "java $JAVA_OP" 15 minutes ago Up 15 minutes 0.0.0.0:9090->9090/tcp composetest_srvmgt-app_1
浏览器访问:
http://localhost:9090/test/
1.9 jenkins持续集成1.9.1 jenkins安装
本文直接使用war包安装
下载地址:https://jenkins-ci.org/content/thank-you-downloading-windows-installer
war包有两种安装方法
方法一
下载jenkins.war, 拷贝到D:JavaTooljenkins()下,然后运行java -jar jenkins.war. (注意需要先安装JDK,然后设置JAVA_HOME环境变量且将%JAVA_HOME%bin加入到PATH环境变量中)
运行如下:
访问http://localhost:8080 , jenkins的主界面如下:
方法二
把Jenkins 1.409.1版解压,把得到的war包直接扔到tomcat下,启动tomcat,Jenkins就安装完毕,访问http://localhost:8080/jenkins
这里采用方法二方式,直接放tomcat里启动。
1.9.2 构建maven项目
构建maven项目前,把相关的插件安装上,如:
增加需要用到的插件:Deploy to container Plugin、GIT plugin、Maven Integration plugin、Publish Over SSH、SSH Slaves plugin、Subversion Plug-in,请用以下示范方法添加安装需要的插件
调整相关系统设置项,请自行找出列出的设置项并填写相关内容
jdk配置:
配置好点击save保存。1.9.3 配置远程服务器
配置远程服务器,上传镜像1.9.4 新建maven项目集成至远程服务器
配置git路径,从git的master下直接检出:
执行本地脚本:
deploy.sh文件在项目的根目录下,deploy.sh文件见附件2 ,如下图:
配置远程上传脚本命令:
hub.admin.engine.yml文件与Dockerfile文件见附件2 ,目录都在项目的根目录:
保存后:
点击项目:
点击立即构建,持续集成就开始了
这里构建成功:
注意
构建的项目地址在:
[root@centos-vagrant ~]# cd ~/.jenkins/workspace/
或者输入:
[root@centos-vagrant ~]# cd /root/.jenkins/workspace
可以看到构建的所有项目,如下:
登录服务docker imags查看镜像命令可以看到刚刚上传的镜像:
docker ps命令可以看到项目也启动了:
浏览器访问:
http://10.247.32.134:8093/iot/channelManager/getChannelPageList
1.9.5 Jenkins部署docker报错问题
错误如下:
error pulling image configuration: Get http://registry.oss-cn-beijing-zx-d01-a.pcloud.citic.com/docker/registry/v2/blobs/sha256/46/46df8683ac8fea45852a4b218a1c611b08fb1195bafa790fe9e2eec8b2867662/data?Expires=1499156631&OSSAccessKeyId=vIvJI9Xwy0M87Qb8&Signature=qaQOMawAE1a7jbQ2P9N2ahIyDVw%3D : dial tcp: lookup registry.oss-cn-beijing-zx-d01-a.pcloud.citic.com on 100.100.2.136:53: no such host
找不到主机映射问题:no such host
解决办法:
vi /etc/resolv.conf
添加相关的ip地址
1.9.6 Jenkins配置部署发送邮件通知
步骤1:
步骤2:Jenkins Location下:
步骤3:Extended E-mail Notification下:
步骤4:
步骤5:jenkins点击部署的项目,如下:
点击配置:
选择:下拉选择:
在Project Recipient List里加入邮箱即可,多个用逗号隔开,如1@126.com,2@126.com
步骤6:最后点开:
选择:
保存就可以了。1.9.7 虚拟机(virtualBox)登录jenkins
先安装vagrant:
进入到varant 的目录:
C:Usersuisftechvagrant
启动:
vagrant up
登录:
ssh -p 2222 root@127.0.0.1
默认密码:vagrant
修改C:UsersuisftechvagrantVagrantfile 文件:
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
vb.name= "centos.base"
登录成功后:
启动tomcat并且启动jenkins:
注意:将jenkins.war包放到tomcat的webapps下:
启动完需在virtualBox配置端口映射:
这里做了端口映射才能正常访问,登录jenkins:
http://127.0.0.1:8080/jenkins
如此登录成功1.10 Jenkins持续集成至阿里云服务1.10.1 新建项目
配置好git路径:
执行脚本:
注意:
dashboardengine.sh脚本放在项目的根目录,dashboardengine.yml也是在同目录下,如下图:
脚本详细见附录3 1.10.2 集成至阿里云注意问题
集成之前需先在阿里云服务里建立appname,如:
appname="hub-dashboardengine-app"
需要先将hub-dashboardengine-app添加阿里云服务后端,再做集成。 1.11 Linux定时任务1.11.1 Linux定时清理过时的docker镜像
1. 键入 crontab -e 编辑crontab服务文件,如下:
30 23 * * * /bin/sh /home/user/scheduler/cleardockerimg.sh //每晚的11:30
注意:没有安装crontab 键入yum install crontabs安装。
2. 查看该用户下的crontab服务是否创建成功, 用 crontab -l 命令
3. 启动crontab服务
一般启动服务用 /sbin/service crond start 若是根用户的cron服务可以用 sudo service crond start, 这里还是要注意 下 不同版本Linux系统启动的服务的命令也不同 ,像我的虚拟机里只需用 sudo service cron restart 即可,若是在根用下直接键入service cron start就能启动服务
这里本地启动是: /bin/systemctl start crond.service
这里本地停止是: /bin/systemctl stop crond.service
4. 查看服务是否已经运行用 ps -ax | grep cron
5. 删除任务调度工作
crontab -r //删除所有任务调度工作
6. 删除docker镜像shell脚本:
#!/bin/sh
docker rmi $(docker images | grep dev-)