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官网
使用红框内的命令
权限开启遇到问题是执行开启最高权限
(将Jenkins镜像在docker容器里启动)
docker run -itd -p 9003:8080 -p 9004:50000 --restart always -v /apps/devops/jenkins:/var/jenkins_home --name jenkins jenkins/jenkins:ltshttp://192.168.xxx.xxx:9003 如上述过程没有问题会出现如下页面,代表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
百度网盘下载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最后点击应用,保存
点击立即构建,初次构建会加载很长时间
显示SUCCESS则构建成功
¥¥¥¥¥¥问题记录¥¥¥¥¥¥¥
(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命令,拼出完整路径去查看哪里错了,
以上是我遇到的问题,并不一定满足所有人, 以上是我遇到的问题,并不一定满足所有人, 以上是我遇到的问题,并不一定满足所有人,
