在国产化替代浪潮中,龙芯平台因其自主可控的特性,正成为越来越多企业级应用部署的新选择。然而,当我们将目光投向CI/CD(持续集成/持续部署)这一现代软件工程的核心环节时,如何在龙芯架构上高效、稳定地搭建自动化构建与部署流水线,成为了许多开发者和运维工程师面临的实际挑战。Jenkins作为业界广泛使用的开源自动化服务器,结合Docker容器化技术,无疑是解决这一问题的理想方案。本文将手把手带你完成在龙芯3B6000服务器上,通过Docker部署Jenkins的全过程,涵盖从环境准备、镜像适配、容器部署到基础配置和常见问题排查,为你提供一份可直接复用的实战指南。

1. 背景与核心概念

在深入实操之前,我们有必要厘清几个核心概念,理解为什么要在龙芯平台上采用“Docker + Jenkins”的组合。

龙芯3B6000 :这是龙芯中科推出的新一代桌面/服务器级处理器,采用自主指令系统LoongArch。对于开发者而言,最需要关注的是其架构与常见的x86_64或ARM架构不同。这意味着许多为x86编译的软件(包括部分Docker镜像)无法直接运行,需要寻找或构建适配LoongArch架构的版本。

Docker :一个开源的应用容器引擎,允许开发者将应用及其依赖打包到一个可移植的容器中。在龙芯平台上,Docker的价值尤为突出:

  1. 环境一致性 :确保Jenkins及其插件、构建工具在开发、测试、生产环境(均为龙芯)中行为一致。
  2. 资源隔离与高效 :容器化部署避免了直接在宿主机安装多种Java版本、构建工具带来的环境冲突,且启动迅速。
  3. 简化部署 :通过镜像管理,可以快速复制、迁移整个Jenkins服务。

Jenkins :一个用Java编写的开源自动化服务器,用于自动化各种任务,包括构建、测试和部署软件。它是CI/CD流水线的“大脑”,通过丰富的插件生态系统,可以集成几乎任何开发、测试、部署工具。

为什么是Docker部署Jenkins? 对于龙芯平台,直接通过系统包管理器(如apt、yum)安装Jenkins可能会遇到依赖库不兼容、版本陈旧等问题。而Docker提供了一种相对“干净”的沙箱环境。只要找到了或自己构建了支持LoongArch架构的Jenkins Docker镜像,就能以最小的环境侵入性,快速获得一个可用的Jenkins服务。此外,容器化也便于后续的版本升级、数据备份和恢复。

2. 环境准备与版本说明

在开始部署前,请确保你拥有一台安装了LoongArch架构操作系统的龙芯3B6000服务器,并具备root或sudo权限。

基础环境要求:

  • 操作系统 :统信UOS、麒麟软件等基于LoongArch的Linux发行版。本文以统信UOS 20为例。
  • 内核版本 :建议使用较新的内核(如4.19+),以更好地支持Docker特性。
  • 网络 :服务器需要能访问互联网,以下载Docker安装包、Jenkins镜像及插件。

软件版本说明: 本文演示所用版本为当前较稳定的组合,不同版本间可能存在细微差异,请根据实际情况调整。

组件 版本 说明
Docker Engine 20.10.x 或更高 社区版(CE)即可。需确认支持LoongArch。
Docker Compose v2.x 推荐使用,用于编排服务(可选但建议)。
Jenkins Docker Image jenkins/jenkins:lts-jdk17 或 LoongArch专用镜像 官方镜像可能不直接支持LoongArch,需寻找替代。
Java (容器内) JDK 11 或 17 Jenkins LTS版本通常与特定JDK LTS版本绑定。

重要提示 :由于LoongArch生态仍在快速发展中,直接使用 docker pull jenkins/jenkins 获取的官方镜像(基于x86_64) 无法运行 。我们的首要任务是解决镜像适配问题。

3. 龙芯平台Docker安装与配置

如果你的系统尚未安装Docker,请按照以下步骤进行。

3.1 安装Docker Engine

