简明Jenkins入门教程

Posted 云技术实践

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简明Jenkins入门教程相关的知识,希望对你有一定的参考价值。

摘要:Jenkins提供了一种简单的方法,可以为几乎任何语言和源代码库的组合,建立持续集成和持续交付环境。


Jenkins提供了一种简单的方法,可以为几乎所有语言和源代码库的组合设置持续集成或持续交付环境的流水线,以及其他自动化常规开发任务。虽然Jenkins并没有消灭为单个步骤创建脚本的需求,但它确实给了你一个更快、更健壮的方法来集成整个构建、测试和部署工具,而不只是简单地构建。


“不要打破夜间构建!”是软件开发的一项基本规则,每天早上为测试人员发布新构建的产品版本。在Jenkins之前,最好的开发人员可以做的是避免打破夜间构建,在提交代码之前,在本地机器上仔细和成功地构建和测试。但这意味着要一个人孤立地测试变化,没有办法做到每个人每天都提交代码,没有公司保证每晚的构建能在每次的代码提交都完成。


Jenkins 源自Hudson,是对这种限制的直接回应吗?


Hudson和Jenkins

2004年,Kohsuke Kawaguchi是Sun的Java开发人员,Kawaguchi厌倦了在他的开发工作中构建被打破,并希望找到一种方法,在将代码提交给存储库之前,确认代码是否可以工作。所以Kawaguchi在Java中建立了一个自动化服务器,让它成为可能,叫做Hudson。Hudson在Sun很受欢迎,并以开源的方式传播到其他公司。


很快到了2011年,甲骨文(收购了Sun),和独立的Hudson开源社区之间的争端,导致了新的分支的出现,Jenkins。虽然Jenkins更加活跃,但这两个分支仍然存在。2014年,Kawaguchi成为了CloudBees的CTO,该公司提供基于jenkin的连续交付产品。


Jenkins自动化

今天,Jenkins是领先的开源自动化服务器,拥有大约1400个插件,以支持各种开发任务的自动化。Kawaguchi最初试图解决的问题是,Java代码的持续集成和持续交付(即构建项目、运行测试、进行静态代码分析和部署)只是人们与Jenkins自动化的众多过程中的一个。这1400个插件跨越五个领域:平台、UI、管理、源代码管理,以及最常见的构建管理。


Jenkins是如何工作的

Jenkins作为一个Java 8 WAR归档和安装包提供给主要操作系统,可以作为Homebrew包,也作为Docker映像和源代码。源代码通常是Java,也有Groovy、Ruby和Antlr。


可以在Tomcat等Java应用服务器中独立运行Jenkins WAR或作为servlet。无论哪种情况,它都会生成一个web用户界面,并接受对其REST API的调用。


当第一次运行Jenkins时,它会创建一个具有长的随机密码的管理用户,可以将其粘贴到它的初始页面来解锁安装。


Jenkins插件

一旦安装完毕,Jenkins允许你使用默认插件或者选择你自己的插件。

简明Jenkins入门教程

一旦你选择了初始的插件集,单击Install按钮,Jenkins将添加它们。

简明Jenkins入门教程

Jenkins主屏幕显示当前构建队列和Executor状态,并提供了创建新项目(作业)、管理用户、查看构建历史、管理Jenkins、查看自定义视图和管理凭证的链接。

简明Jenkins入门教程


一个新的Jenkins项目可以是任何六种类型的job,以及一个用于组织项目的文件夹。

简明Jenkins入门教程

管理Jenkins页面可以做18件事,包括打开命令行界面的选项。然而,在这一点上,我们应该关注pipeline,它是由脚本定义的增强的工作流。

简明Jenkins入门教程

Jenkins pipelines

一旦配置了Jenkins,就该创建你的构建项目了。虽然可以使用web UI来创建脚本,但最佳实践是创建一个名为Jenkinsfile的pipeline脚本,并在进入存储库中时检查。下面的屏幕截图显示了一个多分支pipeline的配置web表单。


简明Jenkins入门教程

正如你所看到的,在我的基本Jenkins安装中,这种pipeline的分支源可以是Git或Subversion存储库,包括GitHub。如果需要其他类型的存储库或不同的在线存储库服务,只需添加适当的插件并重新启动Jenkins就可以了。我尝试过,但还没有找到没有Jenkins插件的源代码管理系统(SCM)。


Jenkins pipeline可以是声明式的,也可以是脚本化的。一个声明性的pipeline,两个中比较简单的pipeline,使用与groovy兼容的syntax(如果想要的话,可以使用#来启动文件,#!groovy将代码编辑器指向正确的方向。声明式从pipeline块开始,定义agent,并定义包括可执行steps的 stages,如下面的三个阶段示例。


pipeline {

    agent any


    stages {

        stage(‘Build’) {

            steps {

                echo ‘Building..’

            }

        }

        stage(‘Test’) {

            steps {

                echo ‘Testing..’

            }

        }

        stage(‘Deploy’) {

            steps {

                echo ‘Deploying....’

            }

        }

    }

}


pipeline是调用Jenkins pipeline插件的强制外部块。agent定义了想要运行管道的位置。any说要使用任何可用的代理来运行pipeline或阶段。一个更具体的代理可能声明一个容器使用,例如:

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

            }

        }

    }

}


