一.基于jenkins的自动化部署(推荐)

1.1主要内容:

  1. 开发者提交代码触发(人工)
  2. 第三方触发jenkins 部署(第三方可以是http请求,或者代码http请求,或者阿里云效流水线http请求,或者触发jenkins webhook请求等等) (人工)
  3. 流程自动触发:(自动)
    jenkins ->拉取代码->maven打包->镜像打包->容器仓库推送->触发rancher api部署

1.2配置

1.2.1配置jenkins maven项目

image.png

1.2.2配置项目git地址

路径:源码管理-Git-Repositories

说明:配置url和对应身份认证方式

image.png

1.2.3配置项目jdk

路径:General-JDK
image.png

1.2.4配置项目maven

路径:Pre Steps-Build

说明:
Maven Version:选择maven版本
Root POM:填写pom路径,例如 pom.xml
Goals and options:填写运行的mvn命令,例如clean package -Dmaven.test.skip=true -U -Ddocker.skip=true
image.png

1.2.5配置jenkins webhook配置

路径:构建触发器-触发远程构建 -身份验证令牌

说明:
身份验证令牌:自定义令牌
比如当前的需要填写分支部署触发的webhook
webhook:jenkins地址+/view/项目路径/buildWithParameters?token=自定义令牌

image.png

1.2.6配置jenkins 打包分支设置

路径:General-参数化构建过程-添加参数-字符参数

说明:
字段名:branch,默认值:dev
image.png

路径:源码管理-git-Branches to build

说明:
指定分支:$branch 是取上面的字段名对应的值
image.png

1.2.7shell配置镜像打包,容器仓库推送,远程部署触发

路径:Post Steps-Run only if build succeeds-执行 shell
具体命令:如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/bash
source /etc/profile
#
project="xxxx"
versionDate=`date +%Y%m%d%H%M%S`
version="latest"
baseName="xxx-name"
depositoryPath="registry-vpc.cn-shenzhen.aliyuncs.com"
depositoryAdmin="阿里云仓库账号"
depositoryPass="阿里云仓库密码"
#选择jdk版本
openjdkVersion="openjdk:8"

# 配置变量 参考上一篇文章的地址查询获取项目redeploy地址
RANCHER_URL="https://rancher地址/v3/project/xxxx/workloads/deployment:project:$project?action=redeploy"
RANCHERTOKEN="rancher token键:rancher token值"
echo -------------------------------------
# 进入项目target目录
cd $WORKSPACE/$project-web/target/
echo $WORKSPACE/$project-web/target/
#&& mv $project.jar app.jar
# 创建docker镜像
echo "构建Dockerfile"
cat <<EOF > Dockerfile
FROM $openjdkVersion
# 基础镜像使用java
# 设置工作目录,进入到容器中的初始目录,不存在会自动创建
ENV JAVA_OPTS='-Xmx512m'
RUN chmod 777 /home
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
ADD *.jar /home/
# 启动命令
CMD ["sh", "-c", "java \$JAVA_OPTS -jar /home/*.jar"]
EOF

echo "Dockerfile 创建完成。"
# 编译镜像
echo "开始构建当次镜像!"
docker build -t $depositoryPath/$baseName/$project:$versionDate .
docker tag $depositoryPath/$baseName/$project:$versionDate $depositoryPath/$baseName/$project:$version
# 上传到docker私服
#登录harbor仓库
docker login -u $depositoryAdmin -p $depositoryPass $depositoryPath
[ $? != 0 ] && echo "请注意,在执行login出错,故而退出!" && exit 1
echo "开始将镜像push到私服!"
docker push $depositoryPath/$baseName/$project:$version
docker push $depositoryPath/$baseName/$project:$versionDate
[ $? != 0 ] && echo "请注意,在执行push上传时出错,故而退出!" && exit 1
docker rmi $depositoryPath/$baseName/$project:$versionDate
docker rmi $depositoryPath/$baseName/$project:$version


# 触发重新部署
response=$(curl -k -u "${RANCHERTOKEN}" -X POST -H 'Content-Type: application/json' "${RANCHER_URL}")
# 发送请求重新部署工作负载,并捕获详细输出
response=$(curl -k -u "${RANCHERTOKEN}" -X POST -H 'Content-Type: application/json' "${RANCHER_URL}" -w "\n%{http_code}\n")

# 提取 HTTP 响应码
http_code=$(echo "$response" | tail -n1)

# 提取响应内容(去除最后一行的 HTTP 响应码)
response_content=$(echo "$response" | sed '$d')

