Jenkins+K8S流水線自動化部署Java程序


一、首先需要搭建好k8s集群以及在k8s集群中部署好Jenkins,這里就不做詳細介紹如何搭建k8s集群和在k8s集群中部署Jenkins,(具體過程可以參考之前文章進行部署)

1、這里我使用公有GitHub作為代碼倉庫,首先需要將GitHub代碼倉庫以及harbor鏡像倉庫賬戶和密碼在Jenkins添加上;(我這里是之前已經添加上了,如果沒有點擊憑據進行添加即可)

2、我們需要將代碼上傳到代碼倉庫,這里我使用rocketMQ-console為例,

1.我們先將源碼克隆本地:

git clone https://github.com/apache/rocketmq-externals.git

2.進入源碼目錄

[root@k8s-master]# cd /usr/local/src/rocketmq-externals

[root@k8s-master rocketmq-externals]# ll -a

里面有一個.git隱藏文件:

3.進入.git文件編輯config配置文件:vim config

4.將源碼上傳到你自己GitHub倉庫中;

 git remote add origin https://github.com/houyi199208/rocketmq-console.git

 git push -u origin master 這里master是分支

git push origin --tag 或者打tag號

執行完成后登陸自己代碼倉庫查看是否上有相關源碼

3、上面工作做好后我們接下在Jenkins上面創建第一個Java項目流水線

 

 

 

注意:

如果沒有參數化構建選項,需要安裝插件:

安裝pipeline參數化構建插件

Jenkins中-->系統管理--->管理插件--->可選插件--->搜索extended choice parameter---->點擊直接安裝

4、編輯pipeline腳本

node("slave") {
env.registry="192.168.111.161" //harbor地址
env.image="${registry}/${MODULE}/${APP_NAME}:${TAG}" //生成的鏡像名稱
if ( Operation == 'Deploy' ) {
stage('Get code'){ 
checkout([$class: 'GitSCM', branches: [[name: "${TAG}"]], doGenerateSubAPP_NAMEConfigurations: false, userRemoteConfigs: [[credentialsId: 'github', url: ' https://github.com/houyi199208/rocketmq-console.git']]]) //根據TAG號拉取代碼
}
stage('Build code') {
sh "pwd"
sh "mvn clean package -Dmaven.test.skip=true -f rocketmq-console/pom.xml" //編譯代碼
sh '''
cat >Dockerfile<<EOF
FROM openjdk:8u232 
RUN echo "ZONE=Asia/Shanghai" >/etc/timezone
COPY rocketmq-console/target/${APP_NAME}-ng-1.0.0.jar /opt/app/${MODULE}/${APP_NAME}/ 
WORKDIR /opt/app/${MODULE}/${APP_NAME}/ 
ENTRYPOINT ["java","-jar","${APP_NAME}-ng-1.0.0.jar"]
''' //制作Dockerfile
}
stage('mk image & push image'){
withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'harborpasswd', usernameVariable: 'harboruser')]) {
sh "docker login ${env.registry} -u ${harboruser} -p ${harborpasswd}"
sh "docker build -t ${registry}/${MODULE}/${APP_NAME}:${TAG} -f ./Dockerfile . && docker push ${registry}/${MODULE}/${APP_NAME}:${TAG}"
}
}
stage('Deploy'){
sh "sed -e 's/APP_NAME/${APP_NAME}/g' -e 's/MODULE/${MODULE}/g' -e 's%IMAGE%${env.image}%g' -e 's/PORT/${PORT}/g' ../k8s/deploy-template.yml >../k8s/${MODULE}/${APP_NAME}-deploy.yml " //根據選項參數的值對部署文件進行替換
get_ns = sh returnStatus: true, script: "kubectl get ns ${MODULE}"
echo "${get_ns}"
if ( get_ns != 0 ){
sh "kubectl create ns ${MODULE}"
}
sh "kubectl apply -f ../k8s/${MODULE}/${APP_NAME}-deploy.yml --record=true"
}
}else if ( Operation == 'Rollback' ) {
stage('Rollback Previous Version'){
sh "kubectl describe deployment ${APP_NAME} -n mq-console |grep -w 'Image:'"
sh "kubectl rollout undo deployment ${APP_NAME} -n ${MODULE} "
sh "kubectl describe deployment ${APP_NAME} -n mq-console |grep -w 'Image:'"
}
}
}

 

