Jenkins 是什么?
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins 是一个扩展性非常强的软件,其功能主要通过插件来扩展。如果想通过开发插件来扩展 Jenkins 的能力,请参考扩展 Jenkins (开发者手册)。
Jenkins有内置的命令行界面,允许用户和管理员从脚本或shell环境(http或ssh)访问Jenkins。这对于日常任务的脚本编写,批量更新,故障排除等都是很方便的。
安装jenkins
第一次使用 Jenkins,您需要:
机器要求:
1) 256 MB 内存,建议大于 512 MB
2) 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
需要安装以下软件:
Java 8 ( JRE 或者 JDK 都可以)
Docker (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载)
下载并运行 Jenkins:
1) 下载 Jenkins.
2) 打开终端进入到下载目录.
3) 运行命令 java -jar jenkins.war --httpPort=8080
4) 浏览器打开链接 http://localhost:8080。
安装完成后,您可以开始使用 Jenkins!
什么是Jenkins Pipeline流水线,Pipeline流水线hello world,pipline流水线特性,pipline流水线相关概念
Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中。
持续交付 Pipeline 自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。
Jenkins Pipeline提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline的定义通常被写入到一个文本文件(称为Jenkinsfile)中,该文件可以被放入项目的源代码控制库中。
快速开始使用 Pipeline:
0) 将示例复制到您的仓库中并命名为Jenkinsfile
1) 单击Jenkins中的New Item菜单
2) 为您的新工程起一个名字(例如My Pipeline) ,选择 Multibranch Pipeline
3) 单击 Add Source 按钮,选择您想要使用的仓库类型并填写详细信息。
4) 单击 Save 按钮,观察您的第一个Pipeline运行!
5) 修改Jenkinsfile以便应用在您自己的项目中。尝试修改 sh 命令,使其与您本地运行的命令相同。
在配置好Pipeline之后,Jenkins会自动检测您仓库中创建的任何新的分支或合并请求, 并开始为它们运行 Pipelines。
Jenkinsfile 能使用两种语法进行编写 - 声明式和脚本化。声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是Jenkins流水线更近的特性:1) 相比脚本化的流水线语法,它提供更丰富的语法特性;2) 是为了使编写和读取流水线代码更容易而设计的。
本质上Jenkins是一个自动化引擎,它支持许多自动模式。 流水线向Jenkins中添加了一组强大的工具, 支持用例简单的持续集成到全面的CD流水线。通过对一系列的相关任务进行建模,用户可以利用流水线的很多特性:
Code: 流水线是在代码中实现的,通常会检查到源代码控制,使团队有编辑,审查和迭代他们的交付流水线的能力。
Durable: 流水线可以从Jenkins的主分支的计划内和计划外的重启中存活下来。
Pausable: 流水线可以有选择的停止或等待人工输入或批准,然后才能继续运行流水线。
Versatile: 流水线支持复杂的现实世界的 CD 需求,包括fork/join,循环,并行执行工作的能力。
Extensible:流水线插件支持扩展到它的DSL的惯例和与其他插件集成的多个选项。
然而, Jenkins一直允许以将自由式工作链接到一起的初级形式来执行顺序任务,流水线使这个概念成为了Jenkins的头等公民。
流水线Pipeline相关概念
流水线是用户定义的一个CD流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段 。
节点node是一个机器 ,它是Jenkins环境的一部分 and is capable of执行流水线。
阶段stage 块定义了在整个流水线的执行任务的概念性地不同的的子集(比如 "Build", "Test" 和 "Deploy" 阶段),它被许多插件用于可视化 或Jenkins流水线目前的 状态/进展。
步骤step:本质是一个单一的任务,a step告诉Jenkins在特定的时间点要做_what_ (或过程中的 "step")。 举个例子,要执行shell命令,请使用sh步骤: sh 'make'。当一个插件扩展了流水线DSL,通常意味着插件已经实现了一个新的step。
代理agent是声明式流水线的一种特定语法,它指示Jenkins为整个流水线分配一个执行器 (在节点上)和工作区。
BlueOcean创建Pipeline
要从Git存储库创建Pipeline,首先选择“Git”作为源代码控制系统。然后输入Git Repository的URL,并可选择选择要使用的凭据。如果下拉列表中没有显示所需的凭据,则可以使用“添加”按钮添加。完成后,点击“创建Pipeline”。BlueOcean将查看所选存储库的所有分支,并将为包含a的每个分支启动Pipeline运行Jenkinsfile。
要从GitHub创建Pipeline,首先选择“GitHub” 作为源代码控制系统。如果这是当前登录用户首次运行Pipeline创建,Blue Ocean将要求 GitHub访问令牌 允许Blue Ocean访问您的组织和存储库。
BlueOceanPipeline编辑器
执行多个步骤(step)
Pipelines 由多个步骤(step)组成,允许你构建、测试和部署应用。 Jenkins Pipeline 允许您使用一种简单的方式组合多个步骤, 以帮助您实现多种类型的自动化构建过程。
可以把“步骤(step)”看作一个执行单一动作的单一的命令。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline 的执行结果也为失败。
当所有的步骤都执行完成并且为成功时,Pipeline 的执行结果为成功。
超时、重试和更多
Jenkins Pipeline提供了很多的步骤(step),这些步骤可以相互组合嵌套,方便地解决像重复执行步骤直到成功(重试)和如果一个步骤执行花费的时间太长则退出(超时)等问题。
“Deploy”阶段(stage)重复执行 flakey-deploy.sh 脚本3次,然后等待 health-check.sh 脚本最长执行3分钟。 如果 health-check.sh 脚本在 3 分钟内没有完成,Pipeline 将会标记在“Deploy”阶段失败。
内嵌类型的步骤,例如timeout和retry可以包含其他的步骤,包括 timeout 和 retry 。例如,如果我们想要重试部署任务 5 次,但是总共花费的时间不能超过 3 分钟。
完成时动作:当Pipeline运行完成时,你可能需要做一些清理工作或者基于Pipeline的运行结果执行不同的操作, 这些操作可以放在post部分。
定义执行环境 :如何定义代理agent
agent指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。 所有的Pipeline都需要agent指令。
在执行引擎中,agent 指令会引起以下操作的执行:
1) 所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器executor是可以利用的,这些步骤将会开始执行。
2) 一个工作空间workspace将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件。
在Pipeline中5种 定义代理的方式:
any:Execute the Pipeline, or stage, on any available agent. For example: agent any
none:When applied at the top-level of the pipeline block no global agent will be allocated for the entire Pipeline run and each stage section will need to contain its own agent section. For example: agent none
label:Execute the Pipeline, or stage, on an agent available in the Jenkins environment with the provided label. For example: agent { label 'my-defined-label' }. Label conditions can also be used. For example: agent { label 'my-label1 && my-label2' } or agent { label 'my-label1 || my-label2' }
node: agent { node { label 'labelName' } } behaves the same as agent { label 'labelName' }, but node allows for additional options (such as customWorkspace).
docker: Execute the Pipeline, or stage, with the given container which will be dynamically provisioned on a node pre-configured to accept Docker-based Pipelines, or on a node matching the optionally defined label parameter. docker also optionally accepts an args parameter which may contain arguments to pass directly to a docker run invocation, and an alwaysPull option, which will force a docker pull even if the image name is already present. For example: agent { docker 'maven:3-alpine' }
以使用Docker容器的代理方式为例
当执行Pipeline时,Jenkins将会自动运行指定的容器,并执行Pipeline中已经定义好的步骤steps:
使用环境变量
环境变量可以设置为全局的,也可以是阶段(stage)级别的。 阶段(stage)级别的环境变量只能在定义变量的阶段(stage)使用。
这种在Jenkinsfile中定义环境变量的方法对于指令性的脚本定义非常有用方便, 比如Makefile文件,可以在Pipeline中配置构建或者测试的环境,然后在Jenkins中运行。
环境变量的另一个常见用途是设置或者覆盖构建或测试脚本中的凭证。 因为把凭证信息直接写入Jenkinsfile显然是一个坏主意,Jenkins Pipeline允许用户快速安全地访问在Jenkinsfile中预定义的凭证信息,并且无需知道它们的值。
Credentials configured in Jenkins can be handled in Pipelines for immediate use.In this example, two secret text credentials are assigned to separate environment variables to access Amazon Web Services (AWS). These credentials would have been configured in Jenkins with their respective credential IDs:jenkins-aws-secret-key-id and jenkins-aws-secret-access-key.
You can reference the two credential environment variables (defined in this Pipeline’s environment directive), within this stage’s steps using the syntax $AWS_ACCESS_KEY_ID and $AWS_SECRET_ACCESS_KEY. For example, here you can authenticate to AWS using the secret text credentials assigned to these credential variables.
记录测试和构建结果
虽然测试是良好的持续交付过程中的关键部分,但大多数人并不希望筛选数千行控制台输出来查找有关失败测试的信息。为了简化操作,只要您的测试运行时可以输出测试结果文件,Jenkins就可以记录和汇总这些测试结果。 Jenkins通常与 junit 步骤捆绑在一起,但如果您的测试运行结果无法输出JUnit样式的XML报告, 那么还有其他插件可以处理任何广泛使用的测试报告格式。
这将会获得测试结果,Jenkins会持续跟踪并计算测试的趋势和结果。如果存在失败的测试用例,Pipeline会被标记为 “UNSTABLE”,在网页上用黄色表示, 这不同于使用红色表示的 “FAILED” 失败状态。
清理和通知
因为post部分保证在Pipeline结束的时候运行,所以可以添加通知或其他的步骤去完成清理、通知或者其他的Pipeline结束任务。
有很多方法可以发送通知:电子邮件、Hipchat room或者Slack channel发送Pipeline的相关信息,以电子邮件为例。
部署
大多数最基本的持续交付 Pipeline 至少会有三个阶段:构建、测试和部署,这些阶段被定义在 Jenkinsfile 中。稳定的构建和测试阶段是任何部署活动的重要前提。
假定 ./run-smoke-tests 脚本所运行的冒烟测试足以保证或者验证可以发布到生产环境。 这种可以自动部署代码一直到生产环境的 Pipeline 可以认为是“持续部署”的一种实现。 虽然这是一个伟大的想法,但是有很多理由表明“持续部署”不是一种很好的实践。
通常在阶段之间,特别是不同环境阶段之间,可能需要人工确认是否可以继续运行。例如,判断应用程序是否在一个足够好的状态可以进入到生产环境阶段。 这可以使input步骤完成。 上图中“Sanity check” 阶段会等待人工确认,并且在没有人工确认的情况下不会继续执行。
参考
https://www.jenkins.io/zh/doc/