龙芯平台的软件源通常已提供适配的Docker包。以统信UOS为例,安装过程与Debian/Ubuntu类似。

  1. 更新系统包索引

    sudo apt update
    
  2. 安装必要的依赖包

    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
    
  3. 添加Docker官方GPG密钥 (注意,这里使用的是通用密钥,适用于多架构):

    curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    如果网络问题导致下载失败,可以尝试从国内镜像源获取,或检查系统源中是否已包含Docker包。

  4. 设置稳定版仓库 。由于LoongArch可能不在官方直接支持的架构列表中,我们需要根据系统版本手动配置源。查看系统代号:

    lsb_release -cs
    

    假设输出是 uos 。编辑或创建源列表文件:

    echo "deb [arch=loongarch64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian uos stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    关键点 :将架构 [arch=amd64] 替换为 [arch=loongarch64] ,但请注意,Docker官方仓库可能未提供loongarch64的二进制包。 更常见的做法是使用系统发行版自带的Docker包

  5. 实际安装(推荐使用系统源) : 鉴于官方源可能不支持,最可靠的方式是直接从UOS或麒麟的软件源安装:

    sudo apt update
    # 搜索可用的docker包
    sudo apt search docker-ce
    # 通常包名可能是 `docker.io` 或 `docker-ce`
    sudo apt install -y docker.io
    

    或者,如果系统提供了 docker-ce

    sudo apt install -y docker-ce docker-ce-cli containerd.io
    
  6. 验证安装

    sudo docker --version
    

    输出类似 Docker version 20.10.12, build e91ed57 即表示安装成功。

  7. 启动Docker并设置开机自启

    sudo systemctl start docker
    sudo systemctl enable docker
    
  8. (可选)将当前用户加入docker组 ,避免每次使用 sudo

    sudo usermod -aG docker $USER
    

    注意 :执行此命令后,需要 注销并重新登录 ,或者新开一个终端,用户组更改才会生效。

3.2 配置Docker镜像加速器

国内访问Docker Hub可能较慢,建议配置国内镜像加速器以提升拉取镜像的速度。

  1. 编辑Docker守护进程配置文件:

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
      ],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF
    

    你可以保留一个或多个镜像加速地址。

  2. 重新加载配置并重启Docker:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  3. 验证配置是否生效:

    sudo docker info | grep -A 1 "Registry Mirrors"
    

    应该能看到你配置的镜像地址。

4. 获取或构建LoongArch架构的Jenkins镜像

这是龙芯平台部署Jenkins最关键的步骤。目前有几种方案:

4.1 方案一:使用社区已构建的镜像(推荐首选)

一些社区或厂商会维护适配LoongArch的Jenkins镜像。你可以在Docker Hub或其他镜像仓库搜索关键词如 jenkins loongarch64 jenkins loongarch

例如,假设我们找到了一个镜像 registry.example.com/jenkins-loongarch:lts

sudo docker pull registry.example.com/jenkins-loongarch:lts

如何寻找

  • 关注龙芯开源社区、统信/麒麟的生态网站。
  • 在GitHub上搜索相关项目。
  • 使用 docker search 命令(但Docker Hub官方搜索对架构过滤不友好)。

4.2 方案二:使用 binfmt_misc buildx 模拟构建(跨架构构建)

如果你的宿主机是x86,但想为龙芯构建镜像,或者龙芯服务器本身性能足够,可以使用Docker Buildx进行跨架构构建。这需要在宿主机上注册QEMU模拟器。

  1. 安装 qemu-user-static (在x86宿主机上)

    # Ubuntu/Debian
    sudo apt install -y qemu-user-static
    # 注册binfmt_misc
    sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    
  2. 启用Docker Buildx

    docker buildx create --name mybuilder --use
    docker buildx inspect --bootstrap
    
  3. 编写Dockerfile : 创建一个 Dockerfile ,基于支持LoongArch的基础镜像(如 debian:bullseye-slim 的loongarch64变体,如果存在),或者从源码编译Jenkins。这通常比较复杂,需要解决所有依赖的架构问题。

4.3 方案三:在龙芯宿主机上直接构建

这是最直接但可能最耗时的方法。在龙芯服务器上,基于一个LoongArch的基础镜像(例如官方提供的 debian:11 ubuntu:22.04 的loongarch64端口),编写Dockerfile安装Jenkins。

示例Dockerfile思路

# 假设存在一个loongarch64的debian镜像
FROM debian:bullseye-slim

# 标识架构
ARG TARGETARCH=loongarch64

# 安装必要的工具和Java
RUN apt-get update && apt-get install -y \
    wget \
    gnupg \
    fontconfig \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 安装OpenJDK 11 (需确认源中有loongarch64包)
RUN apt-get update && apt-get install -y openjdk-11-jdk-headless

# 下载并安装Jenkins
ARG JENKINS_VERSION=2.426.3
RUN wget -O /usr/share/jenkins/jenkins.war \
    https://get.jenkins.io/war-stable/${JENKINS_VERSION}/jenkins.war

