在完成前文的pipeline项目构建和更新之后,本文我们来测试maven项目的构建自动发布。具体环境要求如下:

1、docker私有仓库(本例中使用vmware企业级产品harbor)
2、jenkins插件Publish Over SSH安装完成
3、Jenkins Slave Pod中需要有Docker环境(因为post step1中需要将war文件打包到docker镜像中,因此Jenkins Slave需要有Docker环境,本例中采用在云环境pod模板中添加hostpath挂载的方式实现)
4、项目代码中需要包含如下文件
Dockerfile(用来编译docker镜像)
tomcat.yaml(用来初次部署,根据实际情况包含deployment、service、ingress、pv\pvc等)
rolling-update.sh(用来滚动更新)

1、Dockerfile

FROM  harbor.59iedu.com/fjhb/tomcat_base:v1.0
MAINTAINER ylw "ylw@fjhb.cn"
RUN  rm -rf  /home/tomcat/webapps/*
COPY target/*.war /home/tomcat/webapps/ROOT/
RUN  cd /home/tomcat/webapps/ROOT/ && jar -xvf *.war && rm -rf *.war

harbor.59iedu.com/fjhb/tomcat_base:v1.0 镜像的dockerfile请参考前文:
http://blog.51cto.com/ylw6006/2107307

2、tomcat.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tomcat-jcsj
  namespace: default
spec:
  replicas: 2
  template:
    metadata:
      labels:
        k8s-app: tomcat-jcsj
    spec:
      containers:
      - image: harbor.59iedu.com/fjhb/jcsj:vBUILD_NUMBER
        name : tomcat-jcsj
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: app-logs
          mountPath: /home/tomcat/logs
      - image: harbor.59iedu.com/fjhb/filebeat:v1.0
        name: filebeat
        imagePullPolicy: Always
        volumeMounts:
        - name: app-logs
          mountPath: /log
      volumes:
      - name: app-logs
        emptyDir: {}
      imagePullSecrets:
        - name: harborsecret
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-jcsj
  labels:
    k8s-app: tomcat-jcsj
spec:
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: http
    nodePort: 8480
  selector:
    k8s-app: tomcat-jcsj

3、rolling-update.sh

#!/bin/sh
NAMESPACE=default
DEPLOYMENT=tomcat-jcsj
REGISTRY=harbor.59iedu.com/fjhb/jcsj
FILE=tomcat.yaml
BUILD_NUMBER=1
STATUS=$(kubectl get deployment -n $NAMESPACE |grep $DEPLOYMENT |wc -l)

if [  $STATUS -eq 0 ];then
   kubectl create -f $FILE
   else
   kubectl set image deployment/$DEPLOYMENT $DEPLOYMENT=$REGISTRY:v$BUILD_NUMBER --namespace=$NAMESPACE
fi

一、系统设置

1、添加k8s master的ssh认证信息
Jenkis maven构建项目实践
点击“jenkins” —— “系统管理”—— “系统设置”——“Publish over SSH”
输入主机的名称、ip地址及用户名,点击“高级”,在“passphrase/password”栏输入密码,点击下方的“Test Configuration”测试连接,当出现“Success”提示时说明连接成功。

Jenkis maven构建项目实践

2、在云环境的pod模板中添加docker环境
Jenkis maven构建项目实践

二、创建任务

点击“jenkins” ——“新建” ——“构建一个maven项目”,输入项目的名称,点击“OK”
Jenkis maven构建项目实践

三、General配置

Jenkis maven构建项目实践
勾选“Restrict where this project can ben run”,输入前面创建kubernetes环境时配置好的容器模板名称jenkins-slave。这样在运行构建任务的时候会k8s集群自动启动一个slave pod进行构建工作,构建工作完成后自动销毁pod

四、源码管理配置

Jenkis maven构建项目实践
1、可以选择git或者svn进行源码管理,如果没有出现这两个按钮,需要去安装相应的插件
2、点击credentials栏的add按钮可以添加svn账号信息,选择类型为“username with password

3、checkout strategy选择“use svn update as much as possible”

五、构建触发器配置

Jenkis maven构建项目实践
在构建触发器配置中选择“build wheneven a snapshot dependency is built”

六、Pre Steps配置

Jenkis maven构建项目实践
Root POM框输入pom.xml
Goals and options框输入clean compile package

七、Post Steps配置1

Jenkis maven构建项目实践
点击“add post-build step”——“execute shell”——“run only if build susseeds”
shell脚本内容如下:

IMAGE_NAME="harbor.59iedu.com/fjhb/jcsj:v$BUILD_NUMBER"
CONATINER_NAME="jcsj-dev"
echo "192.168.1.227 harbor.59iedu.com" >> /etc/hosts
cd /home/jenkins/workspace/maven-test/
sed -i  "s/BUILD_NUMBER/$BUILD_NUMBER/g" tomcat.yaml
sed -i  "s/BUILD_NUMBER=1/BUILD_NUMBER=$BUILD_NUMBER/g" rolling-update.sh
docker login harbor.59iedu.com -u admin -p Harbor12345
docker build -t $IMAGE_NAME .
docker push $IMAGE_NAME

上述脚本的作用是将前面编译好的war包build成镜像文件并推送到仓库,并完成部署文件和自动更新文件中的镜像版本号修改。

八、Post Steps配置2

Jenkis maven构建项目实践

点击“add post-build step”——“Send files or execute command over SSH”
1、Name框选择前面创建好的k8s master节点vm1
2、Source files 框输入tomcat.yaml, rolling-update.sh
3、Exec command框输入sh rolling-update.sh

九、构建与发布测试

1、构建前
Jenkis maven构建项目实践
2、构建中
Jenkis maven构建项目实践
Jenkis maven构建项目实践
Jenkis maven构建项目实践
3、构建完成
Jenkis maven构建项目实践
Jenkis maven构建项目实践
4、测试与验证
Jenkis maven构建项目实践
Jenkis maven构建项目实践