一、Jenkins是什么?

        Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。

二、CI/CD是什么?

         CI(Continuous integration,中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。

 

如何看jenkins是什么风格的项目 jenkins是什么工具_intellij idea

CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。

如何看jenkins是什么风格的项目 jenkins是什么工具_如何看jenkins是什么风格的项目_02

三、Jenkins安装与使用

以使用maven构建java程序为例,需要准备:

  • 安装有macOS,Linux或Windows操作系统的机器,并拥有以下配置:
  • 最小256MB内存, 推荐512MB以上。
  • 10GB硬盘空间, 用于安装Jenkins,您的Docker镜像和容器。
  • 安装有以下软件:
  • Docker - 在安装Jenkins页面的安装Docker章节阅读更多信息。
    注意: 如果您使用Linux,本教程假定您没有以root用户的身份运行Docker命令,而是使用单个用户帐户访问本教程中使用的其他工具。
  • Git和GitHub Desktop。

1、下载 jenkinsci/blueocean 镜像并使用以下docker run 命令将其作为Docker中的容器运行 :

$ docker run -u root  --rm  -d  -p 8080:8080  -p 50000:50000  -v jenkins-data:/var/jenkins_home  -v /var/run/docker.sock:/var/run/docker.sock  jenkinsci/blueocean
  • --rm(可选) jenkinsci/blueocean 关闭时自动删除Docker容器(下图为实例)。如果您需要退出Jenkins,这可以保持整洁。
  • -d(可选)jenkinsci/blueocean 在后台运行容器(即“分离”模式)并输出容器ID。如果您不指定此选项, 则在终端窗口中输出正在运行的此容器的Docker日志。
  • -p 8080:8080 映射(例如“发布”)jenkinsci/blueocean 容器的端口8080到主机上的端口8080。第一个数字代表主机上的端口,而最后一个代表容器的端口。因此,如果您为此选项指定 -p 49000:8080 ,您将通过端口49000访问主机上的Jenkins。
  • -p 50000:50000(可选)将 jenkinsci/blueocean 容器的端口50000 映射到主机上的端口50000。如果您在其他机器上设置了一个或多个基于JNLP的Jenkins代理程序,而这些代理程序又与 jenkinsci/blueocean 容器交互(充当“主”Jenkins服务器,或者简称为“Jenkins主”), 则这是必需的。默认情况下,基于JNLP的Jenkins代理通过TCP端口50000与Jenkins主站进行通信。您可以通过“ 配置全局安全性” 页面更改Jenkins主服务器上的端口号。如果您要将您的Jenkins主机的JNLP代理端口的TCP端口 值更改为51000(例如),那么您需要重新运行Jenkins(通过此 docker run …命令)并指定此“发布”选项 -p 52000:51000,其中最后一个值与Jenkins master上的这个更改值相匹配,第一个值是Jenkins主机的主机上的端口号, 通过它,基于JNLP的Jenkins代理与Jenkins主机进行通信 - 例如52000。
  • -v jenkins-data:/var/jenkins_home(可选,但强烈建议)映射在容器中的`/var/jenkins_home` 目录到具有名字 jenkins-data 的volume。如果这个卷不存在,那么这个 docker run 命令会自动为你创建卷。如果您希望每次重新启动Jenkins(通过此 docker run ... 命令)时保持Jenkins状态,则此选项是必需的 。如果你没有指定这个选项,那么在每次重新启动后,Jenkins将有效地重置为新的实例。
    注意: 所述的 jenkins-data 卷也可以 docker volume create命令创建:docker volume create jenkins-data 代替映射 /var/jenkins_home 目录转换为Docker卷,还 可以将此目录映射到计算机本地文件系统上的目录。例如,指定该选项 -v $HOME/jenkins:/var/jenkins_home 会将容器的 /var/jenkins_home 目录映射 到 本地计算机上目录中的 jenkins 子目录, 该$HOME目录通常是 /Users/<your-username>/jenkins 或`/home/<your-username>/jenkins` 。
  • -v /var/run/docker.sock:/var/run/docker.sock(可选 /var/run/docker.sock 表示Docker守护程序通过其监听的基于Unix的套接字。该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。如果运行声明式管道,其语法包含agent部分用 docker。例如, agent { docker { ... } } 此选项是必需的。在Pipeline Syntax 页面上阅读更多关于这个的信息 。
  • jenkinsci/blueocean Docker镜像本身。如果此镜像尚未下载,则此 docker run 命令 将自动为您下载镜像。此外,如果自上次运行此命令后发布了此镜像的任何更新, 则再次运行此命令将自动为您下载这些已发布的镜像更新。注意:这个Docker镜像也可以使用以下 docker pull命令独立下载(或更新) :
$ docker pull jenkinsci/blueocean
  • 如果你有一些使用 Docker 的经验,希望或需要使用 docker exec 命令通过一个终端/命令提示符来访问 Jenkins/Blue Ocean Docker 容器, 你可以添加如--name jenkins-tutorials 选项(与上面的 docker run ), 这将会给Jenkins/Blue Ocean Docker容器一个名字 "jenkins-tutorials"。这意味着你可以通过 docker exec 命令访问Jenkins/Blue Ocean 容器(通过一个单独的终端 /命令提示窗口) ,例如:
$ docker exec -it jenkins-tutorials bash

2、访问 Jenkins/Blue Ocean Docker 容器

当在终端/命令提示窗口出现两组星号时, 复制自动生成的字母数字密码(在两组星号之间)。

如何看jenkins是什么风格的项目 jenkins是什么工具_如何看jenkins是什么风格的项目_03

 

浏览 http://localhost:8080 并等待 Unlock Jenkins 页面出现。

如何看jenkins是什么风格的项目 jenkins是什么工具_Docker_04

 

选择安装推荐的插件

如何看jenkins是什么风格的项目 jenkins是什么工具_如何看jenkins是什么风格的项目_05

等待插件安装完毕

如何看jenkins是什么风格的项目 jenkins是什么工具_Jenkins_06

创建管理员账号

如何看jenkins是什么风格的项目 jenkins是什么工具_jenkens_07

 

创建流水线任务

如何看jenkins是什么风格的项目 jenkins是什么工具_intellij idea_08

选择流水线

如何看jenkins是什么风格的项目 jenkins是什么工具_Jenkins_09

选择 Pipeline script from SCM

选择Git

Repository URL :填写你本地仓库的 目录路径, 这是从你主机上的用户账户home目录映射到Jenkins容器的 /home 目录:

  • MacOS系统 - /home/Documents/GitHub/<your-app-name>
  • Linux系统 - /home/GitHub/<your-app-name>
  • Windows系统 - /home/Documents/GitHub/<your-app-name>

如何看jenkins是什么风格的项目 jenkins是什么工具_intellij idea_10

在你本地的Git仓库的根目录创建并保存一个名为 Jenkinsfile 的文本文件:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine' 
            args '-v /root/.m2:/root/.m2' 
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package' 
            }
        }
    }
}
  • 这里的 image 参数(参考 agent 章节的 docker 参数) 是用来下载 maven:3-apline Docker镜像 (如果你的机器还没下载过它)并将该镜像作为单独的容器运行。这意味着:
  • 你将在Docker中本地运行相互独立的Jenkins和Maven容器。
  • Maven容器成为了Jenkins用来运行你的流水线项目的 agent。这个容器寿命很短——它的寿命只是你的流水线的执行时间。
  • 这里的 args 参数在暂时部署的Maven Docker容器的 /root/.m2 (即Maven仓库)目录 和Docker主机文件系统的对应目录之间创建了一个相互映射。这背后的实现细节超出了本教程的范围,在此不做解释。但是,这样做的主要原因是,在Maven容器的生命周期结束后,构建Java应用程序所需的工件 (Maven在流水线执行时进行下载)能够保留在Maven存储库中。这避免了在后续的流水线执行过程中, Maven反复下载相同的工件。请注意,不同于你为 jenkins-data 创建的Docker数据卷,Docker主机的文件系统在每次重启Docker时都会被清除。这意味着每次Docker重新启动时,都会丢失下载的Maven仓库工件。
  • 定义了一个名为 Build 的 stage,之后会出现在Jenkins UI上。
  • 这里的 sh step 运行Maven命令干净地构建你的Java应用(不运行任何tests)。

