本文以当下流行的前后端分离架构进行演示部署,前端vue.js,后端采用springboot。

可手动制作前后端各自镜像,在Rancher集群中发布。

部署项目时,在K8s集群中动态创建Jenkins-slave节点进行代码拉取、编译。部署结束后Jenkins-slave节点自动销毁,节约硬件资源。

一、安装插件

Manage Jenkins -> Manage Plugins 安装 Kubernetes 和 Kubernetes Cli 插件

说明:Kubernetes插件是可以增加Kubernetes云,Kubernetes Cli插件是用于jenkinsfile中kubectl容器可以使用withKubeConfig参数

二、添加凭据

凭据 -> 系统 -> 全局凭据

1)harbor:harbor镜像仓库凭据(类型:Username with password) 
2)gitlab:gitlab凭据(类型:Username with password)
3)cicd-kube:jenkins-master所在k8s集群的凭据(类型:Secret text)
cicd-kube对应的集群配置文件中的 token值

2.4 配置kubernetes云

Manage Jenkins -> Configure System

系统设置,增加一个云(kubernetes)

1)名称:kubernetes
2)Kubernetes 地址:https://kubernetes.default
3)Kubernetes 命名空间:jenkins
4)凭据:cicd-kube (之前创建的cicdkube凭据,用于连接jenkins-master所在的集群)
点击连接测试
5)Jenkins 地址:http://jenkins-master:8080

KubernetesPod.yaml

metadata:
  labels:
    some-label: some-label-value
spec:
  containers:
  - name: jnlp
    env:
    - name: CONTAINER_ENV_VAR
      value: jnlp
    resources:
      limits:
        cpu: 1
        memory: 1Gi
      requests:
        cpu: 1
        memory: 1Gi
  - name: maven
    image: maven:3.6-alpine
    command:
    - cat
    tty: true
    env:
    - name: CONTAINER_ENV_VAR
      value: maven
    volumeMounts:
    - name: repo-maven-cache
      mountPath: /root/.m2
  - name: kubectl
    image: cnych/kubectl
    command:
    - cat
    tty: true
    env:
    - name: CONTAINER_ENV_VAR
      value: kubectl
  - name: docker
    image: docker
    command:
    - cat
    tty: true
    env:
    - name: CONTAINER_ENV_VAR
      value: docker
    volumeMounts:
    - name: repo-docker-sock
      mountPath: /var/run/docker.sock
  volumes:
  - name: repo-maven-cache
    persistentVolumeClaim:
      claimName: pvc-jenkins-maven-cache
  - name: repo-docker-sock
    hostPath:
      path: /var/run/docker.sock

 Jenkinsfile

pipeline {
  environment {
    IMAGE_TAG = sh (returnStdout: true, script: 'echo "build-${BRANCH_NAME//\\//_}-$BUILD_NUMBER"').trim()
  }
  agent {
    kubernetes {
      defaultContainer 'maven'
      yamlFile 'KubernetesPod.yaml'
    }
  }
  stages {
    stage('Run maven') {
      steps {
        container('maven') {
          echo "代码编译打包"
          sh 'mvn clean install'
        }
      }
    }
    stage('Build image') {
      steps {
        container('docker') {
          script {
            echo "构建Docker镜像"
            def image = docker.build("reg.nexus.wmqhealth.com/tools/cicd-test:" + "$IMAGE_TAG", ".")
            withDockerRegistry([credentialsId:'docker-registry', url:"https://reg.nexus.wmqhealth.com"]){
              image.push()
            }
          }
        }
      }
    }
    stage('Deploy') {
      steps {
        container('kubectl') {
          script {
            echo "部署项目"
            withKubeConfig(clusterName: 'develop', contextName: 'develop', credentialsId: 'kube', namespace: 'cicdtest', serverUrl: 'https://rancher.wmqhealth.com/k8s/clusters/c-xg99q') {
              sh 'kubectl set image deployment/cicd-test cicd-test=reg.nexus.wmqhealth.com/tools/cicd-test:$IMAGE_TAG --namespace cicdtest'
            }
          }
        }
      }
    }
  }
}

新建jenkins项目

其他的默认即可,最后保存。

采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目,需要在代码中定义 KubernetesPod.yaml 、Jenkinsfile一同存放在代码仓库中托管,安全性、繁琐性都较差。

下一个章节采用 docker in docker 方式进行部署,pipeline配置在jenkins中,提升部署安全性。

Logo

开源、云原生的融合云平台

更多推荐