PART Ⅰ : 容器云OPENSHIFT
- 安装
- 数据持久化
- 集群管理
- 数据持久化
- 管理
- 网络
- 安全审计
- 工具应用部署
PART Ⅱ:容器云 KUBERNETES
- 基础
- 原理
- 系统应用/网络CNI/TRaefik
- 安装
- 集群管理
- 用户认证ServiceAccount与授权策略RBAC
- K8S应用管理工具Helm
- 问题
- 辅助工具
- Doing:K8S 多集群管理与网络互联
- VM On K8S
PART Ⅲ:持续集成与持续部署
- CICD优化总结
- Jenkins
- Gitlab
- Drone
- Nexus
- 配置
- 使用OrientDB Console在DB层面修改配置
- [设置SMTP邮件服务](https://www.wenjiangs.com/doc/krrcu7ebin9hh
- 仓库管理
- 数据备份恢复
- API
- Jenkins相关插件
- 配置
- SonarQube静态代码扫描分析
- LDAP
- Apollo
- 项目管理工具
- Jira
- Redmine
- Harbor
- Vault
- Alfred
- Web IDE: VSCode
- DolphinScheduler
PART Ⅴ:日志/监控/告警
- Logging
- Kafka/Zookeeper
- Filebeat
- Metrics
- Tracing
- Sentry日志聚合告警平台
PART Ⅵ:基础
- Docker
- Shell脚本
- Mave
- git
- 正则表达式
- SSL/TLS
- Ceph
- 性能压力测试
- PXE+Kickstart
- netboot.xyz
- Tool
- Windows
- MacOS小技巧
- Linux
- Linux排错优化
- iptables详解
- MySQL
- Redis
- 负载均衡与代理
- 代理服务器
- Nginx
- GitBook
- Telegram机器人
- OpenVPN Server
- iDRAC
- vSphere
- Raspberry Pi树莓派
- 钉钉机器人
- Aliyun CLI
- 音、视频处理工具:fffmpeg
- 图片处理工具:Imagemagick
- PDF处理工具:Ghostscript
- Nvidia
- Virtualbox 虚拟机管理
- 阿里云产品使用总结
- RustDesk:可自建远程控制软件
- Poste:自建邮件服务器
- 使用 Jlink构建最小化依赖的 JRE 环境
- Aria2
- Asuswrt-Merlin
- Trap:Shell脚本信号跟踪
- 零散知识汇总
- BarkServer通知
- Synology
PART Ⅶ:数据存储、处理
PART VIII:CODE
- Python学习笔记
- 基础语法
- statik 将静态资源文件打包到二进制文件中
- HTML/CSS 学习笔记
- JavaScript学习笔记
PART X:HACKINTOSH
PART XI:安全
Jenkins共享库Shared Libraries
随着Job的增多和pipeline的功能越来越复杂,Pipeline代码冗余度高。所以可以将一些公共的pipeline抽象做成模块代码,在各种项目pipeline之间共享核心实现,同时可以放到SVM中进行版本控制。以减少冗余并保证所有job在构建的时候会调用最新的共享库代码。这时就可以用到pipline的共享库Shared Libraries功能。
- 模块化
- 可重用性
共享库根目录
|-- vars
|-- test1.groovy
|-- src
|-- test2.groovy
|-- resources
vars
: 依赖于Jenkins运行环境的Groovy脚本。其中的Groovy脚本被称之为全局变量
。src
: 标准的Java源码目录结构,其中的Groovy脚本被称为类库(Library class)
。该目录所有下的所有类都一次性静态被添加到类路径classpath下resources
: 目录允许从外部库中使用libraryResource
步骤来加载有关的非 Groovy 文件。 目前,内部库不支持该特性
可在Jenkins中的Manage Jenkins
–> Configure System
–> Global Pipeline Libraries
添加一个或多个全局的共享库,同时也可以在构建过程中的任何位置使用library
step动作动态地配置引用共享库,详见动态引用共享库
1. 引用全局共享库
格式:@Library('my-shared-library-1@$Branch/Tag','my-shared-library-1@$Branch/Tag') _
#!groovy
// 引用默认配置的共享库
@Library('demo-shared-library') _
// 引用指定分支、tag的共享库代码
@Library('demo-shared-library@1.0') _
// 引用多个指定分支tag的共享库
@Library('demo-shared-library@$Branch/Tag','demo-shared-library-test@$Branch/Tag') _
@Library('utils') import org.foo.Utilities
@Library('utils') import static org.foo.Utilities.*
2. 动态引用共享库
2.7版本后的Shared Groovy Libraries
插件,增加了一个library
的setp
,可以随时在构建过程中引用共享库
#!groovy
library 'demo-shared-library@$BRANCH_NAME'
library "demo-shared-library@${params.LIB_VERSION}"
library('demo-shared-library').com.mycorp.pipeline.Utils.someStaticMethod()
// 此时共享库的版本必须指定
library identifier: 'custom-lib@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'git@git.mycorp.com:my-jenkins-utils.git',
credentialsId: 'my-private-key'])
3. 调用第三方Java库
@Grab('org.apache.commons:commons-math3:3.4.1')
import org.apache.commons.math3.primes.Primes
引用完的第三方Java库后会缓存在Jenkins Master节点的~/.groovy/grapes/
目录下
1. /var下定义的全局变量
- 全局变量必须以全小写或驼峰(camelCased)命名以便于能够在流水线中正确的加载
/vars
目录中的脚本根据需求以单例的方式实例化,这允许在单个
.groovy` 文件中定义多个方法/vars/*.groovy若实现call()方法,直接引用时默认执行其中的方法,该方法可以让全局变量以一种以类似于step的方式被调用
/vars/log.groovy
#!groovy def call(String name = 'human') { echo "Hello, ${name}." } def info(message) { echo "INFO: ${message}" } def warning(message) { echo "WARNING: ${message}" }
Jenkinsfile
#!groovy @Library('demo-shared-library@1.0') _ log() // 输出"Hello, human." log.info 'Starting' // 输出"INFO: Starting" log.warning 'Nothing to do!' // 输出"WARNING: Nothing to do!"
从2017年9月下旬发布的声明式 1.2开始,可以在全局变量中直接定义声明式流水线
/vars/evenOrOdd.groovy
#!groovy def call(int buildNumber) { if (buildNumber % 2 == 0) { pipeline { agent any stages { stage('Even Stage') { steps { echo "The build number is even" } } } } } else { pipeline { agent any stages { stage('Odd Stage') { steps { echo "The build number is odd" } } } } } }
Jenkinsfile
#!groovy @Library('demo-shared-library@1.0') _ evenOrOdd(currentBuild.getNumber())
全局变量的传参
/vars/buildPlugin.groovy
#!groovy def call(Map config) { node { git url: "https://github.com/jenkinsci/${config.name}-plugin.git" sh 'mvn install' mail to: '...', subject: "${config.name} plugin build", body: '...' } }
Jenkinsfile
#!groovy @Library('demo-shared-library@1.0') _ buildPlugin name: 'git'
声明式流水线不允许在
script
指令之外使用全局变量Jenkinsfile
#!groovy @Library('demo-shared-library@1.0') _ pipeline { agent none stage ('Example') { steps { script { log.info 'Starting' log.warning 'Nothing to do!' } } } }
2. /src下定义的类库
类库不能直接调用
sh
或git
这样的步骤。 但是他们可以在封闭的类的范围之外实现方法,从而调用流水线步骤/src/org/foo/Zot.groovy
#!groovy package org.foo; def checkOutFrom(repo) { git url: "git@github.com:jenkinsci/${repo}" } return this
Jenkinsfile
#!groovy @Library('demo-shared-library@1.0') _ def z = new org.foo.Zot() z.checkOutFrom(repo)
类库中使用”class“声明父类
/src/org/foo/Utilities.groovy
package org.foo class Utilities implements Serializable { def steps Utilities(steps) {this.steps = steps} def mvn(args) { steps.sh "${steps.tool 'Maven'}/bin/mvn -o ${args}" } }
Jenkinsfile
@Library('utils') import org.foo.Utilities def utils = new Utilities(this) node { utils.mvn 'clean package' }
类库中的方法访问流水线中的变量
/src/org/foo/Utilities.groovy
package org.foo class Utilities { static def mvn(script, args) { script.sh "${script.tool 'Maven'}/bin/mvn -s ${script.env.HOME}/jenkins.xml -o ${args}" } }
Jenkinsfile
@Library('utils') import static org.foo.Utilities.* node { mvn this, 'clean package' }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论