jenkins+gitlab+k8s自动化部署

2020-08-08  本文已影响0人  九思而行

1. 创建jenkins容器

docker run --name jenkins --user=root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v  /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/maven3:/usr/local/maven3 -d jenkins/jenkins

解释docker脚本

2. 启动jenkens,

  1. 访问页面:http://host:8080

  2. 初始密码:

    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:
    
    8a9754c9ced144568f5a14be449fd801
    
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
    
  3. 选择推荐安装,因为里面有很多现有的插件

3. 安装相关插件

  1. Git Parameter
  2. Gitlab

4. 设置jenkins时区

image image
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

5. 创建凭证(注意设置的凭证ID,在下面的Pipeline script中都有使用到)

image
1. 创建gitlab凭证
image
2. 创建远程docker私有库凭证

在新凭据设置界面,类型选择为“Username with password”,ID设置为“aliyun-docker”(此处的ID必须与Jenkinsfile中的保持一致)。Username与Password分别设置为镜像私库的用户名和密码。

image
3. 创建k8s配置文件凭证

k8s中使用kubectl命令时需要yaml格式的服务器及授权信息配置文件。这里将kubectl的yaml配置文件的内容以base64编码后保存在jenkins的凭据中。pipeline任务执行时,先从jenkins凭据中获取内容,进行base64解码后将配置保存为~/.kube/config文件。kubectl的配置文件的内容如下(位置在/root/.kube/config):

image

k8s配置文件样例:

apiVersion: v1
kind: Config
clusters:
- name: "test"
  cluster:
    server: "https://xxxxx"
    api-version: v1
    certificate-authority-data: "xxxxxx"

users:
- name: "user1"
  user:
    token: "xxxx"

contexts:
- name: "test"
  context:
    user: "user1"
    cluster: "test"

current-context: "test"

6. 创建项目(我们选择创建流水线项目)

image
Pipeline script与SCM介绍
image
不同点

Pipeline script

  1. 在脚本中有parameters时,执行构建时可以选择参数值,例如选择git分支;
  2. 拉取git代码时需要自己写checkout脚本
  3. 拉取git代码时需要自己指定文件夹名称
  4. Pipeline script模式好像不会在每一个docker中拉一次代码,看日志时没有看到具体是怎么做的

SCM

  1. 在脚本中有parameters时,不能选择参数,只能使用默认值(可能是没玩明白)
  2. 拉取git代码不能动态变化拉取的git分支,因为jenkinsfile就在代码里需要先拉代码才能得到相关脚本
  3. 拉取git代码时不需要自己指定文件夹名称,默认就是项目名称,好像也不能更改
  4. 在使用docker关键字时,在每个docker容器内部都会拉取一遍代码,也就是说每个docker容器内都有一个重复的副本
相同点

他们使用相同的Pipeline 脚本,除了拉取代码部分需要稍作更改,其他可以完全复制(复制时注意进入项目的路径)

经过对比,我们选择使用Pipeline script方式,因为这样在设置参数时相对灵活

7. Pipeline script 脚本

