一、概述

maven项目部署流程图如下:

环境介绍

操作系统 ip 角色 版本
ubuntu-16.04.4-server-amd64 192.168.10.122 Jenkins+harbor Jenkins 2.176.2,harbor 1.8.1
ubuntu-16.04.4-server-amd64 192.168.10.134 gitlab gitlab-ce_12.1.4
ubuntu-16.04.4-server-amd64 192.168.10.130 k8s master kubernetes 1.15.2
ubuntu-16.04.4-server-amd64 192.168.10.131 k8s node kubernetes 1.15.2

由于资源紧张,Jenkins+harbor合并为一台了。实际上,应该是要单独部署的。

k8s安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11317844.html

gitlab安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11329018.html

harbor安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11326467.html

Jenkins安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11323795.html

注意:Jenkins安装之后,还需要做以下配置。否则无法实现本文章的功能!!!

Jenkins基于https的k8s配置,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11338827.html

GitLab+Jenkins持续集成,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11425560.html

Jenkins配置maven,请参考链接:

https://www.cnblogs.com/xiao987334176/p/11433636.html

二、gitlab创建maven项目

首先从github上面,找一个基于maven的项目,地址如下:

https://github.com/solochen84/SpringBootDemo

使用git客户端,下载此项目代码

创建项目

登录gitlab,创建一个项目springbootdemo

点击 设置--> 成员

添加2个成员,一个是jenkins用户,用来拉取代码的。一个是我,用来提交代码的。

注意:我的账号,权限要高一些,可以直接提交到master分支。

将github下载的代码,提交到刚刚创建的项目中。效果如下:

三、harbor 创建用户和项目

创建jenkins用户

登录到harbor后台,点击创建用户

注意,每一项都填写一项。尤其是密码,必须符合密码复杂性要求。

创建项目

点击新建项目

输入名字,java。这就是私有项目。

点击java

点击成员-->用户

输入jenkins,会有提示的。角色选择 开发人员。

四、jenkins修改默认用户

使用jenkins执行shell命令时,可能会出现权限不足的情况。

查看jenkins默认用户

cat /etc/default/jenkins

内容如下:

# pulled in from the init script; makes things easier.
NAME=jenkins # arguments to pass to java # Allow graphs etc. to work even when an X server is present
JAVA_ARGS="-Djava.awt.headless=true" #JAVA_ARGS="-Xmx256m" # make jenkins listen on IPv4 address
#JAVA_ARGS="-Djava.net.preferIPv4Stack=true" PIDFILE=/var/run/$NAME/$NAME.pid # user and group to be invoked as (default to jenkins)
JENKINS_USER=$NAME
JENKINS_GROUP=$NAME
...

可以发现JENKINS_USER和JENKINS_GROUP变量的值是jenkins

修改默认用户为root

将下面2个变量,修改为root

JENKINS_USER=root
JENKINS_GROUP=root

重启jenkins服务

service jenkins restart

五、jenkins和k8s master做ssh免密

为什么要和k8s master做ssh免密呢?因为jenkins需要登录到k8s master,做一些pod操作。

生成秘钥

登录到jenkins服务器,生成秘钥

ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

copy秘钥

ssh-copy-id 192.168.10.130

测试root免密

ssh 192.168.10.130

如果没有提示输入密码,说明成功了!

六、jenkins登录harbor

修改docker配置文件,添加harbor地址

vim /etc/docker/daemon.json

内容如下:

{"insecure-registries": ["192.168.10.122"]}

重新加载docker配置

/etc/init.d/docker reload

测试登录

root@ubuntu:~/docker_dir# docker login 192.168.10.122 -u jenkins -p Jenkins@1234
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded

如果出现

Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused

表示 /etc/docker/daemon.json 文件修改不正确

七、jenkins创建maven项目

新建任务

登录到jenkins后台,点击 新建Item

输入名称,选择构建一个maven项目。注意:任务名称最好是项目名,因为下面的deploy_docker.sh脚本,会调用这个变量。

设置参数化构建

丢弃旧的构建,保留2天

设置源代码

输入仓库下载地址,选择用户root

设置maven构建命令

输入命令:clean package

mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。

package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

jar包打包成docker镜像并推送

执行shell命令

build完成之后,选择执行shell命令

将下面的内容,贴过去

#!/bin/bash

