前言
上文讲了如何在docker上安装jenkins,并简单介绍了jenkins的使用,同时也演示了流水线的Hello World。本文会对流水线的一些常用语法进行演示和说明。为了与后续的实战案例更贴切,本文演示的语法样例会以实战案例中可能用到语法来进行说明。
发布流程分析
springboot项目发布流程
- 拉取代码
- 编译打包
- 构建新的镜像
- 推送到私有仓库
- 调用发布命令
vue项目发布流程
- 拉取代码
- 打包生成静态资源
- 静态资源复制到指定目录
- 调用发布命令
案例详解
简单的流水线说明
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
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/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,基本上就可以解决大多数流水线问题。