注意Pipeline script 脚本不能有注释(//xxx),不能有分号(;)否则会执行失败

pipeline{
    agent any

    options {
        timeout(time: 1, unit: 'HOURS') 
        skipStagesAfterUnstable()
    }
    
    environment {
        
        K8S_CONFIG = credentials('k8s-config')
        ALIYUN_DOCKER = credentials('aliyun-docker')
        APP_NAME = 'xh-zuul-backend'
        IMAGE_SERVER = 'registry.cn-beijing.aliyuncs.com'
        IMAGE_NAME = 'space_dev'
    }
    
    parameters {
        string(name: 'TAG', defaultValue: 'v8.0.0', description: '镜像和k8s的tag')
        gitParameter(branchFilter: 'origin/(.*)', defaultValue: ' master', description: '父级项目分支', name: 'ZUUL_BACKEND_BRANCH',  type: 'PT_BRANCH', useRepository: 'http://gitlab.mixinr.com:18080/mixinr-web/xh-zuul-backend.git')
    }
    
    stages {
        stage('Checkout git'){
            steps{
                dir("${APP_NAME}"){
                    git branch: "${ZUUL_BACKEND_BRANCH}", credentialsId: 'xhmh-gitlab', url: 'http://gitlab.mixinr.com:18080/mixinr-web/xh-zuul-backend.git'
                }
            }
            
        }
        stage('Maven package'){
            agent {
                docker {
                    image 'maven:3-jdk-8-alpine'
                    args "-v /root/local/.m2:/root/.m2 -v ${WORKSPACE}/${APP_NAME}:/root/project"
                }
            }
            steps{
                sh """
                    cd /root/project
                    mvn clean package -U -Dmaven.test.skip=true 
                """
            }
        }
        stage('Docker build'){
            steps{
                sh """
                    cd ${WORKSPACE}/${APP_NAME}
                    docker build -t ${IMAGE_SERVER}/${IMAGE_NAME}/${APP_NAME}:${TAG} .
                    docker login -u ${ALIYUN_DOCKER_USR} -p ${ALIYUN_DOCKER_PSW} ${IMAGE_SERVER}
                    docker push ${IMAGE_SERVER}/${IMAGE_NAME}/${APP_NAME}:${TAG}
                    docker rmi  ${IMAGE_SERVER}/${IMAGE_NAME}/${APP_NAME}:${TAG}
                """
            }
        }

        stage('Deploy k8s') {
            agent {
                docker {
                    image 'lwolf/helm-kubectl-docker'
                    args "-v ${WORKSPACE}/${APP_NAME}:/root/project"
                }
            }
            steps {
                sh """
                    mkdir -p ~/.kube
                    echo ${K8S_CONFIG}  | base64 -d > ~/.kube/config
                    cd /root/project
                    echo export IMAGE_URL=${IMAGE_SERVER}   export IMAGE_TAG=${TAG} export APP_NAME=${APP_NAME} export IMAGE_NAME=${IMAGE_NAME}  > param.txt
                    source  param.txt && envsubst < k8s-deployment.yml > k8s-deployment-tmp.yml
                    kubectl apply -f k8s-deployment-tmp.yml -n test
                """
            }
        }
        

        
    }
    
}

参数解释

详细的语法讲解:https://www.cnblogs.com/cay83/p/7537840.html

  1. 设置可选的操作
 options {
        //执行的timeout
        timeout(time: 1, unit: 'HOURS') 
        //状态为Unstable时跳过后面的stage
        skipStagesAfterUnstable()
    }
  1. environment指令指定一系列键值对,这些键值对将被定义为所有step或stage-specific step的环境变量,具体取决于environment指令在Pipeline中的位置。
environment {
        K8S_CONFIG = credentials('k8s-config')
        ALIYUN_DOCKER = credentials('aliyun-docker')
        APP_NAME = 'xh-zuul-backend'
        IMAGE_SERVER = 'registry.cn-beijing.aliyuncs.com'
        IMAGE_NAME = 'space_dev'
    }
  1. 设置变量,在使用Pipeline script 脚本模式时,每一个在parameters块中声明的参数都要在构建时指定参数,如下:

    image

    点击 Build with Parameters进行构建,设置用于构建项目的参数

parameters {
        string(name: 'TAG', defaultValue: 'v8.0.0', description: '镜像和k8s的tag')
        gitParameter(branchFilter: 'origin/(.*)', defaultValue: ' master', description: '父级项目分支', name: 'ZUUL_BACKEND_BRANCH',  type: 'PT_BRANCH', useRepository: 'http://xxx.mixinr.com/xh-zuul-backend.git')
    }
  1. stages说明,只是一个用户自定义的阶段集合,steps只是stage中必须要有的结构,具体执行的操作都要放到steps块中
- kubectl apply:部署到k8s

8. 开始构建项目

  1. 点击立即构建

    image
  2. 报错,查看控制台,鼠标放到#29上点击

    image
  3. 查看控制台信息发现是没有设置参数

    image
  4. 刷新项目页面,发现立即构建变成了Build with Parameters

    image
  5. 点击配置,看到参数化构建过程已经被勾选,里面的参数就是设置Pipeline script脚本中的Parameters参数,这也是和SCM不一样的地方,如果是使用SCM,就不会有构建参数的过程了

    image
  1. 再次点击build with 选择参数后构建 image
  2. 构建成功,鼠标放到上面可以看某一阶段的log日志

    image
上一篇 下一篇

猜你喜欢

热点阅读