持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD)在项目中也算是比较重要的一部分,在我进行项目容器化的过程中,发现不断的自己去手工操作kubectl实在是太麻烦了,也不容易形成记录,在查找了一下资料后,选用了Jenkins进行CI/CD,下面通过一个具体的实例来记录我使用Jenkins的过程,有问题欢迎讨论( ̄ェ ̄;)。我的K8s是单Master多worker,多Master的话可能有不一样的地方,请酌情查看。
这一步网上教程挺多的了,官网->https://www.jenkins.io/zh/有详细的步骤,跳过了。需要注意的是安装Jenkins的服务器需要安装Java8、Git、Maven环境。由于需要使用到Git SSH,所以需要在服务器上生成公钥和私钥
git config --global user.name "yunlingfly"
git config --global user.email "[email protected]"
ssh-keygen -t rsa -C "[email protected]"
另外需要建立一个软连接防止运行构建的时候mvn找不到(Jenkins 通过shell脚本调用mvn 命令的时候,是从/usr/bin 文件夹中找命令的),详细可以戳->jenkins mvn:命令未找到。
mvn help:system # 在/root下生成m2仓库
ln -s /usr/maven/apache-maven-3.6.3/bin/mvn /usr/bin/mvn
新建一个Springboot的项目,编辑application.yml改个端口
server:
port: 8888
创建一个Controller
package cn.yunlingfly.springbootjenkins.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试类
*
* @author yunlingfly
* @date 2020-7-20
*/
@RestController
public class TestController {
@GetMapping("/get")
public String helloWorld() {
return "Hello world";
}
}
在根目录下新建build目录,新建build.sh文件内容如下如果没有搭建私有Harbor的话也可以使用dockerhub,但一般来说为了项目的安全还是应该自建镜像仓库的,可以看我之前的博客搭建Harbor->Harbor 1.8的安装和使用
export JENKINS_HOME="/root/.jenkins/workspace/springboot-jenkins"
export JENKINS_VERSION="v0.1"
echo "JENKINS_HOME:${JENKINS_HOME},JENKINS_VERSION:${JENKINS_VERSION}"
echo "开始打包"
mvn clean
mvn package
echo "开始制作镜像"
docker build -t 你的私有Harbor地址/yunlingfly/jenkins:$JENKINS_VERSION $JENKINS_HOME
echo "开始推镜像"
docker push 你的私有Harbor地址/yunlingfly/jenkins:$JENKINS_VERSION
echo "开始运行镜像"
kubectl apply -f $JENKINS_HOME/build/jenkins-svc.yaml
# 使用envsubst传递export的参数
envsubst < $JENKINS_HOME/build/jenkins-deployment.yaml | kubectl apply -f -
编写Dockerfile
# Java8镜像
FROM yunlingfly/base:latest
WORKDIR /
# 将系统编码设置为c.utf-8,默认的POSIX不支持中文
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8
ENV LC_ALL C.UTF-8
# 将子项目打包的jar包拷贝到项目根目录
COPY target/springboot-jenkins-0.0.1-SNAPSHOT.jar /jenkins.jar
# 设置容器启动时执行的命令,-Dfile.encoding=utf-8
CMD ["java", "-jar", "jenkins.jar"]
编写暴露端口的Service:jenkins-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkinks-service
labels:
app: jenkinks-service
spec:
type: NodePort
ports:
- port: 8888
name: jenkinks-service
targetPort: 8888
nodePort: 32088
protocol: TCP
selector:
app: jenkinks-service
编写Deployment: jenkins-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkinks-deployment
spec:
replicas: 1
selector:
matchLabels:
name: jenkinks-service
template:
metadata:
labels:
name: jenkinks-service
app: jenkinks-service
spec:
containers:
- name: jeecg
image: 你的私有Harbor地址/yunlingfly/jenkins:$JENKINS_VERSION
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
新建一个仓库起名springboot-jenkins,把你之前生成的公钥放到你的GitLab上,这样Jenkins就能直接拉代码了
cat /root/.ssh/id_rsa.pub
新建Item->Freestyle project 起名springboot-jenkins
General你可以随意填
源码管理选git,URL填你GitLab仓库的SSH地址,Credentials不需要填了,因为我们之前配过公钥了,其他默认就行
构建触发器,勾选Build when a change is pushed to GitLab,然后会打印出GitLab webhook URL,这个URL等会需要填到GitLab里,点击高级,点击generate生成Secret token,等会在Gitlab需要用到这两个参数
构建环境,不需要配置
构建,添加构建步骤-> execute shell输入下面的命令
# /root/.jenkins/workspace目录是Jenkins构建项目的目录
sh /root/.jenkins/workspace/springboot-jenkins/build/build.sh
构建后操作,不需要设置
然后就可以应用/保存了
下面设置是表示如果有push时间的话会调用你设置的Url,然后Jenkins就会把仓库的代码pull下来构建。先将你的Springboot项目push到仓库里,点击Setting->Integrations/WebHooks,这里的URL填入你 构建触发器 里的那个URL,例如http://你的Jenkins_Ip地址:8080/project/springboot-jenkins/build,Secret Token也是在填入 构建触发器 生成的那个token,然后就可以保存了。测试一下:点击Test->Push Event看看有没有成功,如果出现错误“Requests to the local network are not allowed”,需要使用admin用户设置允许webhooks和本机网络交互,具体查看博客->【GitLab】gitlab上配置webhook后,点击测试报错:Requests to the local network are not allowed
上面的设置表示每一次master分支有push就会触发一次构建,之后就可以在Jenkins查看每一次构建日志输出了,如果出错也可以在这里查看。当然这里只管构建的错误,如果K8s在运行镜像的时候出了错误就不能在这里看到了,例如ERROR ImagePull,这种错误的话还是得通过K8s的日志或是其他的K8s监控工具查看
都没有错误的话可以访问http://Master_Ip:32088/get 即可看到输出Hello world