转载

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

上文讲了如何在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'
            }
        }
    }
}
复制代码

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

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

复制文本,运行

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

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

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

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

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

点击查看详情

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

环境变量

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}"
            }
        }
    }
}
复制代码
手把手带你玩转k8s-jenkins流水线语法

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

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

手把手带你玩转k8s-jenkins流水线语法
手把手带你玩转k8s-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-jenkins流水线语法

执行结果

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

凭证管理

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

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

Username and password

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

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

流水线使用样例,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}"
            }
        }
   }
}
复制代码

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

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

Secret file

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

SSH Username with private key

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

手把手带你玩转k8s-jenkins流水线语法
ssh-keygen -t rsa -C "mldong@qq.com" -f ~/.ssh/id_rsa
复制代码

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

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

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

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

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

流水线

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"
            }
        }
   }
}
复制代码

执行结果

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

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

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

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.

执行结果

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

使用脚本

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

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}"
                    }
                }
            }
        }
    }
}
复制代码

执行结果

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

文件暂存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"
            }
        }
    }
}
复制代码

执行结果

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

流水线通知

流水线-成功

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")
            }
        
        }
    
    }
    
}
复制代码

执行结果

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

流水线-异常

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")
            }
        
        }
    
    }
    
}
复制代码

执行结果

手把手带你玩转k8s-jenkins流水线语法
原文  https://juejin.im/post/5f12fd205188252e734b6d58
正文到此结束
Loading...