jarName=spring-boot-demo-0.0.-SNAPSHOT.jar
jarFolder=$JOB_NAME
harborPro=java
projectName=$JOB_NAME docker_path=${WORKSPACE} cp ${WORKSPACE}/target/${jarName} ${docker_path}
bash -x /root/docker_dir/deploy_docker.sh ${harborPro} ${projectName} ${docker_path} ${jarName}

内容解释:

jarName jar包的文件名,名字随便

jarFolder jar包的文件夹

harborPro harbor里面的项目,在上面步骤中,创建java私有项目。

projectName 项目名,名字随便

docker_path docker命令的工作目录

最后一步,会执行一个shell脚本。下面说到!

效果如下:

定义shell脚本

登录到jenkins服务器,创建目录

mkdir /root/docker_dir

编辑deploy_docker.sh脚本

cd /root/docker_dir/
vim deploy_docker.sh

内容如下:

#!/bin/bash
# maven $workspace $jarname
# ${harborPro} ${projectName} ${docker_path} ${jarName} set -e
harbor_project=$
projectName=$
docker_path=$
appName=$ # harbor认证用户
user_name=jenkins
password=Jenkins@ # harbor地址以及tag
tag=$(date +%s)
harbor_server=192.168.10.122
server_path=${harbor_server}
taget_image=${projectName}:${tag}
#${BUILD_NUMBER}
echo ${taget_image} # 登录docker
cd ${docker_path}
sudo docker login ${harbor_server} -u ${user_name} -p ${password} # 生成镜像并推送到harbor,最后删除本地镜像
sudo docker build --build-arg app=${appName} -t ${taget_image} .
sudo docker tag ${taget_image} ${server_path}/${harbor_project}/${projectName}
echo "The name of image is ${server_path}/${harbor_project}/${projectName}"
sudo docker push ${server_path}/${harbor_project}/${projectName}:latest
sudo docker rmi -f $(docker images|grep ${projectName}|grep ${tag}|awk '{print $3}'|head -n )

添加执行权限

chmod  /root/docker_dir/deploy_docker.sh

yaml文件拷贝到k8s master上并运用应用

k8s master 操作

登录到k8s master,创建目录

mkdir kube-conf

删除gitlab springbootdemo项目中的kube.yaml,新增2个yaml文件。

ph-service.yaml

apiVersion: v1
kind: Service
metadata:
name: ph-service
spec:
type: NodePort
ports:
- name: ph
port:
nodePort:
targetPort:
protocol: TCP
selector:
app: ph

ph-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
name: ph-rc
spec:
replicas:
template:
metadata:
labels:
app: ph
spec:
imagePullSecrets:
- name: harborsecret
containers:
- name: ph
image: 192.168.10.122/java/ph:latest
imagePullPolicy: Always
ports:
- containerPort:
env:
- name: key
value: "value"

将2个yaml文件提交到gitlab

k8s 生成imagePullSecrets,请参考以下链接

https://www.cnblogs.com/xiao987334176/p/11434326.html

注意:使用docker登录用户时,指定jenkins

docker login 192.168.10.122 -u jenkins -p Jenkins@

jenkins操作

登录到jenkins服务器,新增重启应用脚本

cd /root/docker_dir
vim reboot_app.sh

内容如下:

