(一)Jenkins 与 CI/CD | 容器化启动 Jenkins with docker in docker

278 阅读8分钟

系列文章:

(一)Jenkins 与 CI/CD | 容器化启动 Jenkins with docker in docker

(二)Jenkins 与 CI/CD | 基于 VitePress 快速搭建静态网站

(三)Jenkins 与 CI/CD | 在 GitHub 中发布静态网站

更新

  • 2025-01-23:挂载 Docker Compose 等插件

前言

Jenkins 取代了软件开发流程中许多手动重复性的工作,通过自动化的方式提高了效率和可靠性,是实现持续集成、持续交付的有力工具。现有的 Jenkins 入门学习教程存在多个缺点:一是使用可执行文件 jar 包部署,无法满足容器化部署需求;二是在 Jenkins 服务内部需要安装 node、maven 等与项目相关的环境,灵活性差,非容器化项目实践;三是采用 Jenkins 默认 UI 需要大量繁殖配置。本文旨在解决这三个问题:

  1. 使用 Docker 容器化部署 Jenkins 实例。
  2. 构建 Jenkins with docker in docker,在 Jenkins 服务内部支持 docker 服务,大大方便各类项目构建和部署。
  3. 采用 Blue Ocean UI 简化复杂的配置。

本文将介绍 Jenkins 基本知识,并通过 Docker 部署 Jenkins 实例来帮助用户快速入门。

项目地址:

Jenkins 简介

Jenkins 是一个开源的自动化服务器,主要用于持续集成和持续交付(CI/CD)。它可以帮助自动化各种与软件开发相关的任务,包括构建、测试和部署软件。Jenkins 通过提供一个可扩展的自动化平台,支持插件机制,允许用户根据需求安装各种插件来扩展其功能。

Jenkins 的作用是连接或自动化软件开发到部署中的多个阶段 stage,最终实现持续集成、持续交付。

下图引自 www.redhat.com/zh/topics/d…

ci-cd-flow-desktop.png.png

Jenkins with docker in docker

Jenkins 由 Java 编程语言开发,以可执行程序 jar 包运行,其在 CI/CD 工作流中替代人工编译、打包、分发、测试、执行等工作。例如构建 SpringBoot 项目,需要有 maven 或 gradle 环境依赖;构建前端 Vue 项目需要 nodejs 环境依赖。在如今云原生时代,Jenkins 能否利用 Docker 进行容器构建和运行呢?答案是可以的。

容器 Container 是独立的服务运行时,与其他容器以及宿主机互相隔绝。直觉地,可以想到两种在 Jenkins 容器内运行 Docker 的方法:一种是在 Jenkins 容器中安装 Docker,这种内嵌关系比较奇怪,会使得 Jenkins 容器变得非常臃肿,并且创建和运行的容器在 Jenkins 内部,而不是在宿主机上运行;另一种有效的方式是 Jenkins 容器共享宿主机的 Docker 环境。本文描述的方式为第二种:共享

jenkins-docker.png

呈现的效果是,在 Jenkins 容器内部可以像宿主机一样畅快地运行 docker,运行空间共享,完全是互通的,在宿主机上和 Jenkins 容器内执行 docker ps 总是显示相同的结果。Jenkins 容器可以很方便实现容器打包和容器部署。简单来说,Jenkins 容器与宿主机共享 Docker 空间。

Blue Ocean UI

Blue Ocean 是 Jenkins 的一种 UI 模式,支持以插件的方式安装。相比于默认 UI,Blue Ocean 更美观、流程更清晰、配置更容易。因此推荐使用 BlueOcean UI 来创建 CI/CD 流水线。

以下部分引自 Jenkins 中文官网

Blue Ocean 重新思考 Jenkins 的用户体验,从头开始设计Jenkins Pipeline, 但仍然与自由式作业兼容,Blue Ocean 减少了混乱而且进一步明确了团队中每个成员 Blue Ocean 的主要特性包括:

  • 持续交付(CD)Pipeline 的 复杂可视化 ,可以让您快速直观地理解管道状态。
  • Pipeline 编辑器 - 引导用户通过直观的、可视化的过程来创建 Pipeline,从而使Pipeline的创建变得平易近人。
  • 个性化 以适应团队中每个成员不同角色的需求。
  • 在需要干预和/或出现问题时 精确定位 。 Blue Ocean 展示 Pipeline 中需要关注的地方, 简化异常处理,提高生产力
  • 本地集成分支和合并请求, 在与 GitHub 和 Bitbucket 中的其他人协作编码时实现最大程度的开发人员生产力。

Jenkisn 流水线语法

跟随互联网上的大多数 Jenkins 相关教程所描述的,你可以使用 shell 指令编排流水线,但是我更推荐 Jenkins 流水线语法,核心优点是可以像 Dockerfile 一样在项目根目录下创建,方便查看、编辑与迁移。

官方描述:流水线的单一可信数据源,能够被项目的多个成员查看和编辑。

在 Blue Ocean UI 中默认使用 Jenkinsfile 来编排,在创建流水线时,会默认扫描项目根目录下的Jenkinsfile 来作为流水线脚本。

传统使用 shell 脚本命令构建流水线属于脚本式

著名开源容器编排工具 Kubernetes 采用的是声明式

