Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 YAML 文件配置 Jenkins 流水线

使用 YAML 文件配置 Jenkins 流水线

作者头像
LinuxSuRen
发布于 2019-04-19 08:16:12
发布于 2019-04-19 08:16:12
4.9K0
举报
文章被收录于专栏:JenkinsJenkins

几年前,我们的 CTO 写了一篇关于使用 Jenkins 和 Docker 为 Ruby On Rails 应用提供持续集成服务的文章。这些年,我们一直使用这个 CI 流水线解决方案,直到我们最近决定做一次升级。为什么呢?

* Jenkins 的版本过低,已经很难升级

* Wolox 过去几年增长显著,一直面临着如何伸缩的问题

* 只有极少数人如何修复 Jenkins 服务的问题

* 配置 Jenkins 任务不是一件简单的任务,使我们的项目启动过程变慢

* 更改每个作业运行的命令也不是一件简单的任务,并且有权限更改的人并不多。 Wolox 拥有广泛的项目,语言种类繁多,使得这个问题尤为突显。

考虑到这些问题,我们开始深入研究最新版的 Jenkins,看看如何提升我们的 CI 服务。我们需要构建一个新的CI服务,至少要解决以下问题:

* 支持 Docker 构建。我们的项目依赖的一个或多个 Docker 镜像的执行(应用,数据库Redis 等)

* 如有必要,易于配置和复制

* 易于增加新项目

* 易于修改构建步骤。工作在项目上的所有人都应该能修改它,如果他们希望执行 `npm install` 或 `yarn install`

### 安装Jenkins和Docker

安装 Jenkins 非常简单,直接从官方教程选择一种方式安装。

以下是我们在 AWS 上的安装步骤:

```shell

sudo rpm — import https://pkg.jenkins.io/debian/jenkins.io.key

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat/jenkins.repo

sudo yum install java-1.8.0 -y

sudo yum remove java-1.7.0-openjdk -y

sudo yum install jenkins -y

sudo yum update -y

sudo yum install -y docker

```

### 从 GitHub 上自动添加项目

从 Github 上自动添加项目可以通过GitHub Branch Source插件实现。它能将 GitHub 的组织中符合规则的项目自动添加到 Jenkins 中。唯一的约束就是在每一个分支下都必须有一个 Jenkinsfile,用于描述如何构建项目。

### 易于修改的配置

我们之前使用 Jenkins 最痛苦的是修改项目的构建步骤。在 Jenkins 任务中,你会看到像以下代码(用于构建):

```shell

#!/bin/bash +x

set -e

# Remove unnecessary files

echo -e "\033[34mRemoving unnecessary files...\033[0m"

rm -f log/*.log &> /dev/null || true &> /dev/null

rm -rf public/uploads/* &> /dev/null || true &> /dev/null

# Build Project

echo -e "\033[34mBuilding Project...\033[0m"

docker-compose --project-name=${JOB_NAME} build

# Prepare test database

COMMAND="bundle exec rake db:drop db:create db:migrate"

echo -e "\033[34mRunning: $COMMAND\033[0m"

docker-compose --project-name=${JOB_NAME} run \

-e RAILS_ENV=test web $COMMAND

# Run tests

COMMAND="bundle exec rspec spec"

echo -e "\033[34mRunning: $COMMAND\033[0m"

unbuffer docker-compose --project-name=${JOB_NAME} run web $COMMAND

# Run rubocop lint

COMMAND="bundle exec rubocop app spec -R --format simple"

echo -e "\033[34mRunning: $COMMAND\033[0m"

unbuffer docker-compose --project-name=${JOB_NAME} run -e RUBYOPT="-Ku" web $COMMAND

```

在构建步骤后,执行 Docker 构建的清理工作:

```shell

#!/bin/bash +x

docker-compose --project-name=${JOB_NAME} stop &> /dev/null || true &> /dev/null

docker-compose --project-name=${JOB_NAME} rm --force &> /dev/null || true &> /dev/null

docker stop `docker ps -a -q -f status=exited` &> /dev/null || true &> /dev/null

docker rm -v `docker ps -a -q -f status=exited` &> /dev/null || true &> /dev/null

docker rmi `docker images --filter 'dangling=true' -q --no-trunc` &> /dev/null || true &> /dev/null

```

