JAVA一条龙持续集成方案(完整步骤+脚本+配置)

自建自动化持续集成方案

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加



前言

提微服务开发过程中,开发人员需要不断编码、编译、打包、上传、构建镜像、发布镜像、发布服务、自动化测试等一系列步骤,如何才能有效的减少各环节之间时间,减少开发者的工作量,形成一套自动化的体系?

以下内容的前提是基于微服务架构的开发,单体架构会简单很多,自行按需搭建即可。

一、组成部分

  1. Jenkins – 用于建立构建任务

  2. Gitlab、Github等git系代码仓库 – 本文不支持SVN体系下的自动化持续集成,如果你的代码库使用的SVN,只有以下两种选择
    a. 不要浪费时间看下面的内容
    b. 代码库切换到Git仓库

  3. Maven仓库 – 自建Nexus,阿里云云效Maven,其他公共Maven仓库,建议使用自建Nexus

  4. Docker仓库 – 自建Harbor,阿里云镜像仓库,Docker公共仓库,建议使用自建Harbor

  5. Kubernetes集群 – 阿里云Kubernetes集群,自建Kubernetes集群+Kuboard,建议自建集群,个人观点是阿里云的不好用,不顺手


以上组件的选择根据自己公司的财务情况可分为以下两种

  1. 资产充足,毫无压力
    建议所有组件都是自建方式,企业内部可见,使用灵活,各组件使用不受限制,可以最大化提供集成能力
  2. 财务紧张,运维能力有限
    Git、Maven、Docker仓库都使用云上免费服务,已知阿里云都有免费的相关服务,其他服务商未调研。

二、流程步骤

1. 流程图

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


2. 安装组件

1. 安装Gitlab

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
  gitlab/gitlab-ee:latest

官方文档

英文不好的朋友,请自行百度中文搭建文章,没有任何难度。


2. 安装Maven仓库

mkdir -p /data/nexus-data && \
chown -R 200 /data/nexus-data && \
docker run -d \
-p 8081:8081 \
--name nexus \
-e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g" \
-v /data/nexus-data:/nexus-data \
sonatype/nexus3

官方文档

英文不好的朋友,请自行百度中文搭建文章,没有任何难度。


3. 安装Harbor

  1. 打开下载地址 Harbor-Installer
    安装文件分为在线和离线,在线方式安装时会自动下载镜像,离线方式安装过程中无任何网络交互,如下载不成功,请使用vpn.
  2. 下载在线安装包 harbor-online-installer-v2.1.0
  3. 解压安装包并重命名harbor.yml.tmpl 为 harbor.yml
  4. 配置hostname, 注释掉https的配置(https自行配置)
  5. 运行安装文件
    sh prepare
    sh install.sh

Docker 默认使用Https协议
Https证书如何获取,请自行百度,本文不做说明

官方文档


4. 安装Jenkins

中文官方文档


5. 安装Kubernetes/Kuboard

中文官方文档
Kuboard文档


3. 准备打包服务器

1. 安装Python3

yum install -y pyphon3
pip3 install requests 

可选【修改Xml输出脚本】

执行以下脚本查看python安装路径
import sys
print(sys.path)
如图
在这里插入图片描述
修改文件 vim /usr/lib64/python3.6/xml/dom/minidom.py
在这里插入图片描述
改为在这里插入图片描述
此操作的目的是,再修改pom.xml后,解决xml的格式问题


4. 编写脚本

1. Shell脚本

脚本源码

|____notify
| |____dingding.sh – 发送钉钉通知
|____docker
| |____push_server_image.sh – 推送docker镜像
|____maven
| |____update_release_version.sh – 发布Release版本
| |____update_dependencies_version.sh – 更新依赖服务版本号
| |____package.sh – 打包Jar
|____k8s
| |____deploy.sh – 发布到 Kuberneters
|____in_one
| |____push_image.sh – 编译->打包->推送镜像
|____es
| |____update_version.sh – 更新服务Release版本,方便引用服务自动更新

2. Jenkins任务脚本

#!/bin/sh
set -ex

DD_TOKEN="此处填写钉钉机器人Token"
ES_URL="此处填写ES的索引查询url"
IMAGE_REPOSITORY_URL="此处填写Docker镜像仓库地址"

MSG_REP="镜像仓库: xxx \n服务版本: xxx \n"

GIT_SCRIPT_URL="git@gitee.com:sean-framework/deploy.git"

TMP_DIR=~/tmp/git

mkdir -p ${TMP_DIR}

cd ${TMP_DIR}

space=${repository_git_ssh_url%/*}
space=${space##*/}