流水线支持 两种语法:声明式(在 Pipeline 2.5 引入)和脚本式流水线。一个基本的三阶段声明式流水线 Jenkinsfile 模板如下,笔者更推荐使用声明式流水线语法。

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

Jenkinsfile 是项目相关的,项目往往只需要在第一次构建流水线的时候创建和配置,此后除非项目架构重大变更,否则不需要修改。当项目在成员间共享时,Jenkinsfile 随项目分发。

因此,对于 Jenkinsfile 语法,我认为无需专门学习,只需要在创建时查资料完成编写即可。

前置要求

如果是 Windows 平台,建议在 WSL2 的 Ubuntu 上进行

推荐使用 Linux/MacOS 操作系统:

  • Git
  • Docker & Docker Compose
  • 科学上网:能够轻松访问 GitHub

开始 Jenkins

Jenkins 工作流

本图引用自:k-adithya21.medium.com/build-a-doc…

image.png

启动

克隆项目

# Github
git clone https://github.com/xiaolinstar/docker-jenkins.git
# Gitee
git clone https://gitee.com/xingxiaolin/docker-jerkins.git

项目中的 docker-compose.yaml 配置文件:

networks:
  jenkins-network:
    external: false

services:
  docker-jenkins:
    image: jenkins/jenkins:lts-jdk21
    user: root
    container_name: xiaolin-jenkins
    restart: always
    ports:
      - '8080:8080'
      - '50000:50000'
    networks:
      - jenkins-network
    privileged: true
    volumes:
      - '/usr/bin/docker:/usr/bin/docker'
      - '/var/run/docker.sock:/var/run/docker.sock'
      - './jenkins_home:/var/jenkins_home'
      - '/usr/libexec/docker/cli-plugins/:/usr/libexec/docker/cli-plugins' # docker 插件挂载
    # 设置上海时区
    environment:
      TZ: Asia/Shanghai

校验文件挂载,下面信息是 Ubuntu 操作系统下的文件映射

volumes:
  - '/usr/bin/docker:/usr/bin/docker'
  - '/var/run/docker.sock:/var/run/docker.sock'
  - './jenkins_home:/var/jenkins_home'
  - '/usr/libexec/docker/cli-plugins/:/usr/libexec/docker/cli-plugins' # docker 插件挂载

在项目根目录下使用 docker compose 启动项目

docker compose up -d

Docker in docker 验证

启动 Jenkins 容器后,首先验证在该容器内是否有 docker 环境,在宿主机上运行:

docker exec -it xiaolin-jenkins /bin/sh
# 检查 Jenkins 容器内 docker 环境
docker info

正常情况下可以查看到 Docker 容器信息。否则,可以自行调整目录挂载,或联系作者调试。

Jenkins 配置

在本地浏览器中进入 Jenkins Web UI http://localhost:8080/

解锁Jenkins.png

需要输入密钥,可以在容器日志中查看:

# docker logs [CONTAINER_NAME]
docker logs xiaolin-jenkins

jenkins-secret.png

安装社区推荐的插件:

Jenkins推荐插件.png

创建用户,并依次完成设置

创建用户.png

进入到 Jenkins Home 页面

jenkins-home.png

在安装插件过程中,Jenkins 容器可能会异常退出,需要自行重启

必备插件:

  • 社区推荐插件(在启动页面已安装)
  • Blue Ocean

插件管理.png

plugins.png

安装完成后,Home 页面左侧显示出 Blue Ocean

jenkins-blue-ocean.png


在 Blue Ocean UI 上创建流水线

快速创建流水线.png

上述第二步骤,需要提供 GitHub Token,需要在 GitHub 仓库创建。

传送门:创建GitHub Token

创建token跳转.png

跳转页面中默认设置也是 OK 的

Token 命名为 GENERAL_TOKEN,过期时间设置为 90 天,其他设置如下

后期可以根据使用情况需要更新

token-scopes.png

生成 Token 一定要妥善保管,因为只能查看这一次。

Token可以保存在 iPhone/Mac 的备忘录、邮箱的记事本等

其实忘记了也没多大关系,删除了再创建一个

拿到生成的 Token 回到 Jenkins 页面,即可访问 GitHub 仓库,如本小节第一张图。

总结

本文介绍了使用 Docker 的方式容器化启动 Jenkins 实例,该容器共享宿主机的 Docker 环境,这为自动化构建镜像、启动容器大大提供了方便。另外,介绍了 Jenkins 服务的基本配置,并安装 BlueOcean 插件,简化配置。

本文只对 Jenkins 做了基本介绍和启动配置,下一篇文章将使用 Jenkins 构建流水线,创建基于 VitePress 的个人网站。

关注微信公众号,获取运维资讯

如果此篇文章对你有所帮助,感谢你的点赞收藏,也欢迎在评论区友好交流。

微信搜索关注公众号:持续运维

参考

  1. Jenkins 官方网站 www.jenkins.io/
  2. Jenkins 中文官方网站 www.jenkins.io/zh
  3. Jenkins 流水线语法 www.jenkins.io/zh/doc/book…
  4. GitHub Authentication docs.github.com/zh/authenti…
  5. 创建 GitHub Token github.com/settings/to…
  6. Build a Docker Jenkins Pipeline to Implement CI/CD Workflow k-adithya21.medium.com/build-a-doc…
  7. Docker + Jenkins + Nginx + 阿里云服务器实现前端自动化部署 juejin.cn/post/737441…