上文讲了如何在docker上安装jenkins,并简单介绍了jenkins的使用,同时也演示了流水线的Hello World。本文会对流水线的一些常用语法进行演示和说明。为了与后续的实战案例更贴切,本文演示的语法样例会以实战案例中可能用到语法来进行说明。
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:password SSH 公钥/私钥对 , 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}"
}
}
}
}
复制代码
日志中,用户名密码会自带*号
这个在上一篇中已经有样例了,这里就不截图介绍了。
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 StrictHostKeyChecking=no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网 测试 时建议使用。如果连接 server 的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。 StrictHostKeyChecking=ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。 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会将文件打包成一个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")
}
}
}
}
复制代码
执行结果