server_name=${repository_git_ssh_url##*/}
server_name=${server_name%.*}

branch=${ref##*/}

timeStamp=$(date +%s)
GIT_DIR=${TMP_DIR}/code/${timeStamp}

GIT_SCRIPT_DIR=${TMP_DIR}/script/${timeStamp}

declare -A phones
#  此处修改为开发人员对应的user_id,和 手机号, 通知是可以@
phones["1"]="18072978089"

at=false

#根据key找到对应的value
phone=${phones[$user_id]}

check() {
	if [[ -z ${phone} ]]; then
		errormsg="用户id:"${user_id}",账号:"${user_name}"---未配置手机号"
		phone=18072978089
		sh ${GIT_SCRIPT_DIR}/notify/dingding.sh -m "${errormsg}" -t "${DD_TOKEN}" -p ${phone}
	fi
}

notify() {
	msg="${msg}\n日志:http://此处为Jenkins地址/job/server_version/${BUILD_NUMBER}/console"
	sh ${GIT_SCRIPT_DIR}/notify/dingding.sh -m "${msg}" -t "${DD_TOKEN}" -p ${phone}
}

# 根据自己的项目路径修改
if [[ ${space}s == servers ]] ; then

	# 删除分支, 清除k8s容器
	if [[ "${after}"s == 0000000000000000000000000000000000000000s ]]; then
		if [[ ${server_name}s != octopuss ]]; then
			set +e
			echo "删除服务 ${server_name}-${branch//./}"
			kubectl delete deploy ${server_name}-${branch//./} -n dev
			exit 0
		fi
	else
		mkdir -p ${GIT_DIR}

		version=${branch}

		if [[ ${branch}s != masters ]]; then
			arg="-b ${branch}"
		fi

		#label
		label="revision"

		# 下载代码
		git clone ${GIT_SCRIPT_URL} ${GIT_SCRIPT_DIR}
		check

		git clone ${arg} ${repository_git_ssh_url} ${GIT_DIR}

		if [[ "${before}"s == 0000000000000000000000000000000000000000s ]]; then
			# 新开分支,修改依赖版本号
			echo "新开分支"
			sh ${GIT_SCRIPT_DIR}/maven/update_dependencies_version.sh -b "${branch}" -l ${label} -d "${GIT_DIR}" -u "${ES_URL}"

			echo "通知"
			msg=${server_name}'新开分支['${branch}']\n依赖项目版本号已更新\n提交人:'${user_name}
			notify
		else
			# Master分支,需要发布RELEASE版
			if [[ ${branch}s == masters ]]; then
				at=true
				echo "修改版本为RELEASE"
				set +e
				sh ${GIT_SCRIPT_DIR}/maven/update_release_version.sh -d "${GIT_DIR}" -b "${branch}" -n "${server_name}" -l ${label} -u "此处为ES地址"
				ret=$?
				set -e
				if [ $ret -ne 0 ]; then
					exit 0
				fi

				cd ${GIT_DIR}
				version=$(grep -m 1 ${label} pom.xml | awk -F ">" '{print $2}' | awk -F "<" '{print $1}')
				msg="${MSG_REP}\n${server_name}[${version}]\nJar已发布到Maven仓库"
			else

				# 提交代码,上传maven仓库
				echo "Maven打包"
				set +e
				sh ${GIT_SCRIPT_DIR}/maven/package.sh -d "${GIT_DIR}" -c "deploy"
				ret=$?
				set -e
				if [ $ret -ne 0 ]; then
					msg="${server_name}[${branch}]打包失败!\n提交人:${user_name}"
					notify
					exit 0
				fi
				cd ${GIT_DIR}
				version=$(grep -m 1 ${label} pom.xml | awk -F ">" '{print $2}' | awk -F "<" '{print $1}')
				msg="${server_name}[${version}]\nJar已发布到Maven仓库"
			fi

			if [[ ${server_name}s != octopuss ]]; then
				echo "构建镜像"
				set +e
				sh ${GIT_SCRIPT_DIR}/docker/push_server_image.sh -d "${GIT_DIR}" -n "${server_name}" -v "${branch}" -j "${server_name}-server.jar" -r "${IMAGE_REPOSITORY_URL}" -c "${after}"
				ret=$?
				set -e
				if [ $ret -ne 0 ]; then
					msg="${server_name}[${branch}]构建镜像失败!\n提交人:${user_name}"
					notify
					exit 0
				fi

				msg="${msg}\n镜像已上传到Docker仓库"

				echo "部署"
				set +e
				sh ${GIT_SCRIPT_DIR}/k8s/deploy.sh -n "${server_name}" -v "${branch}" -r "${IMAGE_REPOSITORY_URL}"
				ret=$?
				set -e
				if [ $ret -ne 0 ]; then
					msg="${server_name}[${branch}]部署失败!\n提交人:${user_name}"
					notify
					exit 0
				fi

				msg="${msg}\n开发环境已部署成功"
			fi
			msg="${msg}\n提交人:${user_name}"
			echo "通知"
			set +e
			notify
			set -e
		fi

		set +e
		rm -fr ${GIT_DIR}
		rm -fr ${GIT_SCRIPT_DIR}
		set -e
	fi
fi

3. ES索引

5. 串联各个组件

  1. 创建钉钉机器人
  2. 添加SSH remote hosts
  3. 创建Jenkins Jos
  4. 配置Generic Webhook Trigger插件
  5. 配置任务名
  6. 添加SSH构建步骤
  7. 配置Gitlab Webhook

总结

关注公众号获取一手资料
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值