手把手带你玩转k8s-jenkins流水线语法

3,191 阅读3分钟

前言

上文讲了如何在docker上安装jenkins,并简单介绍了jenkins的使用,同时也演示了流水线的Hello World。本文会对流水线的一些常用语法进行演示和说明。为了与后续的实战案例更贴切,本文演示的语法样例会以实战案例中可能用到语法来进行说明。

发布流程分析

springboot项目发布流程

  1. 拉取代码
  2. 编译打包
  3. 构建新的镜像
  4. 推送到私有仓库
  5. 调用发布命令

vue项目发布流程

  1. 拉取代码
  2. 打包生成静态资源
  3. 静态资源复制到指定目录
  4. 调用发布命令

案例详解

简单的流水线说明

pipeline {
    agent any
    // 定义环境变量
    environment {
        ENV_A = "Hello World A"
        ENV_B = "Hello World B"
    }
    // 定义入参
    parameters {
    	string(name: 'app_name', defaultValue: 'mldong-admin', description: '应用名称')
    }
    // 步骤定义
    stages {
        // 步骤一
        stage('step1') {
        	agent { 
                docker {
                	image 'maven:3-alpine'
                    args '-v /root/.m2:/root/.m2'
                }
            }
            steps {
                sh 'mvn --version'
            }
        }
        // 步骤二
        stage('step2') {
            steps {
                sh "echo ${ENV_A}"
                sh "echo ${ENV_B}"
                sh "echo ${params.app_name}"
            }
        }
        // 步骤三
        stage('step3') {
            // 步聚里面指定运行环境
            agent {
            	docker {
                    image 'node:10-alpine'
                    args '-p 3000:3000'
            	}
            }
            steps {
                sh 'node -v'
            }
        }
    }
}

大家可以选一个运行成功的流水线进行回放调试

复制文本,运行

日志查看,首次本地没有镜像,会自动下载

当然,我们也可以打开Blue Ocean进行查看

点击查看详情

环境变量

pipeline {
    agent any
    // 定义环境变量
    environment {
        ENV_A = "Hello World A"
        ENV_B = "Hello World B"
    }
    stages {
        stage('step') {
            // 环境变量取值${xxx}
            steps {
                sh "echo ${ENV_A}"
                sh "echo ${ENV_B}"
                // 内置环境变量
                sh "echo ${env.JOB_NAME}"
            }
        }
    }
}

内置的环境变量还有很多,这里就不一一列举了,后续需要用到会说明。除了内置变量和流水线中自定义的环境变量外,还能在全局中配置。这里简单截图,就不演示了。

Jenkins->系统管理->系统配置->环境变量->新增

入参配置

流水线

pipeline {
    agent any
    // 入参定义
    parameters {
        string(name: 'app_name', defaultValue: 'mldong-admin', description: '项目名称')
        string(name: 'deploy_type', defaultValue: 'deploy', description: '构建环境')
        string(name: 'branch_name', defaultValue: 'master', description: 'git分支')
        string(name: 'profile', defaultValue: 'test', description: '环境')
    }

    stages {
        stage('step') {
            // 参数取值${params.xxx}
            steps {
                sh "echo ${params.app_name}"
                sh "echo ${params.deploy_type}"
                sh "echo ${params.branch_name}"
                sh "echo ${params.profile}"
            }
        }
    }
}

带参数构建项目

执行结果

凭证管理

在上一篇文章中其实也小试了一下凭证配置,用来配置连接k8s集群的,这里介绍几类常用凭证配置。

  • Username and password - 可以为独立的字段,也可以为冒号分隔的字符串:username:password
  • Secret file - 保存在文件中的加密内容
  • SSH Username with private key - SSH 公钥/私钥对,

Username and password

Jenkins->系统管理->Manage Credentials->全局->添加凭证

流水线使用样例,key_USR=>用户名,key_PSW=>密码

pipeline {
    agent any
    // 这里定义环境变量代码块
    environment {
        GITEE_CREDENTIALS = credentials('gitee-credentials')
	}
    stages{
        stage('step') {
            steps{
				sh "echo ${GITEE_CREDENTIALS_USR}"
				sh "echo ${GITEE_CREDENTIALS_PSW}"
            }
        }
   }
}

日志中,用户名密码会自带*号

Secret file

这个在上一篇中已经有样例了,这里就不截图介绍了。

SSH Username with private key

Jenkins->系统管理->Manage Credentials->全局->添加凭证

ssh-keygen -t rsa -C "mldong@qq.com" -f ~/.ssh/id_rsa

上面的Private Key对应的就是cat ~/.ssh/id_rsa

这里演示一下两个使用场景

使用公钥配置的方式拉取代码

这里讲一下码云的配置方式,管理->公钥管理->添加公钥->将上面生成的id_rsa对应有id_rsa.pub粘贴

流水线