在这里,我们从shell中调用make,然后将任何生成的JAR文件归档到Jenkins归档文件。


post部分定义将在管道运行或阶段结束时运行的操作。您可以在post部分中使用许多后置条件块: always, changed, failure, success, unstable, 和 aborted。


例如,下面的Jenkinsfile总是在测试阶段后运行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是完全等价的。


Declarative pipeline


pipeline {

    agent { docker ‘node:6.3’ }

    stages {

        stage(‘build’) {

            steps {

                sh ‘npm —version’

            }

        }

    }

Scripted pipeline


node(‘docker’) {

    checkout scm

    stage(‘Build’) {

        docker.image(‘node:6.3’).inside {

            sh ‘npm —version’

        }

    }

}


Blue Ocean, Jenkins的GUI

如果你喜欢最新的伟大的 Jenkins UI,你可以使用Blue Ocea插件

,它提供了极佳的可视化用户体验,你可以通过插件添加,也可以使用 Blue Ocean Docker 镜像,Blue Ocean安装好如下图:

简明Jenkins入门教程

你可以直接打开Blue Ocean,在Jenkins服务器的/blue文件夹下, Blue Ocean的Pipeline创建是图形化的:

简明Jenkins入门教程

Jenkins Docker

正如我前面提到的,Jenkins也作为Docker映像分发。这个过程没有太多东西:一旦你选择了SCM类型,就提供了一个URL和凭证,然后从单个存储库创建一个Pipeline,或者扫描组织中的所有存储库。每个带有Jenkinsfile的分支都会得到一条Pipeline。


在这里,我运行了一个Blue Ocean的Docker映像,它比默认的SCM提供者列表提供了更多的Git服务插件:

简明Jenkins入门教程

一旦运行了一些Pipeline,Blue Ocean插件将显示它们的状态,如上所示。可以放大单个Pipeline来查看各个阶段和步骤:

简明Jenkins入门教程

你还可以放大分支(top)和活动:

简明Jenkins入门教程

为什么使用Jenkins?

我们使用的Pipeline插件支持一个通用的持续集成/持续交付(CICD)用例,这可能是Jenkins最常用的用法。对于其他一些用例也有专门的考虑。


Java项目是Jenkins最初的理由,我们已经看到Jenkins支持Maven的构建,它还支持Ant、Gradle、JUnit、Nexus和Artifactory。


android运行的是java,但引入了如何测试Android设备的广泛应用的问题。Android模拟器插件允许在你关心定义的许多仿真设备上构建和测试。谷歌Play发布者插件允许在谷歌中发送构建到一个alpha通道,用于在实际设备上进行发布或进一步测试。


我已经展示了一些例子,我们指定了Docker容器作为Pipeline的代理,在Docker容器中运行Jenkins和Blue Ocean。Docker容器在Jenkins环境中非常有用,以提高速度、可伸缩性和一致性。


Jenkins和GitHub有两个主要的用例,一个是构建集成,它可以包含一个服务挂钩,在每个提交到您的GitHub存储库时触发Jenkins。第二个是使用GitHub身份验证通过OAuth控制对Jenkins的访问。


除了Java,Jenkins还支持许多其他语言。对于C/c++,有一些插件可以从控制台捕获错误和警告,用CMake生成构建脚本,运行单元测试,执行静态代码分析,Jenkins与php工具有许多集成。


虽然Python代码不需要构建(除非您使用的是Cython,或者创建一个用于安装的Python),但是Jenkins集成了Python测试和报告工具,比如Nose2和Pytest,以及代码质量工具,如Pylint,这是很有用的。类似地,Jenkins集成了诸如Rake、Cucumber、Brakeman和CI::Reporter这样的Ruby工具。


Jenkins vs Bamboo

人们经常问他们,Jenkins或Atlassian Bamboo 是否适合他们的CICD服务器。作为一名顾问,我的回答是“视情况而定”。


首先,Jenkins是自由开源的,而Bamboo则是商业软件。Jenkins有一个更大的社区和更多的插件。另一方面,Bamboo与其他的Atlassian产品,如Bitbucket,Jira,Confluence,很好地融合在一起。


过去,Bamboo可以作为云服务,也可以用于现场部署。到2017年1月,Bamboo Cloud不再可用;相反,Atlassian希望你使用Bitbucket管道。


在这一点上,尽管Bamboo服务器仍然可用,可以托管在基于云的容器或VM中,但我建议人们避免使用它,因为它正在变成一个孤儿产品。如果在Bitbucket上托管你的存储库,并且考虑到Jenkins,我建议您考虑为CICD的Bitbucket管道。


原文链接:https://www.infoworld.com/article/3239666/devops/what-is-jenkins-the-ci-server-explained.html


↓↓↓ 点击"阅读原文" 【加入云技术社区】  

相关阅读:



以上是关于简明Jenkins入门教程的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins简明入门 -- 利用Jenkins完成Python程序的buildtestdeployment

Duilib简明教程

Python简明教程

gvim简明教程

Spring Boot简明教程--Spring Boot版本号介绍

OAuth 白话简明教程-授权码模式(Authorization Code)