如下图
本地电脑
虚拟机centos7
代码仓库
镜像仓库
centos之前已经安装了docker,不再赘述。
本次使用docker安装jenkins,安装jenkins有多种,yum,war包部署,自己选择,如果是docker部署jenkins,建议jenkins需要的插件如在jenkins安装即可。
加快docker镜像下载速度
[root@localhost ~]# vi /etc/docker/daemon.json
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# more /etc/docker/daemon.json
{"registry-mirrors":["https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"]}
一条命令安装并运行jenkins
[root@localhost ~]# docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v /root/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -u 0 Jenkins
-u 0 是以root帐号覆盖容器的jenkins用户帐号,要不然-v映射卷的时候会报权限不足
docker 启动后就可以访问jenkins了 ,http://127.0.0.1:8080
管理用户密码容器启动的时候也有提示用命令docker logs -f myjenkins
查看启动日志,
或者到容器里面more /var/jenkins_home/secrets/initialAdminPassword
。
安装默认插件
总是失败,docker logs -f myjenkins
看日志有很多报错
aused by: java.io.IOException: Failed to install token-macro plugin
at hudson.PluginManager.dynamicLoad(PluginManager.java:874)
at hudson.PluginManager.dynamicLoad(PluginManager.java:813)
at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1889)
... 5 more
Caused by: java.io.IOException: Token Macro Plugin v2.12 failed to load.
- You must update Jenkins from v2.60.3 to v2.121.3 or later to run this plugin.
- Pipeline: Step API v2.22 failed to load. Fix this plugin first.
at hudson.PluginWrapper.resolvePluginDependencies(PluginWrapper.java:626)
at hudson.PluginManager.dynamicLoad(PluginManager.java:864)
... 7 more
Mar 16, 2020 6:49:13 AM hudson.model.UpdateCenter$DownloadJob run
INFO: Starting the installation of bouncycastle API on behalf of admin
Mar 16, 2020 6:49:16 AM hudson.model.UpdateCenter$UpdateCenterConfiguration download
INFO: Downloading bouncycastle API
日志有很多报错,是因为镜像版本不对,jenkins镜像已经被丢弃,有用的是jenkins:Jenkins:lts
[root@localhost ~]# docker run -d --name myjenkins -p 8080:8080 -p 50000:50000 -v /root/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -u 0 jenkins/Jenkins:lts
配置安装插件加速,要不太慢了。
这时候容器起来,本地磁盘挂载的目录/root/jenkins/updates就有数据了
[root@localhost updates]# pwd
/root/jenkins/updates
[root@localhost updates]# ls
default.json hudson.tasks.Maven.MavenInstaller
default.json.bak hudson.tools.JDKInstaller
vim default.json文件,在命令模式下使用下面2个地址改成清华大学插件加速网址和百度地址,执行后:wq退出
[root@localhost updates]# vim default.json
:1,$s/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g
:1,$s/http:\/\/www.google.com/https:\/\/www.baidu.com/g
改成百度地址的原因是jenkins会去探测这个地址,国内谷歌目前不可访问,会出现下面离线的提示
再看容器日志有超时报错
2020-03-16 07:30:21.230+0000 [id=25] WARNING hudson.model.UpdateCenter#updateDefaultSite: Upgrading Jenkins. Failed to update the default Update Site 'default'. Plugin upgrades may fail.
java.net.SocketTimeoutException: connect timed out
打开http://localhost:8080/pluginManager/advanced
将https改成http,
http://updates.jenkins.io/update-center.json
/etc/resolv.conf加入nameserver 8.8.8.8
再重启下jenkins
[root@localhost jenkins]# docker restart myjenkins
myjenkins
再访问http://127.0.0.1:8080
快了N多。之前几次几个小时没下载完的,十几分钟就下载完了
有失败的,刷新下再重试
我这里没创建其他用户了,用默认admin,密码到容器里面more /var/jenkins_home/secrets/initialAdminPassword
插件有可能未完全生效,再重启下jenkins
[root@localhost secrets]# docker restart myjenkins
Myjenkins
在系统管理->插件管理搜索不到Maven Integration plugin
直接到
http://updates.jenkins-ci.org/download/plugins/maven-plugin/下载
然后在插件管理->高级里上传安装.
这时候新建Job任务就有"构建一个maven项目"选项了
可选插件搜索下载安装即可
然后到系统管理-》系统设置,配置ssh远程登录信息
选择自己的JDK版本,需要oracle官网帐号密码才能下载安装
ps:如果不小心输错了,那么在jenkins可视化界面中无法修改账号和密码,需要在jenkins的根目录下将对应的hudson.tools.JDKInstaller.xml配置文件删除。里面有orcale的账号和密码,删除这个配置文件之后,再次在页面上配置,文件会重新生成。我就遇这坑了
[root@localhost jenkins]# cd /root/jenkins
[root@localhost jenkins]# rm -rf hudson.tools.JDKInstaller.xml
hudson.tools.JDKInstaller.xml
[root@localhost jenkins]# docker restart myjenkins
[root@localhost secrets]# docker restart myjenkins
Myjenkins
接着填写描述,
git地址,用户密码
选择需要构建的分支
构建触发器,选了2种,一种是让git使用hook的方式访问一个jenkins的url进行触发。这里url后缀是自己写,生成新的url,另一种轮训SCM是定时检查代码是否有变化,有变化则触发构建,值为5个*,分别表示分钟(0-59),小时(0-23),天(1-31),月份(1-12),周(0-7),其中H表示随机,H/5表示每5分钟检查一次
Pre Steps:构建前的操作,可以增加执行shell,配置脚本echo “Pre Steps脚本启动成功”,此内容会在构建控制台中打印出来
Build:Root POM配置pom.xml(要构建的工程必须是maven,有pom文件),Goals and options配置clean package(也就是mvn的构建命令)
Post Steps:构建完成后的操作,可以增加执行shell,配置脚本echo “Post Steps脚本启动成功${WORKSPACE}
”,${WORKSPACE}
为jenkins的环境变量。上方的3个单选项分别代表构建成功后执行、构建成功或不稳定执行、总是执行
构建设置可以设置构建完成后email通知,我就不设置了
构建后操作->增加构建后操作步骤,选择Set Build artifacts over SSH
选择好ssh登录的centos服务器,指定进去后的目录,和要执行的shell命令
shell命令:
/root/docker-servermanager.sh "`pwd`/docker/servermanager" $BUILD_NUMBER
shell里的docker-servermanager.sh和Dockerfile我已经放在服务器/root目录上了
Dockerfile
[root@localhost ~]# more /root/Dockerfile
#基础镜像,请选择符合自己项目的镜像,我之前用的tomcat:7.0.86镜像一直不成功,因为Tomcat:7.0.86镜像里面的JDK版本不是1.8
FROM tomcat:jdk8-openjdk
#作者
LABEL maintainer="test"
#TOMCAT环境变量
ENV CATALINA_BASE: /usr/local/tomcat \
CATALINA_HOME: /usr/local/tomcat \
CATALINA_TMPDIR: /usr/local/tomcat/temp \
JRE_HOME: /usr
#删除原来的默认模板tomcat页面
RUN rm -rf ${CATALINA_HOME}/webapps/*
#将服务器当前目录也就是ssh的默认目录/root/docker/servermanager下的target/servermanager-0.0.1-SNAPSHOT.war 复制到容器tomcat程序webapps下并改名ROOT.war,这样服务起来后访问就可以直接http://127.0.0.1:端口号/listServer,而不是还要加servermanager-0.0.1-SNAPSHOT路径http://127.0.0.1:端口号/servermanager-0.0.1-SNAPSHOT/listServer
COPY target/servermanager-0.0.1-SNAPSHOT.war ${CATALINA_HOME}/webapps/ROOT.war
#暴露端口,此镜像tomcat里server.xml默认配置是8080,所以暴露端口也用8080,镜像端口没事,docker run的时候-p 8181:8080映射到外面是自己定
EXPOSE 8080
#启动命令,CMD命令和ENTRYPONT都可以执行命令,且多条也只执行最后一条,区别是CMD命令是默认执行的命令,因此可以被docker run或者ENTRYPOINT覆盖,具体区别可以看https://blog.csdn.net/shunfa888/article/details/79373840
CMD ["catalina.sh","run"]
docker-servermanager.sh 此脚本作用是用Dockfile构建镜像,push镜像到镜像仓库,并启动容器
[root@localhost ~]# pwd
/root
[root@localhost ~]# more docker-servermanager.sh
#!/bin/bash
echo "当前位置:"`pwd`
echo "当前用户:"`whoami`
# 定义变量
WORKHOME=$1
BUILD_NUMBER=$2
API_NAME="servermanager"
API_VERSION="1.0"
API_PORT=8181
DOCKER_REGISTRY="docker.io/你自己的镜像仓库名/"
#镜像名由servermanager:jenkins的构建号组成
IMAGE_NAME="$API_NAME:$BUILD_NUMBER"
#容器名由servermanager:1.0组成
CONTAINER_NAME=$API_NAME-$API_VERSION
# 还记得上面jenkins配置/root/docker-servermanager.sh "`pwd`/docker/servermanager" $BUILD_NUMBER,$WORKHOME就是当前目录/root/docker/servermanager,复制Dockerfile 文件到此目录
echo $WORKHOME
cd $WORKHOME
cp /root/Dockerfile .
#构建docker 镜像
docker build -t $IMAGE_NAME .
#打标签以便上传到对应的镜像仓库
docker tag $IMAGE_NAME docker.io/你自己的镜像仓库名/$IMAGE_NAME
#因为我是用private仓库,需要登录docker镜像仓库
docker login -u 用户 -p 密码 docker.io
#推送镜像到镜像仓库
docker push $DOCKER_REGISTRY$IMAGE_NAME
#删除同名docker容器,避免之前启动的旧容器冲突
cid=$(docker ps -a| 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
给两个文件执行权限
[root@localhost ~]# chmod +x docker-servermanager.sh
[root@localhost ~]# chmod +x Dockerfile
如果在jenkins构建有遇到报错Error fetching remote repo ‘origin’,因为我之前有尝试构建,有旧的文件在,清除工作空间即可
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9034b5837ba servermanager:22 "catalina.sh run" 41 hours ago Up 41 hours 0.0.0.0:8181->8080/tcp servermanager-1.0
访问成功,此时准备代码修改下列名“业务程序目录”,加上test,验证jenkins是否会按设置的每5分钟hook到git代码更新触发自动构建。
ps:如果页面没有load到数据,请查看下防火墙或者mysql有无开启远程登录,mysql是本机部署192.168.1.195,虚拟机192.168.1.93上的docker tomcat服务要访问
UPDATE `user` set host='192.168.1.93' where `user`='root';
flush PRIVILEGES;
可以看到已经自动在构建了
等jenkins构建成功后,稍等一两分钟等容器服务起来,再访问http://127.0.0.1:8181看下效果,实践成功。
参考资料:
特别感谢CSDN博主「天生我才毕有用」的原创文章https://blog.csdn.net/njzcx/article/details/80979157