# 检查请求结果
if [ $? -eq 0 ]; then
if [[ "$http_code" =~ ^2 ]]; then
echo "Deployment updated successfully."
# 输出响应内容(可选)
echo "Response: $response_content"
else
echo "Failed to update deployment. HTTP Status Code: $http_code"
echo "Response: $response_content"
exit 1
fi
else
echo "Failed to execute curl command."
echo "Response: $response_content"
exit 1
fi

二.基于云效部署(阿里云效流水线+rancher/k8s)

阿里云效流水线(Flow)是阿里云提供的一站式企业级DevOps平台,支持持续集成(CI)和持续交付(CD),助力企业实现研发流程自动化与高效协作
ps:阿里云效每月有3000核分免费额度,用完收费

2.1 主要内容

阿里云效流水线+rancher/k8s主要内容:

  1. 开发者提交代码触发(人工)
  2. 登录云效管理平台->流水线->对应流水线部署(人工)
  3. 流程自动触发:(云效该流程计费使用,每月一定免费额度)(自动)
    流水线->拉取代码->maven打包->镜像打包->容器仓库推送->触发rancher api部署/触发k8s部署

2.2云效配置

2.2.1创建流水线

路径:登录阿里云效-流水线-新建流水线-空白模板
image.png

2.2.2 配置项目git地址

路径:添加流水线-选择代码源
配置仓库地址,配置默认分支等

image.png

2.2.3 配置构建集群

路径:在阶段1配置空白任务
自定义任务名称如:java构建jar包,上传容器仓库
构建集群:选最近的集群
指定构建节点:看容器部署环境,一般选Linux/amd64
容器镜像地址:build-steps/alinux3
image.png

2.2.4 环境配置(maven,jdk,mvn执行命令)

路径:在任务步骤-添加步骤
依次添加配置
步骤1:添加”配置MavenSetting文件”,默认maven路径,自定义的需要额外配置,不展开说)
步骤2:添加”安装Java ”,选择jdk版本和maven版本
步骤3:添加”执行命令”,mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip

image.png

2.2.5 配置容器推送

路径:在任务步骤-添加步骤
添加步骤4:
个人镜像仓库选择“镜像构建并推送”
阿里云个人镜像仓库选择“镜像构建并推送至ACR(个人版)”
阿里云企业镜像仓库选择“镜像构建并推送至ACR(企业版)”

填写:
1.镜像地址
2.Dockerfile路径:指定镜像构建的 Dockerfile 路径,填写相对于工作目录的路径(在代码文件中,Dockerfile为默认代码根目录)
3.ContextPath:ContextPath为 Docker 构建的执行上下文,填写相对于代码根目录的路径,如target。如果不填则为 Dockerfile 文件所在目录。

图1
image.png

图2
image.png

2.2.6 部署发布(k8s或者rancher命令方式)

方案1:k8s集群部署
前提:已存在k8s集群
路径:新任务-配置k8s发布-配置选择需要部署的k8s集群
图1
image.png

图2
image.png

方案2:rancher命令部署
前提:已存在rancher管理k8s集群
路径:新任务-执行命令-执行命令-配置“执行命令”
具体命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# input your command here
echo hello,world!
# 配置变量 参考上一篇文章的地址查询获取项目redeploy地址
RANCHER_URL="https://rancher地址/v3/project/xxxx/workloads/deployment:project:$project?action=redeploy"
RANCHERTOKEN="rancher token键:rancher token值"

# 触发重新部署
response=$(curl -k -u "${RANCHERTOKEN}" -X POST -H 'Content-Type: application/json' "${RANCHER_URL}")
# 发送请求重新部署工作负载,并捕获详细输出
response=$(curl -k -u "${RANCHERTOKEN}" -X POST -H 'Content-Type: application/json' "${RANCHER_URL}" -w "\n%{http_code}\n")

# 提取 HTTP 响应码
http_code=$(echo "$response" | tail -n1)

# 提取响应内容(去除最后一行的 HTTP 响应码)
response_content=$(echo "$response" | sed '$d')

# 检查请求结果
if [ $? -eq 0 ]; then
if [[ "$http_code" =~ ^2 ]]; then
echo "Deployment updated successfully."
# 输出响应内容(可选)
echo "Response: $response_content"
else
echo "Failed to update deployment. HTTP Status Code: $http_code"
echo "Response: $response_content"
exit 1
fi
else
echo "Failed to execute curl command."
echo "Response: $response_content"
exit 1
fi

image.png