#!/bin/bash
MASTER="192.168.10.130"
CONF_DIR="/root/kube-conf"
ProJ=${JOB_NAME} scp ${WORKSPACE}/*.yaml ${MASTER}:${CONF_DIR}
# Pod running process
RUN=$(ssh $MASTER kubectl get po|grep -w ${ProJ}|wc -l)
if [ $RUN -eq 0 ];then
ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-rc.yaml
ssh ${MASTER} kubectl apply -f ${CONF_DIR}/${ProJ}-service.yaml
else
# Delete pod
podname=$(ssh ${MASTER} kubectl get po|grep -w ${ProJ}|awk '{print $1}')
ssh ${MASTER} kubectl delete po $podname --grace-period=0 --force
ssh ${MASTER} kubectl get po|grep ${ProJ}
fi

添加执行权限

chmod 755 /root/docker_dir/reboot_app.sh

添加执行shell命令

将下面的内容,贴过去

#!/bin/bash

bash -x /root/docker_dir/reboot_app.sh

效果如下:

手动构建应用

点击Build Now

点击#1

点击控制台输出

它会自己下载一些组件,需要等待一段时间。

出现spring图标,表示应用开始启动构建了。

最后出现错误

为啥呢? 查看springbootdemo 的Dockerfile文件,查看第一行

FROM registry-scu.cloudtogo.cn/ubuntu:jdk

需要把 registry-scu.cloudtogo.cn 添加到 /etc/docker/daemon.json中

登录到jenkins服务器,修改 /etc/docker/daemon.json

vim /etc/docker/daemon.json

内容如下:

{"insecure-registries": ["192.168.10.122","registry-scu.cloudtogo.cn"]}

重新加载docker

/etc/init.d/docker reload

再次手动构建一次,点击Build Now

查看构建过程

出现以下提示,说明正在下载镜像 registry-scu.cloudtogo.cn/ubuntu:jdk

最后提示执行完成

查看harbor仓库

会发现多了一个镜像,这个镜像,就是刚刚构建时,提交的。

八、访问k8s 应用

查看Pod状态

root@k8s-master:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ph-rc-nj7j2 / ImagePullBackOff 5m19s 192.168.36.68 k8s-node1 <none> <none>

发现pod运行在k8s-node1 这台服务器,状态是ImagePullBackOff

查看pod详细信息

kubectl describe po maven-deployment-7bd87867f8-6tlgp

输出:

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m15s default-scheduler Successfully assigned default/maven-deployment-7bd87867f8-6tlgp to k8s-node1
Normal Pulling 5m49s (x4 over 7m14s) kubelet, k8s-node1 Pulling image "192.168.10.122/maven:latest"
Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Failed to pull image "192.168.10.122/maven:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused
Warning Failed 5m49s (x4 over 7m14s) kubelet, k8s-node1 Error: ErrImagePull
Normal BackOff 5m36s (x6 over 7m13s) kubelet, k8s-node1 Back-off pulling image "192.168.10.122/maven:latest"
Warning Failed 2m11s (x20 over 7m13s) kubelet, k8s-node1 Error: ImagePullBackOff

出现

Get https://192.168.10.122/v2/: dial tcp 192.168.10.122:443: connect: connection refused

说明,k8s-node1 这台服务器的 /etc/docker/daemon.json 没有更改

登录到k8s-node1 这台服务器,修改文件

vim /etc/docker/daemon.json

内容如下:

{"insecure-registries": ["192.168.10.122"]}

重新加载docker

/etc/init.d/docker reload

重新加载pod

登录到k8s master服务器,删除pod,重新应用

root@k8s-master:~# cd /root/kube-conf/
root@k8s-master:~/kube-conf# kubectl delete -f ph-rc.yaml
service "maven-service" deleted
deployment.extensions "maven-deployment" deleted
root@k8s-master:~/kube-conf# kubectl apply -f ph-rc.yaml
service/maven-service created
deployment.extensions/maven-deployment created

再次查看状态

root@k8s-master:~/kube-conf# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ph-rc-7bd7475544-q9b6j / Running 27s 192.168.36.77 k8s-node1 <none> <none>

发现处于Running状态了

访问应用页面

查看svc暴露的端口

root@k8s-master:~/kube-conf# kubectl get svc|grep maven
ph-service NodePort 10.98.152.31 <none> :/TCP 4m

可以发现,暴露的端口是31002

使用谷歌访问页面

http://192.168.10.130:31002/

效果如下:

使用k8s-node1 的ip

http://192.168.10.131:31002/

效果同上!

九、更新应用代码

打开本地的项目springbootdemo,修改文件IndexController.java

路径如下:

springbootdemo\src\main\java\com\example\demo\web\controller

修改下面2行内容,把数字加1

jsonObject.put("welcome", "");
jsonObject.put("welcome", "");

重新提交到gitlab,然后重新构建一次,点击Build Now

等待构建成功后,刷新页面

发现内容已经更新了!

文本参考链接:

https://linux265.com/news/3465.html

https://www.cnblogs.com/aguncn/p/9789320.html

https://juejin.im/post/5c07b1126fb9a049e82b4cfe

Jenkins+harbor+gitlab+k8s 部署maven项目的更多相关文章

  1. Jenkins+Git+Docker+K8s部署

    准备工作 Jenkins已安装 Docker和K8s部署运行成功 代码管理工具使用Git 最近公司项目使用Jenkins+Git+Docker+K8s进行持续化构建部署,这里笔者整理了一下构建部署的相 ...

  2. Intellij 部署maven项目

    一 部署Maven项目 1.下载和配置 (1)下载:maven.apache.org,点击download,下载apache-maven-3.3.9-bin.zip (2)配置环境变量: 环境变量包括 ...

  3. 部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener【转】

    部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi ...

  4. Jenkins Ansible GitLab 自动化部署

    Jenkins Ansible GitLab 自动化部署 DevOps https://www.cnblogs.com/yangjianbo/articles/10393765.html https: ...

  5. Jenkins部署maven项目到远端服务器

    jenkins服务器地址:192.168.1.203 项目部署机器地址:192.168.1.201,192.168.1.200 代码托管github 虽然比较low,但是入门是可以的! Jenkins ...

  6. jenkins介绍及部署tomcat环境、部署Maven项目及密码忘记修改

    安装配置jenkins: jenkins安装方式一:war包 1.先安装tomcat将jenkins,war直接放到webapps目录下 2.通过java-jar jenkins.war --http ...

  7. Jenkins构建部署Maven项目

    1 创建新项目 2 构建maven项目 3 配置 3.1  源代码管理 svn 用户名,密码 4 配置maven打包 配置SSH 保存之后 立即构建 执行成功

  8. K8S 部署 SpringBoot 项目(一篇够用)

    现在比较多的互联网公司都在尝试将微服务迁到云上,这样的能够通过一些成熟的云容器管理平台更为方便地管理微服务集群,从而提高微服务的稳定性,同时也能较好地提升团队开发效率. 但是迁云存在一定的技术难点,今 ...

  9. maven的配置环境及Myeclipse部署Maven项目

    1.官网下载maven>解压>配置环境变量:在path后面加上 D:\software\apache-maven-3.3.9\bin; 2.cmd/mvn -version 测试  显示版 ...

随机推荐

  1. cogs 943. [東方S3] 铃仙•优昙华院•稻叶

    二次联通门 : cogs 943. [東方S3] 铃仙•优昙华院•稻叶 /* cogs 943. [東方S3] 铃仙·优昙华院·稻叶 概率dp 貌似做麻烦了 邻接矩阵和链式前向星都用上了... dp[ ...

  2. Spring Boot进阶系列一

    笔者最近在总结一个 Spring Boot实战系列,以方便将来查找和公司内部培训用途. 1.Springboot从哪里来 SpringBoot是由Pivotal团队在2013年开始研发.2014年4月 ...

  3. AttributeError: 'builtin_function_or_method' object has no attribute 'reshape'

    AttributeError: 'builtin_function_or_method' object has no attribute 'reshape' 读取.mat文件时,copy没加括号

  4. SpringMVC(十四):SpringMVC 与表单提交(post/put/delete的用法);form属性设置encrypt='mutilpart/form-data'时,如何正确配置web.xml才能以put方式提交表单

    SpringMVC 与表单提交(post/put/delete的用法) 为了迎合Restful风格,提供的接口可能会包含:put.delete提交方式.在springmvc中实现表单以put.dele ...

  5. 一个android任务提醒程序

    需求: 运行建立多个提醒,每个提醒设置一个时间,到达指定时间后跳出提醒窗体 每个提醒有一个执行按钮,点击后保存执行记录,并且当天不再触发提醒窗体 提醒出现后如果任务还没执行,那么需要在30分钟后再次提 ...

  6. CentOS7下安装ELK(nginx 、elasticsearch-5.1.1、logstash-5.1.1、kibana-5.1.1)

    nginx: #直接yum安装: [root@elk-node1 ~]# yum install nginx -y 官方文档:http://nginx.org/en/docs/http/ngx_htt ...

  7. MYSQL定时任务-定时清除备份数据

    背景 由于项目需要,每个月的历史存量数据需要进行一个归档和备份操作,以及一些日志表需要进行一个明细字段清除,让mysql数据库磁盘节省空间.则需要一些定时任务来定时清理这些数据. 技术选型 Java ...

  8. 基于webpack4的react开发环境配置

    一.基础配置 1.init项目 mkdir react-webpack4-cook cd react-webpack4-cook mkdir src mkdir dist npm init -y 复制 ...

  9. 【GMT43智能液晶模块】例程十六:LAN_TCPS实验——以太网数据传输

    源代码下载链接: 链接:https://pan.baidu.com/s/1e5Qp-xASjlA0pje3S7TdIg提取码:9v37 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43购 ...

  10. sqlserver2012 用户指定数据库访问权限

    这样 用户进入的时候 就只能访问指定数据库 点击其他 显示