本文以当下流行的前后端分离架构进行演示部署,前端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中,提升部署安全性。