# 创建Jenkins用户
RUN useradd -d /var/jenkins_home -u 1000 -m -s /bin/bash jenkins

# 暴露端口
EXPOSE 8080 50000

# 定义数据卷
VOLUME /var/jenkins_home

# 切换用户
USER jenkins

# 启动命令
ENTRYPOINT ["java", "-jar", "/usr/share/jenkins/jenkins.war"]

注意 :此Dockerfile仅为示例, debian:bullseye-slim 的loongarch64版本需要真实存在,且软件源中需有对应的JDK。实际操作中,你可能需要寻找一个已适配的JDK基础镜像。

鉴于方案二和方案三的复杂性,对于大多数用户,强烈建议优先寻找并采用方案一(社区已构建的镜像) 。本文后续步骤将基于一个假设已拉取成功的LoongArch Jenkins镜像(镜像名为 my-loongarch-jenkins:lts )进行。

5. 使用Docker运行Jenkins容器

我们采用Docker命令行直接运行,简单明了。你也可以使用 docker-compose.yml 来管理,后者更利于定义数据卷、网络等。

5.1 创建数据卷和网络(可选但建议)

为了持久化Jenkins数据(配置、任务、插件),我们需要使用Docker数据卷。

# 创建一个数据卷用于Jenkins主目录
sudo docker volume create jenkins-data

# 创建一个自定义网络,便于未来连接其他容器(如GitLab、SonarQube)
sudo docker network create jenkins-network

5.2 运行Jenkins容器

执行以下命令启动容器:

sudo docker run -d \
  --name jenkins \
  --restart=unless-stopped \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --network jenkins-network \
  my-loongarch-jenkins:lts

参数详解:

  • -d :后台运行容器。
  • --name jenkins :为容器指定一个名称,便于管理。
  • --restart=unless-stopped :容器退出时自动重启(除非手动停止)。
  • -p 8080:8080 :将宿主机的8080端口映射到容器的8080端口(Jenkins Web界面)。
  • -p 50000:50000 :映射50000端口,用于Jenkins代理(Agent)连接。
  • -v jenkins-data:/var/jenkins_home :将之前创建的 jenkins-data 卷挂载到容器内的Jenkins主目录。 这是数据持久化的关键
  • -v /var/run/docker.sock:/var/run/docker.sock :将宿主机的Docker守护进程套接字挂载到容器内。这允许Jenkins容器内的任务直接调用宿主机的Docker引擎(例如,在Pipeline中构建Docker镜像),即所谓的“Docker-out-of-Docker”(DooD)模式。 注意安全风险 ,仅在你信任Jenkins且需要此功能时使用。
  • --network jenkins-network :将容器加入自定义网络。
  • my-loongarch-jenkins:lts :你拉取的LoongArch架构Jenkins镜像名和标签。

5.3 验证容器状态

  1. 查看容器是否运行:

    sudo docker ps | grep jenkins
    

    应该能看到 jenkins 容器处于 Up 状态。

  2. 查看容器启动日志,确认无报错:

    sudo docker logs -f --tail 50 jenkins
    

    等待日志中出现类似 Jenkins is fully up and running 的信息,表示启动成功。首次启动会进行初始化,需要一些时间。

6. 初始化配置Jenkins

容器启动后,即可通过浏览器进行初始化配置。

  1. 访问Jenkins :打开浏览器,输入 http://<你的龙芯服务器IP>:8080

  2. 解锁Jenkins :页面会提示输入初始管理员密码。该密码存储在容器内的 /var/jenkins_home/secrets/initialAdminPassword 文件中。我们可以通过Docker命令获取:

    sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
    

    将输出的密码粘贴到Web页面中,点击“继续”。

  3. 安装插件 :接下来会提示安装插件。对于新手,建议选择“安装推荐的插件”。插件安装过程可能需要一段时间,速度取决于网络。在龙芯平台上,所有插件都是Java字节码,与架构无关,可以正常安装。

  4. 创建管理员用户 :插件安装完成后,按提示创建第一个管理员用户(建议不要跳过,使用初始密码不安全)。

  5. 配置实例URL :保持默认 http://<你的服务器IP>:8080 即可,点击“保存并完成”。

  6. 开始使用 :点击“开始使用Jenkins”,你将进入Jenkins主面板。

7. 基础配置与优化

成功登录后,进行一些基础配置能让Jenkins更好用。

7.1 更换插件更新中心镜像(加速插件下载)

