整体思路
- docker搭建jenkins
- docker单独安装jdk、tomcat、maven等
- jenkins使用slave调用其它docker主机完成jdk、tomcat、maven等操作
- 也可以使用外挂的方式将jdk等基础资源装在主机上
- 使用registry搭建docker私库
- jenkins通过外挂方式调用docker
- jenkins通过生成image来实现容器化持续集成
安装jenkins
docker search jenkins
docker pull jenkins/jenkins
docker images
sudo docker run -d --name enkins -p 8081:8080 -p 50000:50000 --volume $PWD/jenkins:/var/jenkins_home jenkins
chown -R 1000 jenkins
docker start jenkins
docker ps
修改端口
启动配置
访问地址:http://47.98.226.232:8081
宿主机:
cd jenkins/
[root@guoyasoft jenkins]# find ./ -name initialAdminPassword
cat ./secrets/initialAdminPassword
安装插件
设置管理用户(所有项都必填)
查看日志:docker logs jenkins
更新插件源
jenkins镜像地址列表
http://mirrors.jenkins-ci.org/status.html
选择一个进入
安装maven插件
安装deploy插件
安装git插件
默认已安装
Maven插件 Maven Integration plugin
发布插件 Deploy to container Plugin
git插件 Git plugin
发送邮件插件 Email Extension Plugin
安装邮件插件
默认已安装
插件存放位置
配置环境
docker exec -it /bin/bash
java -version
git --version
默认自带
构建项目
保留天数和个数
源码仓库
定时器
build whenever a snapshot dependency is built 当job依赖的快照版本被build时,执行本job。
Build after other projects are built:在其他项目构建完成后再进行构建。
这里又分三种情况:
1. Trigger only if build is stable:其他项目构建成功
2. Trigger even if the build is unstable:其他项目不稳定
3. Trigger even if the build fails:其他项目构建失败
Build periodically 隔一段时间build一次,不管版本库代码是否发生变化,通常不会采用此种方式。例如: 0 2 * * * (每天2:00 必须build一次源码)
Poll SCM:隔一段时间比较一次源代码如果发生变更,那么就build。否则,不进行build,通常采用这种方式;
定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。配置如下: */5 * * * * (每5分钟检查一次源码变化,如果有更新才build)
在 Schedule中填入* * * * *,代表一分钟监听一次
第一个参数代表的是分钟 minute,取值 0~59;
第二个参数代表的是小时 hour,取值 0~23;
第三个参数代表的是天 day,取值 1~31;
第四个参数代表的是月 month,取值 1~12;
最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
所以 0 * * * * 表示的就是每个小时的第 0 分钟执行一次构建。
五个*依次标识 分钟 小时 每月几号 哪个月月 周几
例:
H/15 * * * * 每15分钟
H(0-29)/10 * * * * 每小时的0到29分钟每15分钟
H 2-19/2 * * 1-5 每周1到周五(工作日)2点到19点每2小时执行
H H 1,15 1-11 * 1到11月1号和15号各执行一次
每15分钟触发1次
maven编译打包
tomcat部署
点击增加构建后操作步骤下拉选择:Deploy war/ear to a container ,多出一个发布选项
WAR/EAR files 是war包的相对路径, 这里填写: target/*.war
Context path是tomcat的发布路径,例如:填写了myDemo , 则访问地址为:http://localhost:8080/myDemo
Containers 发布到的容器,主要可发布到tomcat、jboss、GlassFish
下拉选择 tomcat7.x
在Manager user name 填写上面自定义的用户名
在Manager password 填写上面自定义的密码
在Tomcat URL 中tomcat的访问地址 http://localhost:8689
(有网友说端口号后面不要加/)
执行任务
添加用户
其中的账号名称,就是你的用户名。描述就是你对该账号的描述。
API token,说的是用户对外提供的API接口的口令,可以通过change API Token 来修改API Token。
Credentials:证书的可用情况
E-mail: 用户的邮箱地址,可以在这里修改。
My view:视图,目前暂时不知道它们的作用,欢迎大神前来指导。
剩下的密码就不说了,大家都懂的。
maven在docker容器中的仓库
find ./ -name repostory
本地上传到docker宿主机的jenkins外挂文件夹
然后进入docker
再将jdbc6的jar包复制到repository
权限分配
权限插件
Role Strategy Plugin
重启jenkins
1、关闭Jenkins
只需要在访问jenkins服务器的网址url地址后加上exit。例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http://localhost:8080/exit 网址就能关闭jenkins服务.
2、重启Jenkies
http://localhost:8080/restart
3、重新加载配置信息
http://localhost:8080/reload
4. cmd启动tomcat
java -jar jenkins.war
5. 后台启动
nohup java -jar jenkins.war --httpPort=8081 &
6. windows启动jenkins
net stop jenkins
net start jenkins
关于maven
首次选择自动安装
自动安装后
进入jenkins的docker
docker exec -it jenkins /bin/bash
查看maven_home
find ./ -name mvn
./var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven/bin/mvn
远程ssh发布war包
思路
Publish Over SSH 不是将war包发布到tomcat容器下,而是先利用该插件将build好的文件上传到远程linux 的指定目录下,然后利用该插件远程执行脚本将指定目录下的文件复制到tomcat的执行文件夹下,再利用脚本远程重启tomcat即可
环境要求
远程 tomcat部署在linux上,不支持 windows上远程发布
插件
jenkins 控制台下 系统管理->管理插件->可选插件->通过搜索找到
“Publish Over SSH”,进行勾选安装。安装完毕重起jenkins网页控制台。
配置远程linux SSH的访问权限
系统管理->系统设置界面,滚动配置界面直至如下位置,会看到了多了Publish over SSH的配置选项,点击“增加”SSH Server,出现如下界面,分别填写远程linux的HostName(登录IP)、userName(linux ssh的用户名)。
配置服务器脚本信息
Transfer Set Source Files这个路径默认是在项目的workspace中,因为构建好的war包在target目录中,所以这里指向了target/shop.war。
Remove prefix可以把target/shop.war的target/去掉,这样上传到服务器上就是shop.war,否则它会创建target目录。
domain可以与文件目录不一致。主要是 Sources files要与Jenkins上war的位置一致,package的名称需要与jenkins上war名一致
#!/bin/bash
#bash shell,shell中的一种,linux一般默认是bash shell
domain="man.picking.wms.dmall.com
" #给domain赋值,参数化
package="wms-picking-man-web"
deployid=${package}_${BUILD_ID}
#deployid=wms-picking-man-web_BUILD_ID,BUILD_ID=构建版本号
ports="(9000,8000)"
# make sure domain directory exists
#此句为注释
mkdir -p /web/domains/${domain}
#/web/domains/新建文件夹man.picking.wms.dmall.com
#-p参数:如果没有父目录会直接创建父目录
mkdir -p /web/logs/${domain}
# stop the running tomcat server
ps -aef | grep java|grep "/${domain}/"| grep -v grep | sed 's/ [ ]*/:/g' |cut -d: -f2 |xargs kill -9
#过滤java进程中包含${domain}的进程传递给xargs
#grep -v grep 过滤掉查询进程
#sed 's/ [ ]*/:/g'将获取到的进程数据,按照空格拆开用:隔开组合,[中间是空格]*匹配1个或多个空格
#cut -d: -f2 取:隔开的第二个字符
#xargs kill -9 等于 kill -9 PID 9是信号变量
#kill -9 pid等于kill -s 9 pid,表示强制,尽快终止一个进程
# unzip package
mkdir "/web/app/${domain}" #等于 mkdir -p /web/app/${domain}
mv /web/app/deploy/${package}.war /web/app/deploy/${deployid}.war #将war包重命名为项目名+构建号
rm -rf /web/app/${domain}/* #删除所有原目录下所有文件
echo "deploy ${domain} application" #打印提示:deploy man.picking.wms.dmall.com
application
unzip /web/app/deploy/${deployid}.war -d /web/app/${domain} #将需要部署的war包,解压到/web/app/man.picking.wms.dmall.com
#此文件夹为代码库
domain_conf="/web/servers/tengine/conf/domains/${domain}.conf"
if [ ! -f "${domain_conf}" ]; then #如果配置文件domain_conf不存在
cp /home/dmadmin/deploy/domain.conf ${domain_conf} #将/home/dmadmin/deploy/domain.conf拷贝到domain_conf去
sed -i "s/{domain}/${domain}/g" ${domain_conf} #将domain_conf文件中所有{domain}替换${domain}
else
sed -i "/weight=10 max_fails=2 fail_timeout=30s;/d" ${domain_conf} #否则,删除weight=10 max_fails=2 fail_timeout=30s;这行
fi
# deploy
for port in $ports; #ports中有多少个参数就执行多少次
do
port=${port//(/} #去括号,port=9000,800)
port=${port//)/}
# tomcat connection port
sd_port=`echo $port|cut -d "," -f1` #将port元素按照“,”分开,取第一个数
# tomcat shutdown port
conn_port=`echo $port|cut -d "," -f2`
# insert upstream into nginx domain
#######
sed -i "1 a server 172.16.195.30
:${conn_port} weight=10 max_fails=2 fail_timeout=30s;" ${domain_conf} #在${domain_conf}配置文件中第一行插入服务器数据,nginx监听
#copy conf to 193 server
scp -P 50027 -i /home/dmadmin/kp-lsq6dded ${domain_conf} root@119.254.210.145:/web/servers/tengine/conf/domains #当前服务器为172.16.195.30
#将当前服务器的配置文件domain_conf拷贝到119.254.210.145
常见问题
1. tomcat内存溢出
解决办法:
这个错误有很多原因,除了catalina.out日志外
去查看 tail -200f localhost.2018-04-24.log
原因:
maven编译src的时候,只会编译java文件,而mapper里面的xml没放在resource里,需要在pom.xml文件里面配置文件类型
src/main/resources
**/*.properties
**/*.xml
**/*.tld
false
src/main/java
**/*.properties
**/*.xml
**/*.tld
false