Jenkins

本文最后更新于:2023年12月5日 晚上

官方网站: https://jenkins.io/zh/

Jenkins 是开源 CI&CD 软件领导者, 提供超过 1000 个插件来支持构建、部署、自动化, 满足任何项目的需要。

部署 jenkins

Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序

安装 JDK

Jenkins 基于 JAVA 实现,安装 Jenkins 前需要先安装 JDK

[root@jenkins ~]$java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

安装 jenkins

$wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.263.4_all.deb # 清华源下载dep包
[root@jenkins src]$apt install daemon # 依赖的包,如果没有,会报错,所以提前装上
[root@jenkins src]$ln -s /usr/local/jdk/bin/java /usr/bin/java # Jenkins只会在/bin:/usr/bin:/sbin:/usr/sbin找java,所以设置$PATH不好使,得做个软连接

[root@jenkins src]$dpkg -i jenkins_2.263.4_all.deb # 安装

主要文件:

/etc/default/jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/usr/share/jenkins/jenkins.war # 实际上就是启动这个war包
/var/cache/jenkins/
/var/lib/jenkins/
/var/log/jenkins/

修改 jenkins 服务的用户

默认 jenkins 服务使用 jenkins 帐号启动,将文件复制到生产服务器可能会遇到权限问题,需要先 su 到对应的用户,这里学习环境为了方便,修改为 root 用户,注意:工作中还是使用 jenkins 普通用户

[root@jenkins src]$vim /etc/default/jenkins
#JENKINS_USER=$NAME
#JENKINS_GROUP=$GROUP
JENKINS_USER=root  # 直接修改为root,不要修改$NAME变量
JENKINS_GROUP=root

访问 jenkins 页面

创建管理员用户

先创建用户,然后使用刚创建的用户登录

安装插件

Jenkins 是完全插件化的服务,我们想实现什么功能,不是改配置文件,而是下载插件

修改更新源为国内清华源:

[root@jenkins src]$cat /var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>
[root@jenkins src]$systemctl restart jenkins.service

有以下几种安装插件的方式:

  • 在线安装:官网,也是默认的方式,比较慢

  • 在线安装:清华大学镜像源,sed 或者编辑器把 update-center.json 中的 Jenkins 网址替换为清华源

    # 将:
    https://updates.jenkins.io/download/plugins/warnings/5.0.1/warnings.hpi
    # 替换为:
    https://mirrors-i.tuna.tsinghua.edu.cn/jenkins/plugins/warnings/5.0.1/warnings.hpi
  • 离线安装:手动下载插件,然后放到 /var/lib/jenkins/plugins/,重启 Jenkins 即可

  • 通过 web 界面安装

搜索需要 gitlab(和 gitlab 相连)和 Blue Ocean(显示信息更加好看)的相关插件并安装

配置 jenkins 权限管理

默认 jenkins 用户可以执行所有操作,为了更好的分层控制,可以实现基于角色的权限管理,先创建角色和用户,给角色授权,然后把用户管理到角色

安装插件

安装插件:Role-based Authorization Strategy

如果直接下载失败,可以直接清华源下载,将插件放在 /var/lib/jenkins/plugins 目录下

创建新用户

新建 xiaoming 和 xiaogang 两个用户:

更改认证方式

新建任务

通常选择“构建一个自由风格的软件项目”,新建四个任务:test1-job1、test1-job2、test2-job1、test2-job2

创建角色并对角色分配权限

  1. 创建全局角色
    创建全局读角色,只有读权限

  2. 创建 item 角色
    创建两个 item 角色,test1-role、test2-role,通过正则匹配分配任务

将用户关联到角色

测试普通用户登录

xiaogang 用户只能看到 test1.* 匹配的项目:test1-job1、test1-job2

xiaoming 用户只能看到 test2.*匹配的项目:test2-job1、test2-job2

jenkins 邮箱配置

邮件发送到组邮件地址,组邮件会转发到组内所有人

配置 jenkins 到 gitlab 非交互式拉取代码

需要配置 ssh key (公钥)和 凭据(私钥)

配置 ssh key

实现 jenkins 服务器到 gitlab 服务器的基于密钥的验证,可以让 jenkins 连接到 gitlab 执行操作

  1. 在 jenkins 服务上生成 ssh key
  2. 在 gitlab 服务器上添加上面生成的 ssh key
  3. 在 jenkins 服务器上测试 ssh key

配置凭据

凭据就是私钥,clone 项目的时候,可选择不同的凭据(私钥),只要他在 gitlab 上配置了 key(公钥),如果不指定,就以当前用户的私钥作为凭据去 clone 项目

管理凭据:系统管理 -> 安全 -> Manage Credentials

构建触发器

构建触发器(webhook),有的人称为钩子,实际上是一个 HTTP 回调,其用于在开发人员向 gitlab 提交代码后能够触发 jenkins 自动执行代码构建操作

以下为新建一个开发分支,只有在开发人员向开发(develop)分支提交代码的时候才会触发代码构建,而向主分支提交的代码不会自动构建,需要运维人员手动部署代码到生产环境

