学习

如何通过 Jenkins 流水线部署 Redis Enterprise 数据库

Jenkins 是目前 最流行的 CI(持续集成)工具,拥有约 1500 万用户。它是一个开源自动化服务器,使开发者能够可靠地构建、测试和部署他们的软件。它于 2011 年因与 Oracle 的争议 而从 Hudson 项目中分叉出来,用于 持续集成和持续交付 (CI/CD) 以及测试自动化。Jenkins 基于 Java,提供超过 1700 个插件 来自动化您的开发者工作流程,并节省大量执行重复任务的时间。

来源: Datanyze 市场分析

Jenkins 流水线 执行在与代码一起存储的 Jenkinsfile 中声明的持续交付任务。 流水线插件 在其源码树中包含了一个相当全面的 教程。插件是增强 Jenkins 环境功能以满足组织或用户特定需求的主要手段。使用流水线,您可以配置 Jenkins 自动部署关键基础设施,例如 Redis 数据库。

架构

Jenkins 流水线是 Jenkins 的持续交付 (CD) 端。它们使用 Jenkinsfile 声明式脚本来定义流水线的行为。您可以在 Groovy 中编写脚本并从中运行 shell 脚本,因此几乎可以使其执行任何操作。

 Jenkinsfile 指示 Jenkins 从凭据存储中导出一些环境变量以连接到 Redis 服务器,然后以部署配置文件作为参数执行 Python 流水线脚本。例如,一个 deployment-configuration-file.json 文件如下所示:

{
  "database": {
    "name": "made-with-jenkins",
    "port": 12345,
    "size": "S",
    "operation": "CREATE"
  }
}
Python 脚本使用预定义的 JSON 模板文件,这些文件创建固定尺寸(S、M、L、XL)的 Redis 数据库。部署配置文件告诉 Python 脚本所需的数据库名称、端口和大小。示例模板文件如下所示:
{
    "name": "{NAME}",
    "type": "redis",
    "memory_size": 343597383
}
下图是 Jenkins 流水线如何将数据库添加到 Redis 集群的架构图。

流程

  1. Jenkins 流水线克隆一个远程 git 仓库,该仓库包含应用代码和流水线代码。
  2. Redis 主机、端口、用户和密码从凭据存储中解密,并作为环境变量导出。
  3. Jenkins 运行 Python 流水线脚本,指定 git 仓库中的部署配置文件。
  4. Python 脚本使用部署配置文件选择并定制预填充的模板,用作向 Redis 发起 REST 创建数据库请求的主体。

流水线代码文件列表

配置 Jenkins

安装 Jenkins

您可以使用 Docker Desktop 快速启动并运行 Jenkins 实例,暴露端口 8080(Web GUI)和 50000(入站代理)。

docker run --name jenk -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts-jdk11

安装将在 docker-cli 输出中生成一个首次运行密码。

然后打开 Jenkins URL http://localhost:8080/ 并输入密码以解锁您的实例并开始安装。

选择“安装推荐插件”以执行 Jenkins 配置。

等待插件完成安装过程。

接下来,系统会提示您创建管理员用户。
恭喜!Jenkins 已准备就绪!

安装 Python 和自定义库

如果您使用现有的 Jenkins 服务器实例,您可以从该机器的命令行界面安装 Python 和自定义库。

可以使用以下命令通过 shell 访问 Jenkins 的 Docker 实例

docker exec -it -u root jenk bash

Python 流水线脚本需要库 click 和 requests。它还需要 Python。

apt-get update
apt-get install -y python3-pip

pip install --upgrade pip
pip install click
pip install requests
或者,如果您是从头开始创建新的 Jenkins 实例,则可以将这些依赖项包含在单独的 Dockerfile 中,该 Dockerfile 基于 Jenkins 基础镜像构建:
FROM jenkins:latest
USER root
RUN apt-get update
RUN apt-get install -y python-pip

# Install app dependencies
RUN pip install --upgrade pip
RUN pip3 install click
RUN pip3 install requests

将凭据添加到 Secret Store

使用左侧菜单,选择 管理 Jenkins,然后选择 管理凭据,然后单击链接 (全局)

在此处,您可以指定种类 (Kind): 密文 (Secret text),用于连接 Redis REST 端点所需的 4 个秘密信息

  • REDIS_SERVER_FQDN
    • 设置为目标 Redis 实例的 'https://服务器地址'。
  • REDIS_SERVER_PORT
    • 设置为 Redis REST API 端口(默认 9443)。
  • REDIS_USER
    • 设置为允许创建数据库的 Redis 管理员用户。
  • REDIS_PASS
    • 设置为 Redis 管理员用户的密码。

如果您使用私有代码仓库,您可能还希望在此处包含一个个人访问令牌。

创建 Jenkins 流水线

在仪表盘中,点击 新建项目

输入流水线名称,然后选择 流水线 类型。

连接 GitHub 仓库

在出现的流水线配置页面中,勾选 GitHub 复选框并输入 git 克隆 URL,包括读取仓库所需的任何凭据。对于 GitHub 访问,密码应为个人访问令牌,而不是实际用户密码。

Redis 流水线 Jenkinsfile

向下滚动此页面到 高级项目选项,您可以直接粘贴 Jenkinsfile,或者如果文件存在于 git 仓库中,则可以指定文件名。

以下是一个示例 Jenkinsfile,其中包含凭据到环境变量的映射,以及 2 个独立阶段——一个始终成功的 Hello World 阶段,以及一个调用 Python 脚本的构建阶段。将其粘贴到流水线脚本部分。
pipeline {
    agent any

    environment {
        REDIS_SERVER_FQDN = credentials('REDIS_SERVER_FQDN')
        REDIS_SERVER_PORT = credentials('REDIS_SERVER_PORT')
        REDIS_USER =  credentials('REDIS_USER')
        REDIS_PASS = credentials('REDIS_PASS')
    }

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }

        stage('build') {
            steps {
                git branch: 'main', url: 'https://github.com/masyukun/redis-jenkins-pipeline.git'
                sh 'python3 jenkins-re-pipeline.py --deployfile deployment-configuration-file.json'
            }
        }
    }
}

作业配置完成后,点击“保存”。

运行 Jenkins 流水线

点击您创建的流水线

点击左侧菜单上的“立即构建”图标。

点击左侧菜单上的 状态 图标,查看流水线每个阶段的所有输出结果。

将鼠标悬停在 构建 阶段上,然后点击最近一次构建的 日志 按钮,查看 Python 脚本的输出。

示例输出:您应该在“Shell 脚本”折叠面板中看到 Redis REST 服务的详细响应。

还有一个“Git”输出日志,以防您需要在此级别调试问题。无论何时您更新远程 git 仓库中的分支,都应该在该日志中看到最新更改已成功检出到本地 Jenkins git 仓库的证据。

在 https://服务器名称:8443 打开您的 Redis Enterprise 安全管理 UI,然后点击 数据库 菜单项,以验证您的数据库是否已使用 deployment-configuration-file.json 文件中指定的名称、端口和大小创建。

恭喜!您已成功使用 Jenkins 流水线部署了 Redis Enterprise 数据库!

当前的 GitHub 仓库地址为: https://github.com/masyukun/redis-jenkins-pipeline