pipeline {
    agent any
    stages{
        stage('checkout') {
            steps{
            	checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
            	doGenerateSubmoduleConfigurations: false, 
            	extensions: [], 
            	submoduleCfg: [], 
                userRemoteConfigs: [[
                    credentialsId: 'mldong-gitbash', 
                	url: 'git@gitee.com:mldong/mldong.git']]])
                sh "pwd"
                sh "ls"
            }
        }
   }
}

执行结果

配置公钥方式执行远程命令

在想要远程执行玲的的服务器上配置公钥,文件不存在则创建

vi ~/.ssh/authorized_keys

流水线-执行远程命令及scp

pipeline {
    agent any
    stages{
        stage('remote ssh') {
            steps {
            	withCredentials([
           	 	sshUserPrivateKey(
                    credentialsId: 'mldong-gitbash', 
                    keyFileVariable: 'identity', 
                    passphraseVariable: '', 
                    usernameVariable: 'userName')
            	]) {
              	sh "ssh -o StrictHostKeyChecking=no -i $identity $userName@www.mldong.com ls /"			  
              	sh "echo 666 > 666.txt"
              	scp -r -i $identity 666.txt $userName@www.mldong.com:/
              }
            }
        }
   }
}

主机公钥确认 StrictHostKeyChecking

  1. StrictHostKeyChecking=no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
  2. StrictHostKeyChecking=ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
  3. StrictHostKeyChecking=yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。

这里需要添加-o StrictHostKeyChecking=no,如果不添加,会出现如下错误:

Host key verification failed.

执行结果

使用脚本

流水线-脚本上做一些逻辑判断

pipeline {
    agent any
    // 入参定义
    parameters {
        string(name: 'v', defaultValue: '3', description: '参数')
    }
    stages {
        stage('step') {
            steps {
                script {
                	def a = "3";
                    def b = "4";
                    if ("${params.v}" == "${a}"){
                    	sh "echo ${a}"
                    } else {
                        sh "echo ${b}"
                    }
                }
            }
        }
    }
}

执行结果

文件暂存stash/unstash

当我们在同一条流水线上使用不同的运行环境,然后又需要将前一个运行环境执行产生的文件或结果传递给下一个运行环境使用时,就需要使用到stash/unstash,即暂存文件和取出文件,其中要注意的是 stash会将文件打包成一个tar包来敦促,所以大文件时会耗CPU,而且stash有文件大小限制,尽量在100M以下 。如:

使用maven环境打包springboot项目并生成yaml发布文件,然后传递yaml文件到kubectl客户端环境下发布服务。

流水线

pipeline {
    agent any
    // 步骤定义
    stages {
        stage('step1') {
        	// 指定maven运行环境
        	agent { 
                docker {
                	image 'maven:3-alpine'
                    args '-v /root/.m2:/root/.m2'
                }
            }
            steps {
                sh 'mvn --version'
                sh "echo 666 > k8s.yaml"
                // 暂存文件
                stash name: "k8s.yaml", includes: "k8s.yaml"
            }
        }
        // 步骤二
        stage('step2') {
            // 指定node运行环境
            agent {
            	docker {
                    image 'node:10-alpine'
                    args '-p 3000:3000'
            	}
            }
            steps {
                sh 'node -v'
                // 取出文件
                unstash("k8s.yaml")
                sh "cat k8s.yaml"
            }
        }
    }
}

执行结果

流水线通知

流水线-成功

pipeline{
    agent any
    stages{
        stage("CheckOut"){
            steps{
                script{
                    def branchName= "master"
                    println("${branchName}")
                }
            }
        }
    }
    post {
        always{
            script{
                println("always")
            }
        }
        success{
            script{
                println("success")
            }
        }
        failure{
            script{
                println("failure")
            }
        }
        
        aborted{
            script{
                println("aborted")
            }
        
        }
    
    }
    
}

执行结果

流水线-异常

pipeline{
    agent any
    stages{
        stage("CheckOut"){
            steps{
                script{
                   sh "cd 6666"
                }
            }
        }
    }
    post {
        always{
            script{
                println("always")
            }
        }
        success{
            script{
                println("success")
            }
        }
        failure{
            script{
                println("failure")
            }
        }
        
        aborted{
            script{
                println("aborted")
            }
        
        }
    
    }
    
}

执行结果

小结

本文简单的列举了做流水线时可能需要用到的样例,虽然还并不全,但是使用这些再配合shell,基本上就可以解决大多数流水线问题。

相关文章

手把手带你玩转k8s-集群创建和Hello World

手把手带你玩转k8s-ConfigMap与持久化存储

手把手带你玩转k8s-完整的发布一个可对外访问的服务

手把手带你玩转k8s-docker进阶Dockerfile与docker-compose

手把手带你玩转k8s-一键部署springboot项目

手把手带你玩转k8s-一键部署vue项目

手把手带你玩转k8s-常用对象详解

手把手带你玩转k8s-jenkins安装与流水线