这是一个由r·泰勒突堤他是Jenkins的长期贡献者,也是Jenkins项目基础架构的主要联系必威国际有限公司人。他也是詹金斯布道家必威国际有限公司CloudBees公司。 |
当Ruby on Rails它在两个值得注意的方面改变了行业:它创造了一种自以为是的web应用框架的趋势(Django,玩,Grails)它也强烈鼓励成千上万的开发人员接受测试驱动开发以及许多其他现代最佳实践(源代码控制、依赖项管理等)。因为Ruby, Rails下面的语言,是解释的而不是编译的,所以它本身并不是一个“构建”,而是几十个,甚至上百个测试,检查和扫描,这些都是用来确保应用程序的质量的。随着Rails的流行,应用程序托管服务与易于使用的部署工具的流行,如Heroku或Engine Yard也会上升。
这种良好的组合测试覆盖率,很容易自动化部署使用Jenkins使Rails易于连续交付。在本文中,我们将介绍如何使用必威国际有限公司必威国际有限公司詹金斯管道而且,作为额外的奖励,我们将增加安全扫描通过司闸员和司闸员插件.
主题
一个Ruby on Rails应用程序,可以让你管理你的会议的提议(CFP),程序和时间表。它是由Ruby Central编写的,用于运行RailsConf和RubyConf的cfp。
我选择这个Rails应用程序,不仅因为它是一个庞大的应用程序,有很多测试,但它实际上是我们用来收集谈话的提议,为“社区追踪“在今年的必威国际有限公司詹金斯世界.在大多数情况下,cfp-app是一个标准的Rails应用程序。它使用PostgreSQL的数据库,RSpec用于测试Ruby 2.3.x作为其运行时。
如果您只想查看代码,可以直接跳到必威国际有限公司Jenkinsfile. |
为大多数Rails应用程序很少(如果有的话)需要更改来支持Jenkins的持续交付。必威国际有限公司在…的情况下cfp-app,我添加了两个宝石,以获得最佳的集成到Jenkins:必威国际有限公司
ci_reporter,用于测试报告集成
司闸员,用于安全扫描。
添加这些很简单,我只需要更新Gemfile
和Rakefile
在存储库的根目录中包含:
# . .剪. .集团:测试做# RSpec等宝石'ci_reporter'宝石'ci_reporter_rspec'宝石"司闸员",:要求=>假结束
# . .剪. .需要'ci /记者/耙/ rspec'#确保在执行RSpec示例之前设置了ci_reporter任务:规范=>'置信区间:设置:rspec'
cfp-app项目设置好后,接下来要做的就是确保Jenkins本身已经准备好了。必威国际有限公司一般来说,我建议运行最新LTS詹金斯必威国际有限公司;在这个演示中,我使用了Jenkins 2.7.1和以下插件:必威国际有限公司
我还使用了GitHub组织文件夹插件在Jenkins实例中自动创建管道项;必威国际有限公司这不是演示所必需的,但是使用必威国际有限公司Jenkinsfile
会自动出现在Jenkins中,所以我推荐它!必威国际有限公司
来理解各种各样的东西必威国际有限公司Jenkinsfile
我发现简单地定义我的管道的阶段更容易开始。这有助于我从广义上考虑我的管道应该有什么样的操作顺序。例如:
/*将我们的工作分配给一个标记为'docker'的代理*/节点('码头工人'){阶段'准备容器'阶段'安装的宝石'阶段'准备数据库'阶段'调用耙'阶段'安全扫描'阶段'部署'}
正如前面提到的,这必威国际有限公司Jenkinsfile
会严重依赖于CloudBees Docker管道插件.该插件提供了两个非常重要的特性:
执行步骤的能力内部正在运行的Docker容器
能够在“后台”运行容器。
与大多数Rails应用程序一样,可以使用两个命令有效地测试应用程序:包安装
紧随其后的是包exec耙
.我已经准备了一些Docker图像数位视讯并安装了Ruby 2.3.0,这确保了一个公共和一致的起点:
节点('码头工人'){/ / . .“舞台”步骤移除docker.image('rtyler /数位视讯tripwire').里面{(1)数位视讯'包安装'(2)数位视讯'包exec耙'}(3)}
1 | 运行命名容器。的内部 方法可以接受可选的附加标志码头工人运行 命令。 |
2 | 使用我们的tiny上海 一步包装数位视讯 .这确保了shell代码在正确的RVM环境中执行。 |
3. | 当闭合完成时,容器将被销毁。 |
不幸的是,在这个应用程序中包exec耙
如果进程启动时PostgreSQL不可用,命令将失败。这就是第二个CloudBees Docker Pipeline插件的重要特性开始生效:在“后台”运行容器的能力。
节点('码头工人'){/ / . .“舞台”步骤移除/*取出最新的' postgres '容器并在后台运行*/docker.image('postgres').> . withRun(1)回声"运行在容器中的PostgreSQL$ {container.id}"(2)}(3)}
1 | 有效地运行容器码头工人postgres运行 |
2 | 任意数量的步骤都可以进入闭包 |
3. | 当闭合完成时,容器将被销毁。 |
结合詹金斯管道的这两个片段,在我看来,是力量必威国际有限公司DSL亮点:
节点('码头工人') {docker.image ('postgres').withRun{容器-> docker.image('rtyler /数位视讯tripwire') .inside ("——链接=$ {container.id}: postgres"){(1)阶段'安装的宝石'数位视讯"包安装"阶段'调用耙'withEnv (['DATABASE_URL = postgres: / / postgres@postgres: 5432 /') {(2)数位视讯"包exec耙"} junit'规范/报告/ * . xml'(3)}}}
1 | 通过——链接 参数,Docker守护进程将允许RVM容器以主机名'postgres'与PostgreSQL容器通信。 |
2 | 使用withEnv 步骤为闭包中的所有内容设置环境变量。在这种情况下,cfp-app DB脚手架将查找DATABASE_URL 变量来覆盖DB host/user/dbname的默认值。 |
3. | 将生成的测试报告归档ci_reporter以便Jenkin必威国际有限公司s能够显示测试报告和趋势分析。 |
完成这些之后,就具备了在每次管道执行时在新鲜Docker容器中一致运行cfp-app测试的基础。
基于以上示例,我们可以实现“安全扫描”阶段:
节点('码头工人'){/*——8<——8<——snipsnipip——8<——8<——*/阶段'安全扫描'数位视讯'司闸员- o brakeman-output。选项卡——没有任何进展——独立的模型'(1)publishBrakeman'brakeman-output.tabs'(2)/*——8<——8<——snipsnipip——8<——8<——*/}
1 | 运行司闸员用于Rails的安全扫描程序,并存储输出,以备将来使用brakeman-output.tabs |
2 | 存档由Brakeman生成的报告,以便Jenkins可以显示带有趋势分析的详细报告。必威国际有限公司 |
在撰写本文时,有一些工作正在进行(必威国际有限公司詹金斯- 31202)来在管道项目的主页上呈现类似于Brakeman的插件的趋势图。 |
一旦测试和安全扫描都正常工作,我们就可以开始设置部署阶段了。必威国际有限公司Jenkins Pipeline提供了这个变量currentBuild
我们可以用它来确定我们的管道到目前为止是否成功。这允许我们添加逻辑,只在一切都经过时才部署,正如我们所期望的:
节点('码头工人'){/*——8<——8<——snipsnipip——8<——8<——*/阶段'部署'如果(currentBuild。结果= ='成功'){(1)上海'。/ deploy.sh'(2)}其他的{邮件主题:"有问题$ {env。JOB_NAME}$ {env。BUILD_ID}",来:'nobody@example.com',身体:'你应该把它修好'}/*——8<——8<——snipsnipip——8<——8<——*/}
1 | currentBuild 有结果 也就是“成功” ,“失败” ,“不稳定” ,“失败” |
2 | 只有在currentBuild.result 如果我们需要调用部署脚本(例如。Git push heroku master ) |
我毫无理由地评论了全部内容必威国际有限公司Jenkinsfile我希望这是对上述工作的有益总结。在过去的Rails应用中,Docker和Jenkins Pipeline提供的一致性肯定会改善这些项目的交付时间。必威国际有限公司但仍有改进的空间,留给读者作为练习。例如:准备新的容器与所有的内置的依赖而不是在运行时安装它们。或利用平行
步骤,用于同时跨多个Jenkins代理执行RSpec。必威国际有限公司
在代码中定义持续交付和持续安全的管道的美妙之处在于,您可以继续对其进行迭代!