Bootstrap

rancher+k8s+jenkins+harbor打包springboot的CI/CD过程

1.rancher环境下jenkins安装

1.1 jenkins镜像:jenkins/jenkins:latest,下载最新镜像安装

1.2 jenkins端口映射

1.3 jenkins目录挂载

 1.4 因为挂载目录最好不要变化,所以启动pod的节点最好固定

 1.5 因为运行docker环境需要管理员权限所以指定用户为0即可,当然前提是你的node节点上已经安装了docker环境

1.6 启动后访问jenkins

2. jenkins初始化及插件安装

2.1 初始化密码可以在jenkins首次启动的日志中查看,添加初始化管理员账号后进入初始化jenkins插件安装界面,耐心等待哦局完成,如果安装超时失败可以替换成国内镜像

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

 

位置在这里,就是前面rancher中挂载出来的node节点目录下,url替换成国内清华的镜像地址

2.2 附加插件安装

  • CloudBees Docker Build and Publish:docker打包镜像并推送镜像仓库
  • Docker Pipeline:构建docker流水线
  • Git Parameter:参数化构建插件
  • Gitlab:gitlab触发自动构建插件(其他托管仓库自行替换)
  • maven:打包
  • version number:自定义镜像版本号
  • redeploy-rancher2-workload:触发镜像自动部署rancher

注意:rancher插件安装github的:插件库的乱码有问题GitHub - jenkinsci/redeploy-rancher2-workload-plugin: A Jenkins plugin to redeploy Rancher2.x workload

其他按照自己使用在添加,不是固定的

2.3 必要的全局权限要先添加,也可以在构建时碰到时在添加

从上往下依次:gitlab账号密码、rancher授权配置、rancher2.x部署配置、gitlab触发token设置

gitlab账号密码没有可说的,就是下载代码的托管仓库的账号密码

rancher2.x权限配置: 

对应上图生成的值填上

gitlab触发token设置:gitlab右上角的个人设置里面(Access Token)创建一个个人token

rancher2.x部署配置在下面介绍

3. 打包项目上传镜像仓库自动部署到rancher中(终) 

 3.1项目创建

3.2 配置(注意标号位置,挨个解释)

  1. 上面添加的gitlab的token授权
  2. 使用Git Parameter插件后出现的参数选择,${XXX}可以引用该值,这里指定打包分支
  3. 指定打包分支
  4. 添加rancher2.x插件后出现此构建触发,意思是当设定的分支(构建触发项的高级选项里面有设置,不设置默认所有分支)有代码提交时自动触发jenkins打包操作,添加gitlab的webhooks钩子设置,在url前面添加(账号:token)不然提交会报错,token获取方式如下
  5. version number插件添加后的构建环境,可以自定义构建的版本号,此处格式为:分支.月.日.当天构建成功序号
  6. 使用maven进行打包,注意maven打包命令即可(下面有详细扩展),如果是微服务类项目单独子模块打包的话maven 命令需要使用 -pl 子模块名 -am 命令指定模块和模块依赖,docker build注意指定dockerfile文件的路径 ./子模块名
  7. 此处没有使用CloudBees Docker Build and Publish插件打包上传镜像(当然也可以使用), 本项目使用了原始shell脚本的方式调用docker命令打包并上传harbor,注意如果是子模块打包需要指定子模块的DockerFile文件路径,“.”代表系统根目录
  8. rancher2.x插件的自动部署rancher功能,添加构建后步骤,秘钥为前面添加rancher部署授权,工作负载API地址获取跳转的页面浏览器地址v3后面的部分就是了,镜像就是上面推送的镜像:版本号

3.3 至此所有配置完成,检验一下成果吧!

我配置的分支是dev_security_xxx分支 ,代码提交成功后触发了jenkins自动打包,打包版本号按照设置的版本号规则生成,只有当构建成功后最后的序号会自动加一。

从日志中能看到镜像已经上传到harbor上了,并且rancher的工作负载已经从原镜像更新到了新的镜像上,至此成功!

4.maven设置(题外) 

 4.1 jenkins打包需要使用jdk和maven的全局设置,jenkins官网已经发公告了,未来jenkins最低支持jdk版本为11...,大写的懵逼

 4.2 maven安装选3.8.4,高版本的冲突不要选

 4.3 maven配置文件设置,安装Config File Provider插件后会出现Managed Files,添加一个maven配置文件,如下

主要修改内容如下:

支持pom中定义的maven打包命令

  <pluginGroups>
    <pluginGroup>com.spotify</pluginGroup>
  </pluginGroups>

添加harbor仓库配置,仓库是harbor的话id为仓库地址,其他仓库可以自定义(dockerfile:push用)

<servers>
    <server>
		<id>harbor-xxxxxx</id>
		<username>xxxxxx</username>
		<password>xxxxxx</password>
		<configuration>
			<email>[email protected]</email>
		</configuration>
	</server>
  </servers>

添加私有化maven仓库地址,能够下载模块项目依赖

<mirrors>
    <mirror>
       <id>maven-public</id>
       <mirrorOf>*</mirrorOf>
       <url>http://nexus.xxxxx.cn/repository/maven-public</url>
	</mirror>
  </mirrors>

然后再构建中使用该配置文件

​​​​​​​ 

 4.4 打包方式举例

使用maven的打包方式:pom中<plugins>模块下添加这个就可以了,打包命令mvn clean package

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

镜像构建:需要创建DockerFile文件,默认放在模块根目录下,内容可以查询度娘

使用docker的方式打包:pom中添加 

使用dockerfile的打包方式:pom中添加如下:mvn clean package dockerfile:build dockerfile:push

            <!--docker打包插件,需要docker环境的支持。-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>harbor</id>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <repository>harbor-xxxxxx.cn/xxxxxxx/${docker.image}</repository>
                    <tag>${docker.version}</tag>
                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>

;