Jenkins | 入门篇(二)

27 篇文章 1 订阅
24 篇文章 0 订阅

                       --昨夜西风凋碧树,独上高楼,望尽天涯路

官网原文: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'
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值