尽管这些命令并不复杂,但是更改其中的任何命令都需要具有权限的人员来操作相应的 Jenkins 任务,并清楚知道自己需要做什么。

### Jenkinsfile的成与败

使用当前的 Jenkins 版本,我们可以利用Jenkins pipeline对我们的构建流进行建模,并保存到一个文件中。 该文件会被签入代码库。因此,任何有权访问它的人都可以修改其中的步骤。棒极了。

Jenkins 流水线还支持:

* Docker 及多个镜像可用于构建

* 使用 `withEnv` 设置环境变量,还支持很多其它内建的函数

这为 Wolox 提供了完美的用例。我们可以将构建配置写入到一个被检入到代码库的文件中,并且允许任务有权限访问的人修改。但是,一个简单的 Rails 项目的 Jenkinsfile 看起来却像这样:

```groovy

# sample Jenkinsfile. Might not compile

node {

checkout scm

withEnv(['MYTOOL_HOME=/usr/local/mytool']) {

docker.image("postgres:9.2").withRun() { db ->

withEnv(['DB_USERNAME=postgres', 'DB_PASSWORD=', "DB_HOST=db", "DB_PORT=5432"]) {

docker.image("redis:X").withRun() { redis ->

withEnv(["REDIS_URL=redis://redis"]) {

docker.build(imageName, "--file .woloxci/Dockerfile .").inside("--link ${db.id}:postgres --link ${redis.id}:redis") {

sh "rake db:create"

sh "rake db:migrate"

sh "bundle exec rspec spec"

}

}

}

}

}

}

}

```

这样的文件不仅难以理解,还难以修改。这样的构建逻辑非常容易被破坏,如果你不熟悉 Groovy。如果你对 Jenkins 流水线是如何工作的一无所知,就更容易了。这样,修改或增加一个新的 Docker 镜像就变得不简单,也容易导致混淆。

### 通过 YAML 配置 Jenkins 流水线

就个人而言,我总是期望为 CI 配置简单的配置文件。这次我们有机会构建使用 YAML 文件配置的 CI。经过分析,我们总结出以下这样的 YAML,它已经能满足我们的需求:

```yaml

config:

dockerfile: .woloxci/Dockerfile

project_name: some-project-name

services:

- postgresql

- redis

steps:

analysis:

- bundle exec rubocop -R app spec --format simple

- bundle exec rubycritic --path ./analysis --minimum-score 80 --no-browser

setup_db:

- bundle exec rails db:create

- bundle exec rails db:schema:load

test:

- bundle exec rspec

security:

- bundle exec brakeman --exit-on-error

audit:

- bundle audit check --update

environment:

RAILS_ENV: test

GIT_COMMITTER_NAME: a

GIT_COMMITTER_EMAIL: b

LANG: C.UTF-8

```

它描述了项目基本的配置、构建过程中需要的环境变量、依赖的服务、还有构建步骤。

### Jenkinsfile + Shared Libraries = WoloxCI

经过调研 Jenkins 和流水线之后,我们发现可以通过扩展共享库(shared libraries)来实现。共享库是用 Groovy 编写的,可以导入到流水线中,并在必要时执行。

如果你细心观察以下 Jenkinsfile,你会看到代码是一个接收闭包的方法调用链,我们执行另一个方法将一个新的闭包传递给它。

```groovy

# sample Jenkinsfile. Might not compile

node {

checkout scm

withEnv(['MYTOOL_HOME=/usr/local/mytool']) {

docker.image("postgres:9.2").withRun() { db ->

withEnv(['DB_USERNAME=postgres', 'DB_PASSWORD=', "DB_HOST=db", "DB_PORT=5432"]) {

docker.image("redis:X").withRun() { redis ->

withEnv(["REDIS_URL=redis://redis"]) {

docker.build(imageName, "--file .woloxci/Dockerfile .").inside("--link ${db.id}:postgres --link ${redis.id}:redis") {

sh "rake db:create"

sh "rake db:migrate"

sh "bundle exec rspec spec"

}

}

}

}

}

}

}

```