5、后續准備工作

找到jenkins-slave的workspace目錄,目錄和文件是和pipeline配套的

[root@master workspace]# pwd

/data/jenkins-slave/workspace

[root@master workspace]# mkdir k8s && cd k8s

[root@master k8s]# mkdir mq-console   #創建項目部署文件保存目錄

[root@master k8s]# ls   #deploy-template.yml是通用模板,修改后部署對應的項目

deploy-template.yml  mq-console

[root@master k8s]# chmod o+w -R ./  #jenkins-slave默認用戶是Jenkins,沒有權限操作,后續創建的其他項目也需要關注權限問題,這個版本先用o+w解決

查看節點標簽

[root@master k8s]# kubectl get node --show-labels 

給調度的節點打標簽

[root@master k8s]# kubectl label nodes node01 app=mq-console

6、模板文件(這里面所有的變量都是使用Jenkins上面定義的參數

[root@master k8s]# cat deploy-template.yml 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: APP_NAME

  namespace: MODULE

spec:

  selector:

    matchLabels:

      app: APP_NAME

  replicas: 1

  template:

    metadata:

      labels:

        aliyun.logs.APP_NAME: stdout

        app: APP_NAME

    spec:

      imagePullSecrets:

      - name: regsecret  #拉取鏡像的secret,不同名稱空間需要單獨創建

      hostNetwork: true

      nodeSelector:

        app: test-MODULE

      terminationGracePeriodSeconds: 60

      restartPolicy: Always

      containers:

      - name: APP_NAME

        image: IMAGE

        imagePullPolicy: IfNotPresent

        resources:

          requests:

            memory: "1Gi"

            cpu: "0.5"

          limits:

            memory: "2Gi"

            cpu: "8"

        env:

        - name: aliyun_logs_APP_NAME

          value: "stdout"

        livenessProbe:

          tcpSocket:

            port: PORT

          initialDelaySeconds: 120

          periodSeconds: 20

          successThreshold: 1

          failureThreshold: 2

        volumeMounts:

        - name: logs

          mountPath: /opt/logs/

        - name: time

          mountPath: /etc/localtime       

      volumes:

      - name: logs

        hostPath:

          path: /opt/logs/   #應用日志輸出位置,根據應用進行調整,項目中規定的是/opt/logs,此次部署用不到,可以做參考

          type: DirectoryOrCreate

      - name: time

        hostPath:

          path: /etc/localtime #掛載時區文件

---

apiVersion: v1

kind: Service

metadata:

  name: APP_NAME

  labels:

    app: APP_NAME

  namespace: MODULE

spec:

  selector:

    app: APP_NAME

  clusterIP: None

#  type: NodePort

  ports:

    - name: APP_NAME

      port: PORT

      targetPort: PORT

#      nodePort: PORT

 

7、以上部署沒有問題就可以部署ingress了

[root@master mq]# cat mq-ingress.yaml 

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  annotations:

    kubernetes.io/ingress.class: nginx

  name: mq-ingess

  namespace: mq-console

spec:

  rules:

    - host: mymq-ingress.com

      http:

        paths:

          - backend:

              serviceName: rocketmq-console

              servicePort: 8080

            path: /

8、編輯完成ingress的yaml文件后執行:

[root@k8s-master k8s]# kubectl apply -f  mq-ingress.yaml 

[root@k8s-master k8s]# kubectl get ingress -nmq-console
NAME HOSTS ADDRESS PORTS AGE
mq-ingress mymq-ingress.com 192.168.111.163 80 142m
最后通過瀏覽器訪問即可:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM