这篇客座文章最初发表在Wolox的Medium账号上在这里。 |
几年前,我们的首席技术官写了一篇关于建立一个使用Jenkins和docker为Ruby On Rails提供持续集成服务器必威国际有限公司。在过去的几年里,该解决方案一直是我们的CI管道,直到最近我们决定进行升级。为什么?
必威国际有限公司Jenkins版本已经过时了,很难升级
Wolox在过去的几年里有显著的增长,我们一直在经历规模问题
很少有人知道如何解决服务器的任何问题
配置作业不是一项容易的任务,这使得我们的项目启动过程变慢了
更改每个作业运行的命令并不容易,而且没有多少人具有这样做的权限。Wolox有各种各样的项目,使用各种各样的语言,这使得这个问题更加严重。
考虑到这些问题,我们开始深入研究Jenkins的最新版本,看看如何改善我们的CI。必威国际有限公司我们需要构建一个新的CI,至少可以解决以下问题:
项目必须使用Docker构建。我们的项目依赖于一个或多个docker映像来运行(应用程序,数据库,redis等)
易于配置和复制(如果需要)
容易添加一个新项目
容易改变建筑的步骤。如果想要运行项目,每个参与项目的人都应该能够进行更改npm安装或线安装。
安装Jenkins很简必威国际有限公司单。你可以访问必威国际有限公司詹金斯安装页面和选择最适合您的需要。
以下是我们在AWS中安装Jenkins的步骤:必威国际有限公司
sudo rpm - import https://pkg.必威国际有限公司jenkins.io/debian/jenkins.io.key sudo wget - o/ etc/yum. rews .d/jenkins. txtRepo https://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分支源插件。它允许Jenkins必威国际有限公司扫描GitHub组织中符合特定规则的项目,并自动将它们添加到Jenkins中。为了添加所有分支,它们必须满足的唯一约束是它们包含一个解释如何构建项目的jenkins文件。必威国际有限公司
与之前的Jenkins共事时,我们遇到的最大痛苦之一是难以更改构建项目所需的步骤。必威国际有限公司如果你查看一个项目的构建步骤,你会发现如下内容:
# !/bin/bash +x set -e #删除不必要的文件echo -e "\033[34m删除不必要的文件…\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 #准备测试数据库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 #运行tests COMMAND="bundle exec rspec spec" echo -e "\033[34mRunning:$COMMAND\033[0m" unbuffer docker-compose——project-name=${JOB_NAME} run web $COMMAND #执行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
一些post build步骤清理了docker:
# !/bin/bash +x docker-compose——project-name=${JOB_NAME} stop &> /dev/null || true &> /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 || true &> /dev/null
尽管这些命令并不复杂,但是要更改它们中的任何一个,都需要有权限修改作业的人,并且了解需要做什么。
现在的詹金斯版本,我们可以利用必威国际有限公司必威国际有限公司詹金斯管道并在文件中为构建流建模。该文件被检入存储库,因此,任何人都可以更改构建步骤。耶!
必威国际有限公司Jenkins Pipeline甚至支持:
这是一个完美的案例Wolox。我们可以将构建配置放在一个文件中,这个文件签入到存储库中,任何对它具有写访问权限的人都可以更改它。然而,一个简单的rai必威国际有限公司ls项目的jenkins文件看起来是这样的:
#Jenkins必威国际有限公司file示例。可能无法编译节点{checkout scm withEnv(['MYTOOL_HOME = / usr /地方/ mytool') {docker.image ("postgres: 9.2").withRun() {db -> withEnv(['DB_USERNAME = postgres','DB_PASSWORD =',"DB_HOST = db","DB_PORT = 5432") {docker.image ("复述:X").withRun() {redis -> withEnv(["REDIS_URL =复述:/ /复述") {docker.build (imageName"——文件.woloxci / Dockerfile。") .inside ("——链接$ {db.id}: postgres——链接$ {redis.id}:复述,") {sh"rake db:创建"上海"rake db: migrate"上海"捆绑执行rspec规范"} } } } } } }
这个文件不仅阅读困难,而且更改起来也很困难。如果您不熟悉Groovy,就很容易出错,如果您对Jenkins的管道是如何工作的一无所知,就更容易出错。必威国际有限公司更改或添加新的Docker映像并不简单,可能会导致混淆。
就我个人而言,我一直羡慕CI的简单配置文件,这一次是我们构建可以使用YAML文件进行配置的CI的机会。经过一些分析后,我们得出这样的YAML就足够了:
配置:dockerfile:.woloxci / Dockerfileproject_name:some-project-name服务: -postgresql-复述,步骤:分析: -bundle exec rubocop -R应用程序规范——格式简单-Bundle exec rubycritical——path ./analysis——minimum-score 80——no-browsersetup_db: -Bundle exec rails db:创建-Bundle exec rails db:schema:load测验: -包exec rspec安全: -Bundle exec brakeeman -exit-on-error审计: -Bundle审计检查——更新环境:RAILS_ENV:测验GIT_COMMITTER_NAME:一个GIT_COMMITTER_EMAIL:b朗:C.UTF-8
它概述了项目的一些基本配置、运行期间需要出现的环境变量、依赖的服务和我们的构建步骤。
在调查了詹金斯和输油管道一段时间后,我们发现我们可以用必威国际有限公司共享库。共享库是用groovy编写的,可以导入到管道中并在必要时执行。
如果仔细观察这个jenkins文件,我们会发现代码是一个接收必威国际有限公司闭包的方法调用链,我们在其中执行另一个方法,将新闭包传递给它。
#Jenkins必威国际有限公司file示例。可能无法编译节点{checkout scm withEnv(['MYTOOL_HOME = / usr /地方/ mytool') {docker.image ("postgres: 9.2").withRun() {db -> withEnv(['DB_USERNAME = postgres','DB_PASSWORD =',"DB_HOST = db","DB_PORT = 5432") {docker.image ("复述:X").withRun() {redis -> withEnv(["REDIS_URL =复述:/ /复述") {docker.build (imageName"——文件.woloxci / Dockerfile。") .inside ("——链接$ {db.id}: postgres——链接$ {redis.id}:复述,") {sh"rake db:创建"上海"rake db: migrate"上海"捆绑执行rspec规范"} } } } } } }
Groovy足够灵活,允许在运行时创建相同的声明性代码,使我们使用YAML配置作业的梦想实现了!
这就是wolox-ci诞生了——我们为詹金斯共享的图书馆!必威国际有限公司
与wolox-ci,我们的je必威国际有限公司nkins文件现在缩减为:
@Library('wolox-ci') _节点{校验scm woloxCi('.woloxci / config.yml');}
现在它只是检出代码,然后调用wolox-ci。库读取这样的yaml文件
配置:dockerfile:.woloxci / Dockerfileproject_name:some-project-name服务: -postgresql-复述,步骤:分析: -bundle exec rubocop -R应用程序规范——格式简单-Bundle exec rubycritical——path ./analysis——minimum-score 80——no-browsersetup_db: -Bundle exec rails db:创建-Bundle exec rails db:schema:load测验: -包exec rspec安全: -Bundle exec brakeeman -exit-on-error审计: -Bundle审计检查——更新环境:RAILS_ENV:测验GIT_COMMITTER_NAME:一个GIT_COMMITTER_EMAIL:b朗:C.UTF-8
并建立jenkins文件,让你必威国际有限公司的工作运行起来。
拥有共享库的好处在于,我们可以以集中的方式扩展和修复我们的库。一旦我们添加了新代码,库就会在Jenkins中自动更新,它将用更新通知我们所有的作业。必威国际有限公司
因为我们有不同语言的项目,所以我们使用Docker来构建测试环境。WoloxCI假设有一个Dockerfile要构建,并将在容器中运行所有指定的命令。
WoloxCI仍在使用我们项目的一个不小的样本进行测试。通过YAML文件更改构建步骤的可能性使每个人都可以访问它,这对我们的CI工作流是一个很大的改进。
Docker为我们提供了轻松更改编程语言的可能性,而无需对Jenkins安装进行任何更改。当检测到带有Jenkins文件的新存储库时,Jenkins的Github Organization特性会自动添加新项目。必威国际有限公司
所有这些改进都大大减少了我们维护Jenkins的时间,并为我们提供了无需任何额外配置就可以轻松扩展的可能性。必威国际有限公司
这个库在我们的CI中工作,但仍然可以改进。如果您想添加功能,请随意贡献!