DevOps— CI/CD 工具 Jenkins

  • 1. 部署
  • 1.1 war包部署
  • 1.2 docker部署
  • 2. 配置
  • 2.1 jenkins解锁
  • 2.2 基本配置


Jenkins 是一个基于Java的跨平台开源 CI/CD 工具,可以用来自动执行与构建、测试和交付或部署软件相关的各种任务,支持实时测试和报告,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

官方文档地址如下:https://www.jenkins.io/doc/ 中文文档地址如下:https://www.jenkins.io/zh/doc/

1. 部署

Jenkins 适用于 Windows、Linux 和 macOS 等多种平台,可以通过多种方式进行部署安装,下面介绍通过 war 包和 docker 两种方式进行部署,所用的操作系统都是 CentOS 7.6,使用的 Jenkins 版本为 2.346.1。日常工作中惯用的服务环境还是 CentOS,这里也不想在本地 Windows 下进行部署,所以就只演示 CentOS 环境下的部署了,其他平台和 Linux 下差别不大。部署安装过程也可以阅读Jenkins 官方安装教程,官方文档非常的齐全。

1.1 war包部署

通过 war 包部署 Jenkins 依赖于 java 环境,需要先安装 JRE。Jenkins 需要 JRE8、11或者17,其中 Jenkins 官方会在2022年9月开始停止对 JRE8 的兼容。

首先下载 war 包可执行文件,下载地址如下:https://www.jenkins.io/download/

之后上传到服务器中的工作目录,通过以下命令运行 Jenkins,默认使用 http 协议,端口是8080:

java -jar jenkins.war

该命令还可以通过一些参数对Jenkins应用进行配置,最常用的是--httpPort参数设置端口,如果需要使用 Https 或者 Http2 协议,也可以通过参数配置,详细请见:启动设置。值得一提的是,通过war包的方式部署 Jenkins 不会默认安装 BlueOcean 插件。

devops Jenkins_云原生


启动之后,稍微等待一会,Jenkins 会在当前用户家目录下创建一个文件夹用于存放相关的数据、文件,完成初始化。

1.2 docker部署

通过 docker 部署 Jenkins,为了能在 Jenkins 节点内执行 docker 命令,官方的做法是在宿主机上 docker 再安装启动一个 docker 容器,然后Jenkins容器配置连接容器中的 docker,通过它的套接字执行 docker 命令,而不是直接连接宿主机 docker 套接字。这样也是避免一些安全风险,如果连接宿主机套接字,则意味着容器具有全权接管宿主机 docker 的权限。

首先创建网络,用于连接新创建的 docker 容器和 Jenkins 容器。

docker network create jenkins

devops Jenkins_devops_02


然后安装启动 docker:dind 镜像,在docker中启动一个 docker 容器。

docker run \
 --name jenkins-docker \
 --rm \
 --detach \
 --privileged \
 --network jenkins \
 --network-alias docker \
 --env DOCKER_TLS_CERTDIR=/certs \
 --volume jenkins-docker-certs:/certs/client \
 --volume jenkins-data:/var/jenkins_home \
 --publish 2376:2376 \
 docker:dind \
 --storage-driver overlay2

devops Jenkins_云原生_03


之后,在宿主机创建一个 Dockerfile,基于 jenkins/jenkins:2.346.1-jdk11 镜像创建一个自己的 Jenkins 镜像,这主要是为了给原有的镜像安装 docker-ce-cli ,还有就是安装 BlueOcean 插件。

FROM jenkins/jenkins:2.346.1-jdk11
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean:1.25.5 docker-workflow:1.28"

devops Jenkins_云原生_04

然后通过基于 Dockerfile 构建镜像,这一步耗时会比较久,因为会下载挺多东西,而且使用的是国外站点。如果构建失败的话可以多试几次。

docker build -t myjenkins-blueocean:2.346.1-1 .

devops Jenkins_云原生_05


devops Jenkins_ci/cd_06