由于网络原因,插件安装和更新可能很慢。我们可以更换为国内镜像源。

  1. 进入 Manage Jenkins -> Manage Plugins -> Advanced 选项卡。
  2. 找到 Update Site 部分。将默认的 https://updates.jenkins.io/update-center.json 替换为国内镜像,例如:
    • 清华大学镜像: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
    • 华为云镜像: https://repo.huaweicloud.com/jenkins/updates/update-center.json
  3. 勾选“Submit”下方的复选框,点击“Submit”。
  4. 回到 Available Plugins 选项卡,点击“Check now”立即检查更新。

7.2 安装常用插件

进入 Manage Jenkins -> Manage Plugins -> Available Plugins 。 搜索并安装以下常用插件(根据你的需求选择):

  • Localization: Chinese (Simplified) : Jenkins中文语言包。
  • Pipeline : 核心插件,支持Pipeline as Code。
  • Git : 集成Git。
  • Docker Pipeline : 在Pipeline中支持Docker。
  • Blue Ocean : 提供现代化的可视化流水线界面。
  • Role-based Authorization Strategy : 基于角色的权限管理。

安装后,根据提示重启Jenkins。

7.3 配置全局工具(JDK, Maven, Git等)

如果你的构建任务需要JDK、Maven、Gradle等工具,需要在Jenkins中配置。

  1. 进入 Manage Jenkins -> Tools
  2. JDK : 如果Jenkins镜像内已自带JDK,可以添加一个“Inherit from the JAVA_HOME”的JDK配置。如果需要其他版本,可以手动解压安装到容器内,或使用工具自动安装(需网络)。
  3. Git : 通常容器内已安装,路径为 /usr/bin/git
  4. Maven/Gradle : 建议使用“自动安装”功能,Jenkins会自动从官网下载。 注意 :确保下载链接对应的二进制包有LoongArch版本。如果没有,你需要手动下载LoongArch版本的压缩包,放到服务器指定路径,然后选择“手动安装”并指定路径。

7.4 配置Docker Cloud(用于动态创建Agent)

如果你在启动容器时挂载了Docker Socket,可以配置Docker Cloud,让Jenkins在需要时动态创建Docker容器作为构建代理(Agent)。

  1. 进入 Manage Jenkins -> Manage Nodes and Clouds -> Configure Clouds
  2. 点击“Add a new cloud”,选择“Docker”。
  3. 配置Docker Host URI:如果使用挂载的socket,URI为 unix:///var/run/docker.sock
  4. 点击“Test Connection”,应该显示“Version: …”,表示连接成功。
  5. 添加“Docker Agent templates”。这里需要指定一个用于构建的Docker镜像。 关键点 :这个镜像也必须是LoongArch架构的!例如,你需要一个包含构建工具(如Maven, JDK)的LoongArch基础镜像。你可以参考第4节的方法准备这样的镜像。
  6. 配置标签、执行器数量等,保存。

8. 创建你的第一个Pipeline任务

现在,我们来创建一个简单的Pipeline任务,验证Jenkins是否正常工作。

  1. 点击Jenkins首页的“新建Item”。
  2. 输入任务名称,例如“my-first-pipeline”,选择“Pipeline”,点击“OK”。
  3. 在配置页面,向下滚动到“Pipeline”部分。
  4. 在“Definition”中选择“Pipeline script”。
  5. 在脚本框中输入以下简单的Pipeline脚本:
    pipeline {
        agent any // 使用任何可用的代理(主节点或Docker动态代理)
        stages {
            stage('Hello') {
                steps {
                    echo 'Hello, LoongArch & Jenkins!'
                    sh 'uname -m' // 打印系统架构,应该是 loongarch64
                    sh 'java -version'
                }
            }
        }
    }
    
  6. 点击“保存”。
  7. 回到任务页面,点击“立即构建”。
  8. 点击构建历史中的构建号,再点击“Console Output”,查看构建日志。你应该能看到输出的问候语、系统架构( loongarch64 )以及Java版本信息。

9. 常见问题与排查思路

在龙芯平台部署Jenkins过程中,你可能会遇到以下问题:

