1.涉及工具

Jenkins + docker + git + maven + harbor + linux

2.自动化部署流程图

自动化部署流程图

3.在linux上安装Docker

3.1 Docker 的三大核心概念:镜像,容器,仓库

镜像:类似虚拟机的镜像,也可理解为springBoot 打的jar包
容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可理解为tomcat
仓库:类似代码仓库,gitLab之类的,是Docker集中存放镜像文件的场所

3.2安装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

4 使用Docker搭建Jenkins

4.1拉去Jenkins镜像

进入Jenkins官网


在这里插入图片描述
使用红框内的命令

4.2将docker工作目录对外挂载

mkdir -p /apps/devops/jenkins

4.3对此目录开放权限

chmod 777 /apps/devops/jenkins

权限开启遇到问题是执行开启最高权限

4.4启动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

4.5运行成功后访问Jenkins

http://192.168.xxx.xxx:9003
如上述过程没有问题会出现如下页面,代表jenkins运行成功

在这里插入图片描述

4.6查看日志获取初始密码

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页面


4.7页面进入成功后

在这里插入图片描述
选择《安装推荐的插件》
安装过程会很长,会存在部分插件安装失败的现象(可选择重启Jenkins或者重新下载插件来解决)
在这里插入图片描述
插件全部安装成功后:
在这里插入图片描述
创建第一个用户
保存完成后进入下一个页面

在这里插入图片描述
这里设置的这个URL涉及到git触发部署请求,gitlab,gitHub,gitee.不支持直接用地址+端口的形式,要求使用域名形式,后面的涉及到git自动触发事件的改用其他插件

4.8 安装完成后

出现此页面代表Jenkins已经安装完成
在这里插入图片描述
修改Jenkins的系统时间
在这里插入图片描述
输入下面命令,出现Result则运行正常

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

在这里插入图片描述

5 配置Jenkins构建项目所需插件

所需插件:【Maven Integration】、【Pipeline Maven Integration】、【Gitlab】、【Gitlab hook】、【SSH】、【Publish Over SSH】

5.1 进入系统管理-插件管理

在这里插入图片描述
在这里插入图片描述
安装过程页面如下(如果出现安装插件失败的,重启Jenkins,在搜索下载)
在这里插入图片描述
待所有插件安装完成后重启Jenkins(在你访问Jenkins页面地址上加/restart)
在这里插入图片描述

5.2 添加凭据(管理你的服务器登录名密码,gti的登录名密码等信息)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 配置SSH remote hosts

系统管理-系统配置下
在这里插入图片描述
在这里插入图片描述

5.4 全局工具配置

需要安装JDK,maven,git,docker。
打开系统管理-全局工具配置下

5.4.1 安装JDK

在这里插入图片描述

5.4.2 安装git

在这里插入图片描述

5.4.3 安装maven

在这里插入图片描述

5.4.4 安装Docker

如果没有这个选项
需要到插件管理下安装:docker-build-step 这个插件,插件安装完成后重启Jenkins,之后再来安装Docker。在这里插入图片描述

待所有的配置都完成后重启Jenkins

6.Linux下安装Harbor

6.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  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

6.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 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]#

6.3访问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 私服地址/仓库项目名/镜像名:标签

7 新建Jenkins任务

7.1命名

1.任务名称一般以项目名称命名,经测试不能包含大写字母(启动镜像时会报错)
在这里插入图片描述

7.2 源码管理

配置git信息
点击确定后进入项目配置页面,输入git项目的克隆地址(HTTP格式),选择要搭建的项目分支
在这里插入图片描述
配置git时添加git的账户登录信息,填写方式及内容同上面维护服务器信息
在这里插入图片描述
在这里插入图片描述

7.3 构建触发器

开发每次推送代码到仓库时(git push),都需要执行一次构建
使用管理员账号登录Jenkins后,在系统管理-》管理插件,搜索“Generic Webhook Trigger”后安装,顺利完成插件安装:
在这里插入图片描述
在这里插入图片描述

7.4 Gogs仓库配置

在这里插入图片描述
(2) 选择左侧菜单的“管理Web钩子”,选择右上角的“添加Web钩子”,下拉菜单展开后,选择Gogs:
在这里插入图片描述
(3)主要配置推送地址,例如
http://username:password@127.0.0.1:9003/generic-webhook-trigger/invoke?token=turtleErueka
页面底部有一个“测试推送”的按钮,点击按钮可以模拟一次推送(push request),然后检查Jenkins是否收到推送请求并处理:
在这里插入图片描述

7.5 构建环境

勾选 Add timestamps to the Console Output,可以看到控制台打印的信息,其他的选项可以按需勾选

7.6 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 是配置项目的名称,且你自己的项目名称与等号之间不要有空格存在,否则会报错,执行构建后会很快就报错导致构建失败

7.7 Build(构建)

这里设置一下全局操作,clean项目,并打成jar包,所以这里输入:

clean package

选择要执行的pom文件,微服务项目要具体到每一个服务的pom文件
(可能会出现红色报错提示:提示找不到pom文件,但是自己地址并没有写错,可以先不管,整体配置完成后执行构建,如果自己的pom地址没有写错,是能构建成功的)
在这里插入图片描述

7.8 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" ]; 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

最后点击应用,保存

7.9执行构建

点击立即构建,初次构建会加载很长时间

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
显示SUCCESS则构建成功

8 问题记录:

¥¥¥¥¥¥问题记录¥¥¥¥¥¥¥

(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命令,拼出完整路径去查看哪里错了,

以上是我遇到的问题,并不一定满足所有人,
以上是我遇到的问题,并不一定满足所有人,
以上是我遇到的问题,并不一定满足所有人,

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