概述
--昨夜西风凋碧树,独上高楼,望尽天涯路
官网原文:https://jenkins.io/doc/
-
定义执行环境变量
前面我们注意到了Jenkins的agent命令。该命令告诉Jenkins在哪里以及如何执行Pipeline。agent对于所有的Pipeline都是必须的。agent确保了所有的steps中的代码块排队执行。Jenkins在执行脚本的时候会存在一个执行器,当上一条步骤执行成功,执行器空闲,下一条步骤开始执行。执行步骤的时候会分配一个工作区,该工作区将包含从源代码管理检出的文件以及Pipeline的任何附加工作文件。
有很多中方法可以定义Pipeline中使用的代理。本文中使用临时的docker agent。Pipeline是为了方便地使用Docker 镜像和容器来运行而设计的。Pipeline会定义所需的环境和工具,而不必手动地配置各种系统工具和对代理的依赖。这样几乎可以使用任何可以打包在Docker容器中的工具。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent {
docker { image 'node:7-alpine' }
}
stages {
stage('Test') {
steps {
sh 'node --version'
}
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
/* Requires the Docker Pipeline plugin to be installed */
docker.image('node:7-alpine').inside {
stage('Test') {
sh 'node --version'
}
}
}
当Pipeline执行时,Jenkins将自动启动指定的容器并在其中执行定义的步骤
-
全局变量
环境变量可以设置为全局环境变量,也可以在每个stage设置。每个stage设置环境变量意味着它们只适用于当前stage。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages {
stage('Build') {
steps {
sh 'printenv'
}
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
withEnv(['DISABLE_AUTH=true',
'DB_ENGINE=sqlite']) {
stage('Build') {
sh 'printenv'
}
}
}
这种从Jenkinsfile中定义环境变量的方法对于编写脚本(如Makefile)配置构建或测试的时候是非常有用的。
-
记录测试结果
测试是一个良好的持续交付的关键部分,Jenkins可以记录和聚合测试结果,只要测试运行器能够输出测试结果文件。Jenkins通常与junit步骤捆绑在一起,如果测试运行器不能输出junit风格的XML报告,那么还有其他插件可以处理任何广泛使用的测试报告格式。
通过post来收集测试结果:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Test') {
steps {
sh './gradlew check'
}
}
}
post {
always {
junit 'build/reports/**/*.xml'
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
try {
stage('Test') {
sh './gradlew check'
}
} finally {
junit 'build/reports/**/*.xml'
}
}
获取测试结果之后Jenkins可以进行追踪,计算趋势并生成报告。测试失败的管道将被标记为“不稳定”,在web UI中用黄色表示
当测试失败时,从Jenkins那里获取构建的信息来进行本地分析和调查通常是有用的。通过Jenkins内置的对存储“信息”(在管道执行过程中生成的文件)的支持,实现了这一点。
通过archiveArtifacts步骤和文件通配符可以实现:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('Test') {
steps {
sh './gradlew check'
}
}
}
post {
always {
archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
junit 'build/reports/**/*.xml'
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
try {
stage('Test') {
sh './gradlew check'
}
} finally {
archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
junit 'build/reports/**/*.xml'
}
}
如果在archiveArtifacts步骤中指定了多个参数,那么每个参数的名称必须显式地在步骤代码中指定——即部件(artifacts)的路径、文件名和指定fingerprint为true。
如果只需要指定部件(artifacts)的路径和文件名,那么您可以省略参数artifacts,例如:
archiveArtifacts ”build/ libs / * * / * . jar”
在Jenkins中记录测试和部件(artifacts)可以快速地向团队的各个成员显示信息。
-
清理以及通知
Pipeline的post在Pipeline的执行结束时运行,我们可以添加一些通知或其他步骤来执行终止、通知或其他Pipeline结束任务。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('No-op') {
steps {
sh 'ls'
}
}
}
post {
always {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
success {
echo 'I succeeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Things were different before...'
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
try {
stage('No-op') {
sh 'ls'
}
}
catch (exc) {
echo 'I failed'
}
finally {
if (currentBuild.result == 'UNSTABLE') {
echo 'I am unstable :/'
} else {
echo 'One way or another, I have finished'
}
}
}
执行失败之后发送E-mail:
post {
failure {
mail to: 'team@example.com',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Something is wrong with ${env.BUILD_URL}"
}
}
-
部署
最基本的持续交付Pipeline至少有三个阶段应该在Jenkinsfile中定义:构建、测试和部署。稳定的构建和测试阶段是任何部署活动的重要前奏。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building'
}
}
stage('Test') {
steps {
echo 'Testing'
}
}
stage('Deploy') {
steps {
echo 'Deploying'
}
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
stage('Build') {
echo 'Building'
}
stage('Test') {
echo 'Testing'
}
stage('Deploy') {
echo 'Deploying'
}
}
通常,在各个阶段之间进行传递时,特别是在环境阶段之间,在继续之前,有可能需要人工输入。例如,判断应用程序是否处于“提升”到生产环境的良好状态。这可以通过输入步骤来完成。在下面的示例中,“完整性检查”阶段实际上会阻塞输入,在没有人确认过程之前不会继续。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
/* "Build" and "Test" stages omitted */
stage('Deploy - Staging') {
steps {
sh './deploy staging'
sh './run-smoke-tests'
}
}
stage('Sanity check') {
steps {
input "Does the staging environment look ok?"
}
}
stage('Deploy - Production') {
steps {
sh './deploy production'
}
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
/* "Build" and "Test" stages omitted */
stage('Deploy - Staging') {
sh './deploy staging'
sh './run-smoke-tests'
}
stage('Sanity check') {
input "Does the staging environment look ok?"
}
stage('Deploy - Production') {
sh './deploy production'
}
}
最后
以上就是健康电话为你收集整理的Jenkins | 入门篇(二)的全部内容,希望文章能够帮你解决Jenkins | 入门篇(二)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复