Jenkins提供了一种简单的方法,可以使用管道为语言和源代码存储库的几乎任何组合设置持续集成或持续交付 ( CI / CD )环境,并自动执行其他常规开发任务。 尽管Jenkins并没有消除为单个步骤创建脚本的需要,但是它确实为您提供了一种比您可以轻松地构建自己的集成整个构建,测试和部署工具链更快,更可靠的方法。
“不要破坏夜间建筑!” 这是软件开发商店的基本规则,每天早上为测试人员发布新构建的每日产品版本。 在詹金斯(Jenkins)之前,开发人员能够避免破坏夜间构建的最佳方法是在提交代码之前,在本地计算机上仔细成功地进行构建和测试。 但这意味着孤立地测试一个人的更改, 而无需其他人的日常提交。 没有任何坚决保证,夜间构建将在一个人的承诺下幸存下来。
[ 同样在InfoWorld上:什么是CI / CD? 持续集成和持续交付的解释 ]
詹金斯-最初是哈德逊-是对此限制的直接回应。
哈德森和詹金斯
2004年,Kawasuke Kawaguchi是Sun的Java开发人员。 Kawaguchi厌倦了在开发工作中破坏构建的过程,并希望找到一种方法,以便在将代码提交到存储库之前知道代码是否将正常工作。 因此,川口在Java中构建了一个自动化服务器,并将其实现为Java,称为Hudson。 Hudson在Sun广受欢迎,并以开源的形式传播到其他公司。
快进到2011年,甲骨文(已经收购了Sun)与独立的哈德逊开源社区之间发生了争执,导致了一个名称更改的分支: 詹金斯 。 2014年,Kawaguchi成为CloudBees的CTO,该公司提供基于Jenkins的连续交付产品。
尽管詹金斯(Jenkins)更活跃,但两个叉子仍然存在。 今天,詹金斯项目仍在进行中。 Hudson网站于2020年1月31日关闭。
在2019年3月,Linux基金会与CloudBees,Google和许多其他公司一起,成立了一个新的开源软件基金会,称为持续交付基金会 ( CDF )。 詹金斯(Jenkins)的贡献者决定他们的项目应该加入这个新基金会。 川口当时写道,对于用户而言,意义不大。
川口在2020年1月宣布,他将转到新的创业公司Launchable 。 他还表示,尽管将留在持续交付基金会的技术监督委员会,并将他在CloudBees的职位转为顾问,但他将正式退出詹金斯。
相关视频:如何使用CI / CD更快地交付代码
詹金斯自动化
如今,Jenkins已成为领先的开源自动化服务器,带有约1,600个插件,可支持各种开发任务的自动化。 Kawaguchi最初试图解决的问题是Java代码的持续集成和持续交付(即,构建项目,运行测试,进行静态代码分析和部署)只是人们使用Jenkins进行自动化的众多过程之一。 这1,600个插件涵盖五个领域:平台,UI,管理,源代码管理,以及最常见的构建管理。
詹金斯的工作方式
Jenkins作为WAR归档文件和主要操作系统的安装程序包,Homebrew程序包,Docker映像和源代码进行分发。 源代码主要是Java,并带有一些Groovy,Ruby和Antlr文件。
您可以独立运行Jenkins WAR,也可以在Tomcat之类的Java应用程序服务器中作为servlet运行。 无论哪种情况,它都会生成一个Web用户界面并接受对其REST API的调用。
首次运行Jenkins时,它将创建一个具有长随机密码的管理用户,您可以将其粘贴到其初始网页中以解锁安装。
[ 同样在InfoWorld上:如何通过左移测试改善CI / CD ]
Jenkins插件
安装后,Jenkins允许您接受默认插件列表或选择自己的插件。
选择了最初的插件集后,单击“安装”按钮,Jenkins将添加它们。
Jenkins主屏幕显示当前的构建队列和执行器状态,并提供链接以创建新项目(作业),管理用户,查看构建历史记录,管理Jenkins,查看您的自定义视图和管理凭据。
新的Jenkins项目可以是六种类型的工作中的任何一种,再加上用于组织项目的文件夹。
您可以从“管理Jenkins”页面执行18项操作,包括打开命令行界面的选项。 但是,在这一点上,我们应该看一下管道,它们是通常由脚本定义的增强型工作流程。
[ 同样在InfoWorld上:启动devops程序的3种方法 ]
詹金斯管道
一旦配置了Jenkins,就该创建一些Jenkins可以为您构建的项目了。 虽然你可以使用Web UI创建脚本,目前最好的做法是创建一个管道剧本 ,名为Jenkinsfile,并检查它到你的资料库。 下面的屏幕快照显示了多分支管道的配置Web表单。
如您所见,在我的基本Jenkins安装中,此类管道的分支源可以是Git或Subversion存储库,包括GitHub。 如果您需要其他类型的存储库或其他在线存储库服务,只需添加适当的插件并重新启动Jenkins。 我曾尝试过,但没有想到尚未列出Jenkins插件的源代码管理系统(SCM)。
Jenkins管道可以是声明性的或脚本化的。 声明性管道(两者中的简单者)使用与Groovy兼容的语法-如果需要,可以使用#!groovy
启动文件,以将代码编辑器指向正确的方向。 声明性管道用开始pipeline
块,定义了一个agent
,并且限定stages
包括可执行steps
,如下面的三阶段的例子。
pipeline {
agent any
stages {
stage(‘Build’) {
steps {
echo ‘Building..’
}
}
stage(‘Test’) {
steps {
echo ‘Testing..’
}
}
stage(‘Deploy’) {
steps {
echo ‘Deploying....’
}
}
}
}
pipeline
是调用Jenkins管道插件的必需外部块。 agent
定义您要在何处运行管道。 any
说要使用任何可用的代理程序来运行管道或阶段。 更具体的代理可以声明要使用的容器,例如:
agent {
docker {
image ‘maven:3-alpine’
label ‘my-defined-label’
args ‘-v /tmp:/tmp’
}
}
stages
包含一个或多个阶段指令的序列。 在上面的示例中,三个阶段是构建,测试和部署。
steps
做实际工作。 在上面的示例中,步骤仅打印消息。 一个更有用的构建步骤可能如下所示:
pipeline {
agent any
stages {
stage(‘Build’) {
steps {
sh ‘make’
archiveArtifacts artifacts: ‘**/target/*.jar’, fingerprint: true
}
}
}
}
在这里,我们从外壳调用make
,然后将任何生成的JAR文件归档到Jenkins档案中。
post
部分定义将在管道运行或阶段结束时运行的操作。 您可以在post部分中使用许多后置条件块: always
, changed
, failure
, success
, unstable
和aborted
。
例如,下面的Jenkinsfile始终在Test阶段之后运行JUnit,但仅在管道失败时才发送电子邮件。
pipeline {
agent any
stages {
stage(‘Test’) {
steps {
sh ‘make check’
}
}
}
post {
always {
junit ‘**/target/*.xml’
}
failure {
mail to: team@example.com, subject: ‘The Pipeline failed :(‘
}
}
}
声明性管道可以表达定义管道所需的大部分内容,并且比脚本化管道语法(基于Groovy的DSL)更容易学习。 脚本化管道实际上是成熟的编程环境。
为了进行比较,以下两个Jenkinsfiles完全等效。
声明式管道
pipeline {
agent { docker ‘node:6.3’ }
stages {
stage(‘build’) {
steps {
sh ‘npm —version’
}
}
}
}
脚本管道
node(‘docker’) {
checkout scm
stage(‘Build’) {
docker.image(‘node:6.3’).inside {
sh ‘npm —version’
}
}
}
蓝海,詹金斯GUI
如果您想要最新,最好的Jenkins UI,则可以使用Blue Ocean插件,该插件可提供图形化的用户体验。 您可以将Blue Ocean插件添加到现有的Jenkins安装中,或运行Jenkins / Blue Ocean Docker容器 。 安装了Blue Ocean后,您的Jenkins主菜单将带有一个额外的图标:
您可以根据需要直接打开Blue Ocean。 它位于Jenkins服务器上的/ blue文件夹中。 与纯Jenkins相比,Blue Ocean中的管道创建更加图形化:
詹金斯·Docker
如前所述,Jenkins还作为Docker映像分发。 该过程没有更多内容:选择SCM类型后,您将提供URL和凭据,然后从单个存储库创建管道或扫描组织中的所有存储库。 每个带有Jenkinsfile的分支都将获得一个管道。
[ DevSecOps:如何将安全性引入敏捷开发和CI / CD ]
在这里,我正在运行一个Blue Ocean Docker映像,该映像安装了比SCM提供程序的默认列表更多的Git服务插件:
一旦运行了一些管道,Blue Ocean插件将显示其状态,如上所示。 您可以放大单个管道以查看阶段和步骤:
您还可以放大分支(顶部)和活动(底部):
-
为什么使用詹金斯?
我们一直在使用的Jenkins Pipeline插件支持一般的持续集成/连续交付(CICD)用例,这可能是Jenkins最常见的用法。 对于其他一些用例,还有一些特殊的注意事项。
Java项目是Jenkins最初的存在理由。 我们已经看到Jenkins支持使用Maven进行构建。 它还可以与Ant,Gradle,JUnit,Nexus和Artifactory一起使用。
Android运行一种Java,但引入了如何在各种Android设备上进行测试的问题。 Android模拟器插件可让您在需要定义的任意数量的模拟设备上进行构建和测试。 Google Play Publisher插件可让您将内部版本发送到Google Play中的Alpha通道,以在实际设备上发布或进一步测试。
我已经展示了一些示例,其中我们将Docker容器指定为管道的代理,并在Docker容器中运行Jenkins和Blue Ocean。 Docker容器在Jenkins环境中对于提高速度,可伸缩性和一致性非常有用。
Jenkins和GitHub有两个主要用例。 一种是构建集成,它可以包括一个服务挂钩,以在每次对GitHub存储库的提交时触发Jenkins。 第二个是使用GitHub身份验证来控制通过OAuth对Jenkins的访问。
Jenkins除Java外还支持许多其他语言。 对于C / C ++,有一些插件可以捕获来自控制台的错误和警告,使用CMake生成构建脚本,运行单元测试以及执行静态代码分析。 Jenkins与PHP工具有很多集成。
[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]
尽管不需要构建Python代码(例如,除非您正在使用Cython或创建要安装的Python轮子),但Jenkins与Python测试和报告工具(如Nose2和Pytest)以及代码质量的集成非常有用Pylint之类的工具。 同样,Jenkins与Rake,Cucumber,Brakeman和CI :: Reporter等Ruby工具集成。
Jenkins用于CI / CD
总体而言,Jenkins提供了一种简单的方法,可以使用管道为各种语言和源代码存储库的任意组合设置CI / CD环境,并自动执行许多其他常规开发任务。 尽管Jenkins并没有消除为单个步骤创建脚本的需要,但它确实为您提供了一种比您可以轻松构建自己的方式更快,更强大的方法来集成整个构建,测试和部署工具链。
From: https://www.infoworld.com/article/3239666/what-is-jenkins-the-ci-server-explained.html