Groovy 语言足够灵活,能在在运行时创建声明式代码,这使我们能使用 YAML 来配置我们的流水线!

### Wolox-CI介绍

wolox-ci 诞生于 Jenkins 的共享库。以下是关于Wolox-CI的具体使用方式。

使用 wolox-ci,Jenkinsfile 被精简成:

```groovy

@Library('wolox-ci') _

node {

checkout scm

woloxCi('.woloxci/config.yml');

}

```

它会检出代码,然后调用 wolox-ci。共享库代码会读取到 YAML 文件,如下:

```yaml

config:

dockerfile: .woloxci/Dockerfile

project_name: some-project-name

services:

- postgresql

- redis

steps:

analysis:

- bundle exec rubocop -R app spec –format simple

- bundle exec rubycritic –path ./analysis –minimum-score 80 –no-browser

setup_db:

- bundle exec rails db:create

- bundle exec rails db:schema:load

test:

- bundle exec rspec

security:

- bundle exec brakeman –exit-on-error

audit:

- bundle audit check –update

environment:

RAILS_ENV: test

GIT_COMMITTER_NAME: a

GIT_COMMITTER_EMAIL: b

LANG: C.UTF-8

```

然后,Jenkins 就会执行你的构建任务。

共享库有一个好处是我们可以集中扩展和修改我们的共享库代码。一旦添加新代码,Jenkins 就会自动更新它,还会通知所有的任务。

由于我们有不同语言的项目,我们使用 Docker 来构建测试环境。WoloxCI 假设有一个 Dockerfile 要构建,并将在容器内运行所有指定的命令。

### config.yml 各部分介绍

#### config部分

这是 config.yml 的第一部分,用于指定基本配置,包括项目的名称,Dockerfile 的路径。Dockerfile 用于构建镜像,所有的命令都运行在该镜像的容器中。

#### Services 部分

这部分定义了哪些服务被暴露到容器中。WoloxCI 支持以下开箱即用的服务:postgresql、mssql 和 redis。你还可以指定 Docker 镜像的版本。

