搭建自动化部署过程
- 1.使用工具
- 2.自动化部署流程图
- 3.在linux上安装Docker
-
- Docker 的三大核心概念:镜像,容器,仓库
- 安装Docker
-
- (未安装过的,已安装过的检查docker更新,或者卸载旧的后在安装新的)
- 使用Docker搭建Jenkins
-
- 拉去Jenkins镜像
- 将docker工作目录对外挂载
- 对此目录开放权限
- 启动docker容器
- 运行成功后访问Jenkins
- 查看日志获取初始密码
- 页面进入成功后
- 安装完成后
- 安装自动化部署需要的插件
-
- 进入系统管理-插件管理
- 添加凭据(管理你的服务器登录名密码,gti的登录名密码等信息)
- 配置SSH remote hosts
- 全局工具配置
-
- 安装JDK
- 安装git
- 安装maven
- 安装Docker
- 3.Linux下安装Harbor
-
- 3.1首先安装docker-compose
- 3.2下载harbor压缩包
- 4新建Jenkins任务
-
-
- 源码管理
- 构建触发器
-
- Gogs仓库配置
- 构建环境
-
- Pre Steps
- Build(构建)
- Post Steps(执行任务)
-
1.使用工具
Jenkins + docker + git + maven + harbor + linux
2.自动化部署流程图
3.在linux上安装Docker
Docker 的三大核心概念:镜像,容器,仓库
镜像:类似虚拟机的镜像,也可理解为springBoot 打的jar包
容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可理解为tomcat
仓库:类似代码仓库,gitLab之类的,是Docker集中存放镜像文件的场所
安装Docker
(未安装过的,已安装过的检查docker更新,或者卸载旧的后在安装新的)
首先检查linux内核版本,版本大于3.10即可
执行安装命令:
下面展示一些 内联代码片
。
$yum install -y docker-engine
如果提示报yum的错误,可能你需要先安装yum
安装命令结束后;使用
$docker --version
查看是否安装成功及查看docker相关信息
安装成功后启动Docker
systemctl start docker
设置开机启动(我是部署在linux服务器上,一般是不会关服务器的)
sudo systemctl enable docker
关闭docker
systemctl stop docker
查看docker服务
docker ps
查看Docker的运行状态
systemctl status docker
使用Docker搭建Jenkins
拉去Jenkins镜像
进入Jenkins官网
使用红框内的命令
将docker工作目录对外挂载
mkdir -p /apps/devops/jenkins
对此目录开放权限
chmod 777 /apps/devops/jenkins
权限开启遇到问题是执行开启最高权限
启动docker容器
(将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
运行成功后访问Jenkins
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)
添加凭据(管理你的服务器登录名密码,gti的登录名密码等信息)
配置SSH remote hosts
系统管理-系统配置下
全局工具配置
需要安装JDK,maven,git,docker。
打开系统管理-全局工具配置下
安装JDK
安装git
安装maven
安装Docker
如果没有这个选项
需要到插件管理下安装:docker-build-step 这个插件,插件安装完成后重启Jenkins,之后再来安装Docker。
待所有的配置都完成后重启Jenkins
3.Linux下安装Harbor
3.1首先安装docker-compose
[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 CurrentDload 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
3.2下载harbor压缩包
百度网盘下载harbor压缩包
解压:
tar -zxvf harbor-offline-installer-v1.8.0.tgz
安装
# 执行 ./prepare
./prepare
?
?
# 执行 ./install.sh
./install.sh# 查看启动情况docker-compose ps
?
[root@topcheer harbor]# docker-compose psName 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命令(修改为新建仓库的推送命令)
修改配置文件
vi /etc/docker/daemon.json# 加上 允许的仓库
{"insecure-registries":["192.168.xxx.xxx"]
}
重启:
docker-compose restart
测试推送镜像:
[root@docker02appl]# docker login 192.168.xxx.xxx
Username(admin): admin
Password:
Login Succeeded
显示登录成功,如果失败,修改配置文件
执行推送命令
查看自己有哪些镜像;docker images
把需要上传到Harbor的镜像运行如下命令就可以了
#镜像打标签
[root@centos7 ~]#docker tag 镜像名:标签 私服地址/仓库项目名/镜像名:标签
#推送到私服
[root@centos7 ~]#docker push 私服地址/仓库项目名/镜像名:标签
#从私服拉取镜像
[root@centos7 ~]#docker pull 私服地址/仓库项目名/镜像名:标签
4新建Jenkins任务
1.任务名称一般以项目名称命名,经测试不能包含大写字母(启动镜像时会报错)
源码管理
配置git信息
点击确定后进入项目配置页面,输入git项目的克隆地址(HTTP格式),选择要搭建的项目分支
配置git时添加git的账户登录信息,填写方式及内容同上面维护服务器信息
构建触发器
开发每次推送代码到仓库时(git push),都需要执行一次构建
使用管理员账号登录Jenkins后,在系统管理-》管理插件,搜索“Generic Webhook Trigger”后安装,顺利完成插件安装:
Gogs仓库配置
(2) 选择左侧菜单的“管理Web钩子”,选择右上角的“添加Web钩子”,下拉菜单展开后,选择Gogs:
(3)主要配置推送地址,例如
页面底部有一个“测试推送”的按钮,点击按钮可以模拟一次推送(push request),然后检查Jenkins是否收到推送请求并处理:
构建环境
勾选 Add timestamps to the Console Output,可以看到控制台打印的信息,其他的选项可以按需勾选
Pre Steps
项目构建前进行的步骤
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 是配置项目的名称
Build(构建)
这里设置一下全局操作,clean项目,并打成jar包,所以这里输入:
clean package
选择要执行的pom文件,微服务项目要具体到每一个服务的pom文件
Post Steps(执行任务)
只在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" ]; thenecho "=========================>>>>>>>$SERVER_NAME.jar 备份..."mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jarecho "=========================>>>>>>>备份老的 $SERVER_NAME.jar 完成"elseecho "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳过备份"fi
}#=====================================================================================
#============================ 创建BASE_PATH ================================
#=====================================================================================function makedir(){if [ ! -d "$BASE_PATH" ]; thenecho "=========================>>>>>>>>>>>$BASE_PATH 不存在,创建……"mkdir -p $BASE_PATHecho "=========================>>>>>>>>>>>$BASE_PATH 创建成功"elseecho "=========================>>>>>>>>>>>$BASE_PATH 已存在,跳过创建"fi
}#=====================================================================================
#============================ 创建Dockerfile文件 ================================
#=====================================================================================function createfile(){if [ ! -f "$BASE_PATH/Dockerfile" ]; thenecho "======================>>>>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 不存在,创建……"cd $BASE_PATHecho "FROM java:8" > Dockerfileecho "MAINTAINER Wuad" >> Dockerfileecho "VOLUME /workspace" >> Dockerfileecho "ADD $SERVER_NAME.jar $SERVER_NAME.jar" >> Dockerfileecho "ENTRYPOINT [\"java\",\"-jar\",\"$SERVER_NAME.jar\"]" >>Dockerfileecho "========================>>>>>>>>>>>>>>>>$BASE_PATH/Dockerfile 创建成功"elseecho "=======================>>>>>>>>>>>>>>$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.jarecho "=========================>>>>>>>最新构建代码 $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 $CIDecho "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"docker rm $CID#无论如何,都去构建新的镜像if [ -n "$IID" ]; thenecho "=========================>>>>>>>存在$SERVER_NAME镜像,IID=$IID"echo "=========================>>>>>>>移除老的$SERVER_NAME镜像,IID=$IID"docker rmi $IIDecho "=========================>>>>>>>构建新的$SERVER_NAME镜像,开始---->"cd $BASE_PATHdocker build -t $SERVER_NAME .echo "=========================>>>>>>>构建新的$SERVER_NAME镜像,完成---->"elseecho "=========================>>>>>>>不存在$SERVER_NAME镜像,构建新的镜像,开始--->"cd $BASE_PATHdocker 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(){backupmakedircreatefiletransferbuilddocker run -d --name $SERVER_NAME -p 8888:8080 $SERVER_NAME }
#入口
run
最后点击应用,保存
点击立即构建,初次构建会加载很长时间
显示SUCCESS则构建成功