问题现象 可能原因 排查思路与解决方案
docker pull 镜像失败,提示 no matching manifest Docker Hub上该镜像没有 linux/loongarch64 架构的版本。 1. 使用 docker manifest inspect IMAGE:TAG 查看镜像支持的架构。
2. 寻找社区维护的LoongArch版本镜像(方案一)。
3. 自行构建(方案二、三)。
容器启动后立即退出 1. 镜像架构不匹配,无法执行。
2. 启动命令或参数错误。
3. 容器内应用启动失败(如Java错误)。
1. docker logs --tail 100 <容器ID> 查看退出前的日志。
2. 检查镜像是否正确: docker image inspect
3. 尝试以交互模式运行 docker run -it ... sh 进入容器排查。
访问 http://IP:8080 无响应 1. 防火墙未开放8080端口。
2. 容器未成功启动。
3. 宿主机IP地址错误。
1. sudo docker ps 确认容器状态。
2. sudo ufw allow 8080 (如果使用UFW) 或配置系统防火墙。
3. curl localhost:8080 在宿主机上测试。
插件下载安装极慢或失败 默认更新中心网络连接不佳。 更换为国内镜像源(见7.1节)。
Pipeline中执行 sh ‘uname -m’ 不是 loongarch64 Pipeline任务被调度到了错误的Agent上(例如连接了一个x86的Agent)。 1. 检查任务配置的 agent 标签,确保其匹配LoongArch的节点。
2. 如果是Docker动态Agent,检查Docker Agent模板使用的镜像是否为LoongArch架构。
构建时无法调用宿主机Docker命令 1. 启动容器时未挂载Docker Socket。
2. 挂载路径不正确。
3. 容器内用户无权访问socket文件。
1. 确保运行命令包含 -v /var/run/docker.sock:/var/run/docker.sock
2. 在容器内执行 ls -l /var/run/docker.sock 检查权限,通常需要将容器内用户加入 docker 组(在Dockerfile中处理)。
内存不足导致Jenkins卡顿或构建失败 Jenkins和构建任务消耗内存较多。 1. 为Docker容器分配更多内存: docker run -m 4g ...
2. 调整Jenkins系统属性:在 JAVA_OPTS 中增加 -Xmx 参数(需修改容器启动命令或Dockerfile)。

10. 最佳实践与工程建议

  1. 镜像管理

    • 标签明确 :为你使用的LoongArch Jenkins镜像打上明确的标签,如 mycompany/jenkins:lts-loongarch64-2024 ,便于版本追踪。
    • 私有仓库 :将定制好的镜像推送到内部私有镜像仓库(如Harbor),确保团队内部署环境一致。
  2. 数据持久化与备份

    • 必须使用数据卷 :切勿将Jenkins数据 ( /var/jenkins_home ) 存储在容器内部,务必使用Docker Volume或绑定宿主机目录。
    • 定期备份 :编写脚本定期备份 jenkins-data 卷的内容。可以使用 docker run --rm -v jenkins-data:/source -v /host/backup:/backup alpine tar czf /backup/jenkins-backup-$(date +%Y%m%d).tar.gz -C /source . 进行简单备份。
  3. 安全加固

    • 最小权限原则 :不要使用root用户运行Jenkins容器。确保你的镜像以非root用户(如 jenkins 用户)运行。
    • 谨慎挂载Docker Socket :挂载 /var/run/docker.sock 意味着容器内拥有几乎与宿主机root等同的权限。仅在必要时使用,并考虑使用更安全的替代方案,如使用Jenkins的SSH Agent或Kubernetes集群。
    • 网络隔离 :使用自定义Docker网络(如 jenkins-network ),避免容器暴露在默认的桥接网络。
    • 更新与漏洞扫描 :定期更新Jenkins本体、插件以及基础镜像,以修复安全漏洞。
  4. 性能与稳定性

    • 资源限制 :为Jenkins容器设置合理的CPU和内存限制 ( --cpus , -m ),防止其耗尽宿主机资源。
    • 日志轮转 :配置Docker的日志驱动和大小限制(如本文3.2节),防止日志占满磁盘。
    • 插件清理 :定期审查并卸载不使用的插件,减少升级冲突和内存占用。
  5. 配置即代码(JCasC)

    • 对于生产环境,建议使用 Jenkins Configuration as Code 插件。将系统配置、插件安装、凭据管理等全部通过YAML文件定义,实现配置的版本化管理、一键部署和快速恢复。

在龙芯3B6000平台上通过Docker部署Jenkins,核心挑战在于基础镜像的架构适配。一旦解决了镜像问题,后续的部署、配置和使用流程与x86平台并无本质差异。本文提供了从寻找/构建镜像、安装Docker、运行容器、初始化配置到排错和最佳实践的完整路径。希望这份指南能帮助你在自主可控的硬件平台上,顺利搭建起高效、稳定的自动化构建与部署流水线,为你的软件开发流程注入持续集成的强大动力。如果在实践中遇到新的问题,欢迎在社区中交流分享,共同丰富LoongArch的软件生态。

更多推荐