保存对 Jenkinsfile 的修改并且将其提交到你本地的Git仓库。

再次回到Jenkins,如果有必要的话重新登录,点击左侧的 Open Blue Ocean 进入Jenkins的Blue Ocean界面。

点击 运行,然后快速点击右下角出现的 OPEN 链接, 观察Jenkins运行你的流水线项目。如果你不能点击 OPEN 链接,点击Blue Ocean主界面的一行来使用这一特性。

等待页面变成绿色,Jenkins成功构建了你的应用

如何看jenkins是什么风格的项目 jenkins是什么工具_如何看jenkins是什么风格的项目_11

 

如何看jenkins是什么风格的项目 jenkins是什么工具_jenkens_12

流水线增加test阶段,修改Jenkinsfile:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test' 
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml' 
                }
            }
        }
    }
}

保存对 Jenkinsfile 的修改并将其提交到你的本地Git仓库。

  • 定义了一个名为 Test 的 stage,之后会出现在Jenkins UI上。
  • 这里的 sh step 执行Maven命令来运行你的Java应用的单元测试。 这个命令还生成一个JUnit XML报告,保存在 target/surefire-reports 目录 。
  • 这里的 junit step 用于归档JUnit XML报告(由上面的 mvn test 命令生成) 并通过Jenkins接口公开结果。在Blue Ocean中,可以在流水线运行的 Tests 页面获取结果。 post 章节的 always 条件包含了这个 junit step,保证了这个step总是在Test 阶段结束后执行,不论该阶段的运行结果如何。

 

如何看jenkins是什么风格的项目 jenkins是什么工具_Docker_13

 

流水线增加deliver阶段,修改Jenkinsfile:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh' 
            }
        }
    }
}

保存对 Jenkinsfile 的修改并将其提交到你的本地Git仓库。

  • 定义了一个名为 Deliver 的stage,之后会出现在Jenkins UI上。
  • 这里的 sh step 执行位于 jenkins/scripts 目录下的shell脚本 deliver.sh, 该目录位于 simple-java-maven-app 仓库根目录下。deliver.sh 文件所做动作包含在其自身文本内容中。一般的原则是,尽量保持你的流水线代码(即 Jenkinsfile)越简洁越好,将更复杂的构建步骤放在多个独立的shell脚本中 (尤其对于那些包含2个以上steps的stage)。这最终会使得维护你的流水线代码变得更容易,特别是当你的流水线变得越来越复杂的时候。