增加一个新的服务类型也不难。你只需要在该目录下(https://github.com/Wolox/wolox-ci/tree/development/vars)添加,然后告诉共享库该服务是如何被转换的,如https://github.com/Wolox/wolox-ci/blob/development/src/com/wolox/parser/ConfigParser.groovy#L76

#### Steps 部分

在此部分列出的命令,都会被运行在 Docker 容器中。你可以在 Jenkins 界面上看到每一步的执行结果。

#### Environment 部分

如果构建过程需要一些环境变量,你可以在这部分指定它们。Steps 部分中描述的步骤执行过程中,Docker 容器会提供你设置好的所有环境变量。

### 总结

目前,WoloxCI 还在我们所有项目中一小部分项目进行测试。这让有权限访问它的人通过 YAML 文件更改构建步骤。这是对我们 CI 工作流程来说是一个重大改进。

Docker 使我们轻松更换编程语言,而不用对 Jenkins 安装做任何的更改。并且,当检查到 GitHub 组织中的新项目(项目中有 Jenkinsfile)时,Jenkins GitHub Branch Source 插件会自动添加新的 Jenkins 项目。

所有这些改进节约了我们维护 Jenkins 的大量时间,并使我们可以轻松扩展而无需任何额外配置。

### 译者小结

本文最大的亮点是它介绍了一种实现自定义构建语言的方式。通过 Jenkins 的共享库技术,将构建逻辑从 Jenkinsfile 中移到了 YAML 文件中。同样的,我们可以将构建逻辑移动 JSON 文件中,或者任何格式的文件中,只你的共享库能解析它,并将它转换成 Jenkins 能理解的格式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Jenkins 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MPL - 模块化的流水线库
尽管通过自动化部署加快了开发速度,但由于在 DevOps 方面缺少协作,我们一个客户正因此而放慢产品的上市时间。虽然他们也投入了资源来做 DevOps ,但每条生产流水线都是独立设置的,迫使团队为每个项目重新造轮子。更糟糕的是,由于没有跨团队协作,平台中的任何错误又会出现在每条新的流水线中。许多客户都有类似的问题存在,因此我们决定开发一个既能帮助现有客户,又能适应未来使用需求的通用工具。使用通用框架且标准化的 CI/CD 平台是最显而易见的选择,但这将导致缺少灵活性的单体结构(monolithic structure),最终会变得举步维艰。每个团队都需要在自己的流水线上工作,基于此,我们开发了一个方便 DevOps 流水线的每个可重用部分可供以后使用的解决方案 — Jenkins 驱动的模块化流水线库。
LinuxSuRen
2019/04/19
2.3K0
MPL - 模块化的流水线库
DevOps整合Jenkins+k8s+CICD
基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。 那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DevOps。 DevOps,字面意思是Development &Operations的缩写,也就是开发&运维。 然字面意思只涉及到了开发团队和运维团队,其实QA测试团队也是参与其中的。 网上可以查看到DevOps的符号类似于一个无穷大的符号
IT运维技术圈
2022/10/24
2.9K1
Jenkins流水线即代码之扩展共享库
Jenkin的多分支流水线,允许Jenkinsfile与需要 Jenkins 构建的应用程序代码放在一起,然后 Jenkins 从源代码管理系统中检出 Jenkinsfile 文件作为流水线项目构建过程的一部分并接着执行你的流水线。
追马
2020/07/15
1.9K0
Jenkins流水线即代码之扩展共享库
Jenkins流水线
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。
程序猿川子
2022/08/24
7020
基于Jenkins和Argocd实现CI/CD
CI/CD并不是陌生的东西,大部分企业都有自己的CI/CD,不过今天我要介绍的是使用Jenkins和GitOps实现CI/CD。
没有故事的陈师傅
2020/12/02
2.4K0
基于Jenkins和Argocd实现CI/CD
Jenkins Pipeline 流水线部署 Kubernetes 应用
虽然云原生时代有了Jenkins X、Drone、Tekton 这样的后起之秀,但 Jenkins 这样一个老牌的 CI/CD 工具仍是各大公司主流的使用方案。
DevOps时代
2021/12/05
1.7K0
Jenkins Pipeline 流水线部署 Kubernetes 应用
『Jenkins』深入理解Jenkins流水线:从基础到高级使用
在现代软件开发中,持续集成(CI)和持续交付(CD)是提高开发效率和软件质量的核心实践。Jenkins作为全球最受欢迎的开源自动化工具,广泛用于实现CI/CD工作流。而Jenkins流水线(Jenkins Pipeline)是实现持续集成和持续交付的核心功能之一。
数字扫地僧
2024/12/23
2170
史诗级整理 Jenkins 流水线详解
jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
我的小碗汤
2023/03/19
8K0
史诗级整理 Jenkins 流水线详解
如何使用 Jenkins Pipeline 流水线优雅的部署 Kubernetes 应用
虽然云原生时代有了 JenkinsX[1]、Drone[2]、Tekton[3] 这样的后起之秀,但 Jenkins 这样一个老牌的 CI/CD 工具仍是各大公司主流的使用方案。比如我司的私有云产品打包发布就是用这老家伙完成的。然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,比如:
iMike
2021/07/01
2.2K0
2.Jenkins进阶之流水线pipeline语法入门学习
Q: 什么是 Groovy 语言 答: Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)
全栈工程师修炼指南
2022/09/29
17.9K0
2.Jenkins进阶之流水线pipeline语法入门学习
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
要实现在 Jenkins 中的构建工作,可以有多种方式,我们这里采用比较常用的 Pipeline 这种方式。Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
我是阳明
2021/06/25
5.2K0
使用 Jenkins Pipeline 流水线部署 Kubernetes 应用
我是如何从零搭建DevOps流水线的
作为一名开发与运维之间的“桥梁”,我最近完成了一次从零搭建完整DevOps流水线的项目。这次实践让我感受到自动化、效率提升和版本管理的魅力。通过这篇文章,我希望分享我的具体经验、踩过的“坑”,以及最后成功跑通流水线的那种成就感。如果你也想从零搭建一条属于自己的DevOps流水线,希望这篇文章能给你一些启发。
Echo_Wish
2025/03/19
1370
我是如何从零搭建DevOps流水线的
Jenkins_流水线语法_001
本节是建立在 流水线入门内容的基础上,而且,应当被当作一个参考。 对于在实际示例中如何使用流水线语法的更多信息, 请参阅本章在流水线插件的2.5版本中的 使用 Jenkinsfile部分, 流水线支持两种离散的语法,具体如下对于每种的优缺点, 参见语法比较。
Cyylog
2020/08/19
1.5K0
使用 Kubernetes 和 Jenkins 创建一个 CI/CD 流水线
CI/CD 同 DevOps、Agile、Scrum、Kanban、自动化以及其他术语一样,是一个一起被经常提及的专用术语。有时候,它被当做工作流的一部分,但是并没有搞清楚这是什么或者为什么它会被采用。对于年轻的 DevOps 工程师来说,使用 CI/CD 理所当然已经成为了常态,可能他们并没有看到“传统”的软件发布流程而因此不欣赏 CI/CD。
DevOps持续交付
2020/03/17
1.8K3
使用 Kubernetes 和 Jenkins 创建一个 CI/CD 流水线
Jenkins_流水线语法_002
parameters 指令提供了一个用户在触发流水线时应该提供的参数列表。这些用户指定参数的值可通过 params 对象提供给流水线步骤, 了解更多请参考示例。
Cyylog
2020/08/19
1.8K0
Jenkins扩展共享库进阶
前面我们介绍了Jenkins多分支流水线、Jenkins流水线即代码之扩展共享库,其实都是“流水线即代码”的体现。我们将Jenkinsfile纳入项目版本库中统一管理,实现了“谁构建、谁运行”的理念。
追马
2020/07/15
2.1K0
Jenkins扩展共享库进阶
DevSecOps 管道: 使用Jenkins自动化CI/CD管道以实现安全的多语言应用程序
DevSecOps 流程 先决条件: 1) Git 2) Jenkins 3) Sonar-Scanner 4) Snyk 5) Java、Maven、Node.js、Python 等(您为项目选择的语言将取决于适用的安装要求。 6) Docker 7) Aqua Trivy 8) Kubernetes 9) Zaproxy
DevOps云学堂
2023/11/29
9270
DevSecOps 管道: 使用Jenkins自动化CI/CD管道以实现安全的多语言应用程序
Jenkins 流水线配置历史插件介绍
这一切开始于十年之前 —— 经典的任务类型 (例如:自由风格、Maven 等等)。每隔一段时间,用户就会联系我们,因为他们的任务无法在一夜之间完成。为什么这个任务失败了呢?这次失败和任务配置变更有关系吗?用户典型的回答是:"我们没有改任何东西",但这是真的吗?我们思考了这个问题,并决定开发一个插件来帮助我们解决这个问题。这就是plugin:jobConfigHistory[任务配置历史]的想法和开始。
LinuxSuRen
2019/08/02
9770
Jenkins 流水线配置历史插件介绍
流水线即代码
2016年11月份的技术雷达中给出了一个简明的定义:流水线即代码 (Pipeline as Code) 通过编码而非配置持续集成/持续交付 (CI/CD) 运行工具的方式定义部署流水线。 其实早在2015年11月份的技术雷达当中就已经有了类似的概念:
lambeta
2018/08/17
6320
流水线即代码
3.Jenkins进阶之流水线pipeline基础使用实践
描述:此处重新不在累述新建流水线任务(maven-pipeline-helloword)而是直接进行配置测试等关键项; 流程:代码拉取 -> 代码检测 -> 代码构建 -> 代码部署 -> 消息通知
全栈工程师修炼指南
2022/09/29
4.6K0
3.Jenkins进阶之流水线pipeline基础使用实践
相关推荐
MPL - 模块化的流水线库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档