生产中千万不要用,测试一般也不用,都是由开发登陆自己的账号,只能看到自己的 job,然后开发自己手动部署

项目关联

用于多个 job 相互关联,需要串行执行多个 job 的场景,不过这个操作基本不用

例如:克隆代码、编译代码、停止 tomcat、部署代码、启动 tomcat 这些操作使用不同的 job 执行,这些 job 需要串行执行

视图

job 太多需要分类

视图可用于归档 job 进行分组显示,比如将一个业务的 job 放在一个视图显示,最常用的是列表视图

jenkins 分布式

在众多 Job 的场景下,单台 jenkins master 同时执行代码 clone、编译、打包及构建,其性能可能会出现瓶颈从而会影响代码部署效率,影响 jenkins 官方提供了 jenkins 分布式构建,将众多 job 分散运行到不同的 jenkins slave 节点,大幅提高并行 job 的处理能力

配置 slave 节点环境

slave 节点需要配置与 master 一样的基础运行环境,另外也要创建与 master 相同的数据目录,因为脚本中调用的路径只有相对于 master 的一个路径,此路径在 master 与各 node 节点必须保持一致

# 配置java环境
[root@jenkins-slave1 ~]$java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

[root@jenkins-slave1 ~]$ln -s /usr/local/jdk/bin/java /usr/bin/java

# 创建数据目录
[root@jenkins-slave1 ~]$mkdir -p /var/lib/jenkins

添加 slave 节点

可以限制项目只能在指定的节点中执行:

流水线 pipline

流水线 pipline 是 Jenkins 中的头等公民,官方介绍;https://www.jenkins.io/zh/doc/book/pipeline/

本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 流水线向 Jenkins 中添加了一组强大的工具, 支持用例 简单的持续集成到全面的 CD 流水线。通过对一系列的相关任务进行建模, 用户可以利用流水线的很多特性:

  • 代码:流水线是在代码中实现的,通常会检查到源代码控制,使团队有编辑,审查和迭代他们的交付流水线的能力
  • 可持续性:jenkins 的重启或者中断后不影响已经执行的 Pipline Job
  • 支持暂停:pipline 可以选择停止并等待人工输入或批准后再继续执行
  • 可扩展:通过 groovy 的编程更容易的扩展插件
  • 并行执行:通过 groovy 脚本可以实现 step,stage 间的并行执行,和更复杂的相互依赖关系

流水线概念

流水线 pipeline

流水线是用户定义的一个 CD 流水线模型 。流水线的代码定义了整个的构建过程, 他通常包括构建, 测试和交付应用程序的阶段

节点 node

每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是 jenkins agent,node 是执行 step 的具体服务器

阶段 stage

一个 pipline 可以划分为若干个 stage,每个 stage 都是一个操作,比如 clone 代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个 node 执行

步骤 step

step 是 jenkins pipline 最基本的操作单元,从在服务器创建目录到构建容器镜像,由各类 Jenkins 插件提供实现,例如: sh “make”

流水线语法概述

对 Jenkins 流水线的定义被写在一个文本文件中: Jenkinsfile,该文件可以被提交到项目的源代码的控制仓库。 这是”流水线即代码”的基础;将 CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。

Jenkinsfile 能使用两种语法进行编写,声明式和脚本化。

声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性

声明式流水线基础

在声明式流水线语法中, pipeline 块定义了整个流水线中完成的所有的工作。

示例:

Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'make'
            }
        }
        stage('Test'){
            steps {
                sh 'make check'
                junit 'reports/**/*.xml'
            }
        }
        stage('Deploy') {
            steps {
                sh 'make publish'
            }
        }
    }
}
  • pipeline 是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 “block” 。
  • agent 是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。
  • stage 是一个描述 stage of this Pipeline 的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的stage块的信息。如 above 所述, 在脚本化流水线语法中,stage 块是可选的。
  • steps 是声明式流水线的一种特定语法,它描述了在这个 stage 中要运行的步骤。
  • sh 是一个执行给定的 shell 命令的流水线 step (由 Pipeline: Nodes and Processes plugin 提供) 。
  • junit 是另一个聚合测试报告的流水线 step (由 JUnit plugin 提供)。
  • node 是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的agent

脚本化流水线基础

pipline 语法

官方文档:https://www.jenkins.io/zh/doc/book/pipeline/syntax/

pipline job

创建 pipline job

测试简单 pipline job 运行

node {
    stage('clone 代码') {
        echo '代码 clone'
    }
    stage('代码构建') {
        echo '代码构建'
    }
    stage('代码测试') {
        echo '代码测试'
    }
    stage('代码部署') {
        echo '代码部署'
    }
}

立即构建,查看输出信息:

自动生成拉取代码的 pipline 脚本

案例


Jenkins
http://blog.lujinkai.cn/运维/Jenkins与Gitlab/Jenkins/
作者
像方便面一样的男子
发布于
2021年2月27日
更新于
2023年12月5日
许可协议