Jenkins + docker + git + maven + harbor + linux
镜像:类似虚拟机的镜像,也可理解为springBoot 打的jar包
容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可理解为tomcat
仓库:类似代码仓库,gitLab之类的,是Docker集中存放镜像文件的场所
(未安装过的,已安装过的检查docker更新,或者卸载旧的后在安装新的)
首先检查linux内核版本,版本大于3.10即可
执行安装命令:
下面展示一些 内联代码片
。
$yum install -y docker-engine
如果提示报yum的错误,可能你需要先安装yum
安装命令结束后;使用
$docker --version
查看是否安装成功及查看docker相关信息
安装成功后启动Docker
docker systemctl start docker
设置开机启动(我是部署在linux服务器上,一般是不会关服务器的)
sudo systemctl enable docker
关闭docker
docker systemctl stop docker
查看docker服务
docker ps
查看Docker的运行状态
systemctl status docker
命令补充:
查看某个docker容器的日志:
docker logs --tail 300 -f dockerName
启动docker容器
docker start name
停止:
docker stop name;
重启:
docker restart name;
删除某个容器:若正在运行,需要先停止
docker rm name
systemctl daemon-reload #加载配置文件
查看docker镜像:
docker image ls
删除镜像:
docker rmi 9fa504a6066a
docker rmi imageNme
启动Harbor:docker-compose up -d
停止:docker-compose stop;
重新启动:docker-compose restart;
放通端口:firewall-cmd --permanent --zone=public --add-port=80/tcp
进入Jenkins官网
mkdir -p /apps/devops/jenkins
chmod 777 /apps/devops/jenkins
权限开启遇到问题是执行开启最高权限
(将Jenkins镜像在docker容器里启动)
docker run -itd -p 9003:8080 -p 9004:50000 --restart always -v /apps/devops/jenkins:/var/jenkins_home --name jenkins jenkins/jenkins:lts
http://192.168.xxx.xxx:9003
如上述过程没有问题会出现如下页面,代表jenkins运行成功
docker logs -f jenkins
将红框内的内容复制到输入框内,点击继续,此时页面会进去加载页面(可能会加载很长时间)
如果加载时间过长
修改/apps/devops/jenkins/ 下的hudson.model.UpdateCenter.xml文件
vi hudson.model.UpdateCenter.xml
将将文件hudson.model.UpdateCenter.xml中https://updates.jenkins.io/update-center.json改成http://updates.jenkins.io/update-center.json(把https改成http)
保存后重启Jenkins容器,
重新进入Jenkins页面
选择《安装推荐的插件》
安装过程会很长,会存在部分插件安装失败的现象(可选择重启Jenkins或者重新下载插件来解决)
插件全部安装成功后:
创建第一个用户
保存完成后进入下一个页面
这里设置的这个URL涉及到git触发部署请求,gitlab,gitHub,gitee.不支持直接用地址+端口的形式,要求使用域名形式,后面的涉及到git自动触发事件的改用其他插件
出现此页面代表Jenkins已经安装完成
修改Jenkins的系统时间
输入下面命令,出现Result则运行正常
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
所需插件:【Maven Integration】、【Pipeline Maven Integration】、【Gitlab】、【Gitlab hook】、【SSH】、【Publish Over SSH】
安装过程页面如下(如果出现安装插件失败的,重启Jenkins,在搜索下载)
待所有插件安装完成后重启Jenkins(在你访问Jenkins页面地址上加/restart)
需要安装JDK,maven,git,docker。
打开系统管理-全局工具配置下
如果没有这个选项
需要到插件管理下安装:docker-build-step 这个插件,插件安装完成后重启Jenkins,之后再来安装Docker。
待所有的配置都完成后重启Jenkins
[root@topcheer ~]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 382 0 --:--:-- 0:00:01 --:--:-- 383
100 15.4M 100 15.4M 0 0 35739 0 0:07:32 0:07:32 --:--:-- 62373
[root@topcheer ~]# chmod +x /usr/local/bin/docker-compose
[root@topcheer ~]# docker-compose
百度网盘下载harbor压缩包
解压:
tar -zxvf harbor-offline-installer-v1.8.0.tgz
安装
# 执行 ./prepare
./prepare
# 执行 ./install.sh
./install.sh# 查看启动情况docker-compose ps
[root@topcheer harbor]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------
harbor-core /harbor/start.sh Up (healthy)
harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (healthy) 80/tcp
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp
registryctl /harbor/start.sh Up (healthy)
[root@topcheer harbor]#
安装完成后访问:
http://地址/harbor/sign-in
默认账户名密码
admin/Harbor12345
新建项目后查看 推送镜像地址
修改jenkins中ssh命令(修改为新建仓库的推送命令)
测试推送镜像:
[root@docker02appl]# docker login 192.168.xxx.xxx
Username(admin): admin
Password:
Login Succeeded
显示登录成功,如果失败,修改配置文件:
(1)找到这个文件,加上红框内的内容,改成自己的ip(可能红框上下文的内容不一样,不用管,只添加红框内的内容)
(2)大概率是没有这个文件的,需要新建并添加内容
vi /etc/docker/daemon.json# 加上 允许的仓库
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
重启docker
再测试登录
执行推送命令
查看自己有哪些镜像;docker images
把需要上传到Harbor的镜像运行如下命令就可以了
#镜像打标签
[root@centos7 ~]#docker tag 镜像名:标签 私服地址/仓库项目名/镜像名:标签
#推送到私服
[root@centos7 ~]#docker push 私服地址/仓库项目名/镜像名:标签
#从私服拉取镜像
[root@centos7 ~]#docker pull 私服地址/仓库项目名/镜像名:标签
1.任务名称一般以项目名称命名,经测试不能包含大写字母(启动镜像时会报错)
配置git信息
点击确定后进入项目配置页面,输入git项目的克隆地址(HTTP格式),选择要搭建的项目分支
配置git时添加git的账户登录信息,填写方式及内容同上面维护服务器信息
开发每次推送代码到仓库时(git push),都需要执行一次构建
使用管理员账号登录Jenkins后,在系统管理-》管理插件,搜索“Generic Webhook Trigger”后安装,顺利完成插件安装:
(2) 选择左侧菜单的“管理Web钩子”,选择右上角的“添加Web钩子”,下拉菜单展开后,选择Gogs:
(3)主要配置推送地址,例如
页面底部有一个“测试推送”的按钮,点击按钮可以模拟一次推送(push request),然后检查Jenkins是否收到推送请求并处理:
勾选 Add timestamps to the Console Output,可以看到控制台打印的信息,其他的选项可以按需勾选
SERVER_NAME_1=platform-wuad
echo "=========================>>>>>>>工作空间WORKSPACE的地址:$WORKSPACE "
cd $WORKSPACE
echo "=========================>>>>>>>进入工作空间WORKSPACE,清除工作空间中原项目的工作空间$SERVER_NAME_1 "
rm -rf $SERVER_NAME_1
echo "=========================>>>>>>>清除工作空间中原项目的工作空间$SERVER_NAME_1 ......成功success"
注意:本处的SERVER_NAME_1=platform-wuad 是配置项目的名称,且你自己的项目名称与等号之间不要有空格存在,否则会报错,执行构建后会很快就报错导致构建失败
这里设置一下全局操作,clean项目,并打成jar包,所以这里输入:
clean package
选择要执行的pom文件,微服务项目要具体到每一个服务的pom文件
(可能会出现红色报错提示:提示找不到pom文件,但是自己地址并没有写错,可以先不管,整体配置完成后执行构建,如果自己的pom地址没有写错,是能构建成功的)
只在jenkins构建成功后,才执行这一步
因为最后的构建成功的maven项目的jar包是以docker启动服务为目的,所以最后的docker操作,一定是在jenkins容器以外的服务器上运行的,可能是本机宿主机,也可能是远程的服务器,这个根据自己的情况去配置
本处选择,在远程的SSH执行shell脚本
选中只有构建成功才执行这些命令,然后选择Execute shell script on remote host using ssh
#=================================微服务项目======================================
#=====================================================================================
#=================================定义初始化变量======================================
#=====================================================================================
# jenkins列表里的服务名:jenkins打包后的项目在此目录下
SERVICE_NAME=platform-wuad
# 二级项目目录(工作手机有部分服务是多了一层路径)(安照服务实际目录选择使用)
SERVICE_NAME_ER=platform-server
# jenkins构建好的源jar路径
SOURCE_PATH=/apps/devops/jenkins/workspace
#【docker 镜像】【docker容器】【Dockerfile同目录下的jar名字[用它build生成image的jar]】【jenkins的workspace下的项目名称】
#注意统一名称!!!!!(和pom文件里的名称一致)
#SERVER_NAME=springboot
SERVER_NAME=platform-wuad
#操作/项目路径(Dockerfile存放的路劲)(可以自己设置路径)
BASE_PATH=/var/$SERVER_NAME
#容器id [grep -w 全量匹配容器名] [awk 获取信息行的第一列,即容器ID] [无论容器启动与否,都获取到]
CID=$(docker ps -a | grep -w "$SERVER_NAME" | awk '{print $1}')
#镜像id [grep -w 全量匹配镜像名] [awk 获取信息行的第三列,即镜像ID]
IID=$(docker images | grep -w "$SERVER_NAME" | awk '{print $3}')
#源jar完整地址 [jenkins构建成功后,会在自己的workspace/项目/target 下生成maven构建成功的jar包,获取jar包名的完整路径]
SOURCE_JAR_PATH=$(find "$SOURCE_PATH/$SERVER_NAME/target/" -name "*$SERVER_NAME*.jar" )
# SOURCE_JAR_PATH = /apps/devops/jenkins/workspace/turtle-eureka/eureka-server/target/jar名
DATE=`date +%Y%m%d%H%M%S`
#=====================================================================================
#============================对原本已存在的jar进行备份================================
#=====================================================================================
# 备份
function backup(){
if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
echo "=========================>>>>>>>$SERVER_NAME.jar 备份..."
mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
echo "=========================>>>>>>>备份老的 $SERVER_NAME.jar 完成"
else
echo "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"
fi
}
#=====================================================================================
#============================ 创建BASE_PATH ================================
#=====================================================================================
function makedir(){
if [ ! -d "$BASE_PATH" ]; then
echo "=========================>>>>>>>>>>>$BASE_PATH 不存在,创建……"
mkdir -p $BASE_PATH
echo "=========================>>>>>>>>>>>$BASE_PATH 创建成功"
else
echo "=========================>>>>>>>>>>>$BASE_PATH 已存在,跳过创建"
fi
}
#=====================================================================================
#============================ 创建Dockerfile文件 ================================
#=====================================================================================
function createfile(){
if [ ! -f "$BASE_PATH/Dockerfile" ]; then
echo "======================>>>>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 不存在,创建……"
cd $BASE_PATH
echo "FROM java:8" > Dockerfile
echo "MAINTAINER Wuad" >> Dockerfile
echo "VOLUME /workspace" >> Dockerfile
echo "ADD $SERVER_NAME.jar $SERVER_NAME.jar" >> Dockerfile
echo "ENTRYPOINT [\"java\",\"-jar\",\"$SERVER_NAME.jar\"]" >>Dockerfile
echo "========================>>>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 创建成功"
else
echo "=======================>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 已存在,跳过创建"
fi
}
#=====================================================================================
#=========================移动最新源jar包到Dockerfile所在目录=========================
#=====================================================================================
# 查找源jar文件名,进行重命名,最后将源文件移动到项目环境
function transfer(){
echo "=========================>>>>>>>源文件完整地址为 $SOURCE_JAR_PATH"
echo "=========================>>>>>>>重命名源文件"
mv $SOURCE_JAR_PATH $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar
echo "=========================>>>>>>>最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 迁移至 $BASE_PATH"
# cp $SOURCE_JAR_PATH/$SERVER_NAME.jar $BASE_PATH
cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH
echo "=========================>>>>>>>迁移完成Success"
}
#=====================================================================================
#==================================构建最新镜像=======================================
#=====================================================================================
# 构建docker镜像
function build(){
#无论镜像存在与否,都停止原容器服务,并移除原容器服务
echo "=========================>>>>>>>停止$SERVER_NAME容器,CID=$CID"
docker stop $CID
echo "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"
docker rm $CID
#无论如何,都去构建新的镜像
if [ -n "$IID" ]; then
echo "=========================>>>>>>>存在$SERVER_NAME镜像,IID=$IID"
echo "=========================>>>>>>>移除老的$SERVER_NAME镜像,IID=$IID"
docker rmi $IID
echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,开始---->"
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,完成---->"
else
echo "=========================>>>>>>>不存在$SERVER_NAME镜像,构建新的镜像,开始--->"
cd $BASE_PATH
docker build -t $SERVER_NAME .
echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,结束--->"
fi
}
#
function pushpull(){
#标记
docker tag $SERVER_NAME:latest 192.168.99.25/testone/$SERVER_NAME:latest
echo "=========================>>>>>>>标记$SERVER_NAME镜像,完成---->"
#推送
docker push 192.168.99.25/testone/$SERVER_NAME:latest
echo "=========================>>>>>>>推送$SERVER_NAME镜像,完成---->"
# 删除本地
# docker rmi $IID
# docker rmi 192.168.99.25/testone/$SERVER_NAME:latest
# 拉去
# docker pull 192.168.99.25/testone/$SERVER_NAME:latest
}
#=====================================================================================
#==============================运行docker容器,启动服务===============================
#=====================================================================================
# 运行docker容器
function run(){
backup
makedir
createfile
transfer
build
docker run -d --name $SERVER_NAME -p 8888:8080 $SERVER_NAME
}
#入口
run
最后点击应用,保存
点击立即构建,初次构建会加载很长时间
¥¥¥¥¥¥问题记录¥¥¥¥¥¥¥
(1)docker 运行镜像命令没有报错,但是看不到已启动成功的docker容器,此时查看docker运行日志,大概率代码运行出现问题(我遇上的:从pom文件里找不到main方法,eureka服务注册失败)
(2)服务器运行内存不够,会导致任务构建失败或者整个docker服务挂掉
Maven JVM terminated unexpectedly with exit code 137
maven虚拟内存不够,加内存或者修改设置
(3)(在docker login 是出现的问题)(修改docker配置文件,重新加载后重启docker,注意harbor是否重启成功)
docker push 192.168.xxx.xxx/testdemo/testone
docker tag admin/admin 192.168.xxx.xxx/testdemo/testone
(4)微服务项目要先构建eureka的服务,再构建其他服务(微服务要注册到eureka上)
eureka构建成功后,再构建其他服务的任务,登录eureka发现服务没有注册上去,此时要查看eureka所在的容器本身的id地址,会显示不是你服务器的地址,此时要么修改容器的ip地址,或者修改项目代码里其他服务注册eureka的地址,改成你查出来的docker容器的
(5)如果项目中有依赖无法从maven上下载,此时需要手动复制到docker的maven仓库里
(6)其他的问题都是小问题,例如,ssh命令中自己写的项目名,或者根据路径找jar找不到,或者对jar包改名或者复制,修改ssh命令,拼出完整路径去查看哪里错了,
以上是我遇到的问题,并不一定满足所有人,
以上是我遇到的问题,并不一定满足所有人,
以上是我遇到的问题,并不一定满足所有人,