再然后启动镜像,启动镜像的时候通过 DOCKER_HOST 环境变量指定当前容器连接之前启动的 docker 容器的套接字,从而可以调用刚刚运行的 docker 容器进行后续 docker 命令执行,如构建镜像、推送镜像到私有仓库等。

docker run \
  --name jenkins-blueocean \
  --restart=on-failure \
  --detach \
  --network jenkins \
  --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client \
  --env DOCKER_TLS_VERIFY=1 \
  --publish 8080:8080 \
  --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  myjenkins-blueocean:2.346.1-1

devops Jenkins_ci/cd_07


注意 docker 安装和本地安装的区别

– docker 部署的情况下,Jenkins所有操作都是在 docker 容器中执行,虽然通过卷映射将容器内部的文件目录映射到宿主机,但是 Jenkins 所有文件路径都是相对于容器内部的,所以无法在将生成后的文件拷贝到宿主机除映射目录外的其他路径。如果需要通过 Jenkins 将持续集成后的成品部署到宿主机的其他目录,要使用 publish over ssh 插件,将容器和宿主机当成两个机器来传输,不过一般情况下,都是一台机器部署 Jenkins 进行持续集成,构建完成后的结果部署到其他远程机器上。

2. 配置

2.1 jenkins解锁

Jenkins 部署完成之后,通过 http://ip:8080 端口进行管理平台,第一次打开管理平台的时候,需要对 Jenkins 进行解锁。

devops Jenkins_云原生_08


我们可以在页面上提示的文件下获取到初始密码,如果是 docker 安装的话,请到启动时设置 jenkins_home 的映射卷下查看该文件。

devops Jenkins_devops Jenkins_09


解锁完成之后进行 jenkins 的一些基本插件安装,这里直接按照推荐插件即可,后续再根据用到的功能安装其他需要的插件。

devops Jenkins_jenkins_10


devops Jenkins_ci/cd_11


插件安装时长根据网络情况而不同,稍微等待一下,如果由于网络原因某些插件安装失败,重试一下即可。安装完成之后进行初始化用户界面,根据自己的情况填写即可。

devops Jenkins_devops_12


点击保存并完成,进入 jenkins 管理平台。

devops Jenkins_devops_13


devops Jenkins_devops Jenkins_14

2.2 基本配置

对于 Jenkins 各种相关的配置在系统管理这个菜单下:

devops Jenkins_云原生_15


其中最重要的就是插件管理和全局配置管理。我们自动化部署流程各个步骤中用到的插件都在插件管理进行安装,有些插件安装完成之后需要在全局工具配置进行配置,例如对于版本的选择等。Jenkins 插件非常多,插件的安装这里先不细讲,后面会在 Jenkins 自动部署构建示例中稍微讲解一下用到的插件。对于系统管理页面,在某些浏览器下会存在跨域问题,无法正常打开,如下:

devops Jenkins_devops Jenkins_16


这种时候,可以换下浏览器进行访问,或者百度一下如何解决怎么解决相关问题,这里就不细说了。另外,前面我们在推荐的插件中安装了 Git 插件,Git 插件默认是使用服务器安装的 Git 的,如果服务默认安装的 Git 版本较低,或者没有安装 Git,会导致后续对 Git 仓库的访问失败。

devops Jenkins_devops Jenkins_17


所以在启动 Jenkins 之后,检查一下全局工具配置中的 Git 相关配置,如果出现下面这样的提示,就是 Git 插件找不到相关的可执行文件。

devops Jenkins_jenkins_18


这时候,需要在服务器上安装一下 Git,并且配置一下环境变量。或者在安装 Git 之后,直接将上面的可执行文件路径指向服务器上 Git 的安装目录。

devops Jenkins_jenkins_19


至此,Jenkins 应用就安装部署完成了,这样子是最简单的安装部署方式,在个人学习测试环境是足够了,如果在生产环境,官方推荐使用集群的方式对 Jenkins 进行部署。下一篇开始通过一些示例讲解一下如何利用 Jenkins 进行自动化持续集成,持续部署。