如果你正在为国产龙芯平台搭建CI/CD流水线,可能会发现一个尴尬的现实:大多数Jenkins部署教程都是基于x86架构的,而龙芯的LoongArch架构意味着你需要面对完全不同的依赖环境、镜像兼容性和系统配置。更具体地说,当你在龙芯3B6000上执行 docker pull jenkins/jenkins 时,大概率会得到一个“镜像与平台不匹配”的错误。

这不仅仅是拉取镜像失败的问题,它背后反映的是国产化替代浪潮下,开发者必须直面的工程挑战:如何在非x86的主流生态中,复用那些成熟的开源工具链?本文将以 龙芯3B6000 + Docker + Jenkins 这个组合为切入点,为你提供一个从零开始、完全可复现的部署方案。你将了解到:

  1. 为什么在龙芯上直接使用官方Jenkins镜像行不通 ,以及背后的架构差异原理。
  2. 如何为龙芯平台 构建或寻找可用的Jenkins Docker镜像
  3. 一套完整的 环境配置、容器部署、网络设置与基础流水线验证 流程。
  4. 在龙芯平台上运行Jenkins时, 必须注意的性能调优点与常见坑位

读完本文,你将能在一台龙芯3B6000机器上,成功部署一个稳定可用的Jenkins服务,并理解其与x86环境下的核心差异,为后续的国产化CI/CD实践打下坚实基础。

1. 核心问题:龙芯架构下的Docker生态挑战

在x86世界, docker run jenkins/jenkins 几乎是一条万能命令。但在龙芯3B6000(采用LoongArch64架构)上,事情远非如此简单。这并非Docker或Jenkins的“问题”,而是整个软件生态的架构兼容性鸿沟。

根本原因在于指令集差异 。主流的Docker Hub官方镜像,如 jenkins/jenkins:lts ,其基础镜像是针对 linux/amd64 (即x86_64)架构编译构建的。而龙芯3B6000的CPU是 linux/loong64 架构。Docker引擎在运行时会检查镜像的架构标签,如果不匹配,就会拒绝启动容器。

这导致了两个直接的后果:

  1. 镜像不可用 :无法直接拉取运行绝大多数x86镜像。
  2. 依赖库缺失 :即使你能运行一个基础Linux容器,其内部预装的软件(如Jenkins所需的Java环境、各种插件依赖的本地库)也极可能是x86版本,无法在龙芯上执行。

因此,在龙芯上部署Jenkins的核心思路发生了转变: 从“拉取现成镜像”转变为“为特定平台构建镜像” 。这要求我们不仅要会使用Docker,更要理解如何构建一个符合目标平台的应用镜像。

2. 环境准备:龙芯3B6000系统与Docker基础

在开始构建和部署之前,必须确保基础环境就绪。以下步骤假设你已拥有一台安装了原生Loongnix或统信UOS等龙芯兼容操作系统的龙芯3B6000机器。

2.1 系统确认

首先,通过终端确认系统架构和内核版本。

uname -m

预期输出应为 loongarch64 ,这确认了你的平台。

cat /etc/os-release

查看操作系统具体信息,以便后续安装命令选择(yum或apt)。

2.2 Docker引擎安装

龙芯平台上的Docker安装与x86略有不同,需使用适配LoongArch的软件源。

对于基于Debian/Ubuntu的系统(如统信UOS):

# 1. 更新软件包索引
sudo apt update

# 2. 安装必要的依赖包,允许apt通过HTTPS使用仓库
sudo apt install -y ca-certificates curl gnupg

# 3. 添加Docker官方GPG密钥(注意:需确认源是否提供loongarch64架构包)
# 通常,系统厂商会提供已适配的Docker源。若无,可从龙芯社区或发行版仓库安装。
# 示例:安装龙芯社区提供的docker.io包(具体包名可能不同)
sudo apt install -y docker.io

# 4. 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 5. 将当前用户加入docker组,避免每次使用sudo
sudo usermod -aG docker $USER
# 注意:需要重新登录或执行 `newgrp docker` 使组生效

对于基于RHEL/CentOS的系统(如Loongnix):

# 1. 安装yum工具集
sudo yum install -y yum-utils

# 2. 添加包含Docker的仓库(此处需替换为你的系统实际可用的龙架构仓库地址)
# 例如,Loongnix可能已内置。若无,需手动配置。
# sudo yum-config-manager --add-repo http://mirrors.loongnix.cn/docker-ce/loongnix/docker-ce.repo

# 3. 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 4. 启动并设置自启
sudo systemctl start docker
sudo systemctl enable docker

# 5. 用户组管理
sudo usermod -aG docker $USER

安装完成后,验证Docker版本及架构:

docker version --format '{{.Server.Architecture}}'

应输出 loongarch64 。再运行一个简单的测试:

docker run --rm hello-world

如果系统有适配的 hello-world:linux/loong64 镜像,则会成功运行。如果没有,可能会报架构错误,这正印证了我们之前提到的问题。

3. 方案选择:获取龙芯可用的Jenkins镜像

面对架构壁垒,我们有三种主流方案,其优缺点对比如下:

方案 核心操作 优点 缺点 推荐度
方案A:使用社区预构建镜像 从龙芯社区或第三方仓库拉取已构建好的 linux/loong64 Jenkins镜像。 最快捷,开箱即用。 镜像版本可能较旧,安全性、插件版本不可控。 ★★★★☆ (首选尝试)
方案B:自行使用Dockerfile构建 编写Dockerfile,基于龙芯可用的基础镜像(如 loongnix/loongnix:latest )安装Jenkins。 完全可控,可定制化,适合生产环境。 需要一定的Dockerfile编写和调试能力,耗时较长。 ★★★★★ (最推荐)
方案C:使用 docker buildx 跨平台构建 在x86开发机上,使用buildx工具为 linux/loong64 架构构建镜像,再推送到仓库供龙芯拉取。 利用x86的构建速度,统一构建流程。 配置复杂,需要设置构建器和多架构仓库。 ★★★☆☆ (适合团队CI)

对于大多数开发者,我们推荐从 方案A 开始验证,最终过渡到 方案B 以实现自主可控。下面详细介绍方案B的完整构建过程。

4. 实战:编写Dockerfile构建龙芯Jenkins镜像

我们将基于龙芯官方提供的 cr.loongnix.cn/library/loongnix:latest 基础镜像来构建。这个镜像是一个精简的Loongnix系统,兼容龙芯架构。

4.1 创建构建目录与文件

mkdir jenkins-loongarch && cd jenkins-loongarch
touch Dockerfile docker-compose.yml

4.2 编写Dockerfile

编辑 Dockerfile ,内容如下:

# 使用龙芯官方基础镜像
FROM cr.loongnix.cn/library/loongnix:latest

# 维护者信息
LABEL maintainer="your-email@example.com"

# 安装必要的系统工具和OpenJDK 11 (Jenkins LTS推荐版本)
RUN yum update -y && \
    yum install -y wget curl fontconfig java-11-openjdk-devel which && \
    yum clean all

# 创建Jenkins用户和组(使用高UID以避免与主机用户冲突)
RUN groupadd -g 1000 jenkins && \
    useradd -d /var/jenkins_home -u 1000 -g 1000 -m jenkins

# 设置工作目录
WORKDIR /var/jenkins_home

# 下载并安装Jenkins war包
# 注意:需从Jenkins官方或镜像站获取最新稳定版URL,此处以2.440.1为例
ENV JENKINS_VERSION 2.440.1
ENV JENKINS_HOME /var/jenkins_home
ENV JENKINS_SHA=... # 实际使用时需填写正确的SHA256校验和
ENV JENKINS_URL https://get.jenkins.io/war-stable/${JENKINS_VERSION}/jenkins.war

RUN curl -fsSL ${JENKINS_URL} -o /usr/share/jenkins/jenkins.war

# 创建必要的目录并设置权限
RUN mkdir -p /usr/share/jenkins/ref && \
    chown -R jenkins:jenkins /var/jenkins_home /usr/share/jenkins

# 暴露Jenkins默认端口
EXPOSE 8080

# 设置健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
  CMD curl -f http://localhost:8080/ || exit 1

# 以jenkins用户运行
USER jenkins

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

关键点解析:

  1. 基础镜像 :必须使用龙架构基础镜像,这里是 cr.loongnix.cn 提供的。
  2. Java环境 :安装 java-11-openjdk-devel ,这是Loongnix仓库中适配龙芯的JDK包。
  3. 用户权限 :遵循安全最佳实践,创建专门的 jenkins 用户运行服务。
  4. Jenkins WAR包 :我们直接下载官方的WAR包。由于WAR包是平台无关的Java字节码,只要JVM是龙芯兼容的,就能运行。这比直接安装deb/rpm包更可靠。
  5. 健康检查 :方便Docker或编排工具监控服务状态。

4.3 构建镜像

Dockerfile 所在目录执行构建命令:

docker build -t my-jenkins:loongarch64-latest .

这个过程会下载基础镜像、安装包、下载Jenkins WAR,需要一定时间。构建成功后,可以使用 docker images 查看生成的镜像。

5. 使用Docker Compose部署与配置

单纯使用 docker run 命令管理容器,参数繁多且不易维护。我们使用 docker-compose.yml 来定义服务,实现一键启动和配置管理。

5.1 编写docker-compose.yml

编辑之前创建的 docker-compose.yml 文件:

version: '3.8'

services:
  jenkins:
    image: my-jenkins:loongarch64-latest # 使用我们刚构建的镜像
    container_name: jenkins-loongarch
    user: "1000:1000" # 与Dockerfile中创建的jenkins用户UID/GID对应
    ports:
      - "8080:8080" # 将容器8080端口映射到主机8080端口
      - "50000:50000" # Jenkins Agent通信端口
    volumes:
      - ./jenkins_home:/var/jenkins_home # 持久化Jenkins数据
      - /var/run/docker.sock:/var/run/docker.sock:ro # 允许Jenkins调用主机Docker(需谨慎)
    environment:
      - JAVA_OPTS=-Djava.awt.headless=true -Xmx1024m -Xms512m # JVM参数,根据龙芯内存调整
      - JENKINS_OPTS=--prefix=/jenkins # 可选,如果你希望通过反向代理访问
    restart: unless-stopped
    networks:
      - jenkins-net

networks:
  jenkins-net:
    driver: bridge

5.2 启动Jenkins服务

# 在docker-compose.yml所在目录执行
docker-compose up -d

-d 参数表示后台运行。使用以下命令查看日志和状态:

# 查看实时日志
docker-compose logs -f jenkins

# 查看容器状态
docker-compose ps

5.3 初始访问与解锁

  1. 服务启动后,在浏览器访问 http://<你的龙芯机器IP>:8080
  2. 首次访问会进入“解锁Jenkins”页面,要求输入初始管理员密码。
  3. 该密码存储在Jenkins主机的文件中。在我们的配置中,主机目录 ./jenkins_home 被挂载到容器内。密码文件路径为:
    # 在宿主机上执行
    cat ./jenkins_home/secrets/initialAdminPassword
    
  4. 复制密码到网页,点击“继续”。
  5. 接下来是插件安装界面。 这里有一个关键点 :由于网络和架构原因,直接安装推荐插件可能会失败。建议选择“安装推荐的插件”,但需要做好重试准备,或者先“跳过插件安装”,进入系统后再逐个安装。
  6. 创建第一个管理员用户,完成安装。

6. 插件安装与龙芯环境适配

Jenkins的强大依赖于插件,但在龙芯平台上,插件安装可能遇到两类问题:

  1. 网络问题 :默认更新中心连接慢或超时。
  2. 原生库依赖问题 :某些插件(如SSH、Docker Pipeline、Git等)可能需要调用本地命令或依赖特定架构的本地库。

6.1 更换插件更新中心镜像

进入 Jenkins -> Manage Jenkins -> Plugin Manager -> Advanced。 在 “Update Site” 区域,将 “URL” 替换为国内镜像站,例如清华大学镜像:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

点击“提交”并“立即获取”。

6.2 分批次安装核心插件

不要一次性安装所有插件。建议按以下顺序分批安装,每批安装后重启Jenkins观察是否稳定:

  1. 基础必需 Locale , Pipeline , Git , Credentials Binding
  2. 版本控制 GitLab Gitee (根据你的代码仓库选择)。
  3. 构建工具 Maven Integration , Gradle
  4. 容器与云 Docker Pipeline , Kubernetes (如需)。
  5. 通知 Email Extension , Telegram 钉钉

重要提示 :对于依赖本地二进制文件的插件(如 Docker Pipeline 需要 docker 命令行),你需要确保容器内可以访问到龙芯架构的对应二进制文件。这通常通过将主机Docker套接字挂载到容器(如我们compose文件所做)或将二进制文件打包进自定义镜像来实现。

6.3 配置龙芯架构的构建节点(Agent)

如果你的Jenkins需要编译龙芯原生应用(如C/C++、Golang),主节点(Master)可能资源不足或环境不纯净。需要配置龙芯架构的常驻Agent或使用SSH Agent。

  1. 准备一台龙芯构建机 (可以是同一台机器的另一个容器或另一台物理机),确保已安装Java(版本与Master兼容)。
  2. 在Jenkins Master上:Manage Jenkins -> Nodes -> New Node。
  3. 输入节点名称,选择“Permanent Agent”。
  4. 配置:
    • 远程工作目录 :如 /home/jenkins/agent
    • 启动方式 :选择“Launch agent via SSH”
    • 主机 :填写构建机的IP或主机名
    • Credentials :添加SSH用户名和密钥
    • 主机密钥验证策略 :选择“Non verifying Verification Strategy”(测试环境)或手动接受密钥。
  5. 保存后,Jenkins会尝试通过SSH连接到该节点并自动启动agent程序。你需要在构建机上确保Java可用,并且网络通畅。

7. 创建一个验证流水线(Pipeline)

部署完成后,我们创建一个简单的Pipeline任务,验证整个CI/CD链路在龙芯平台上是否工作正常。

7.1 新建Pipeline任务

  1. 在Jenkins首页点击“新建Item”。
  2. 输入任务名称,例如 test-loongarch-pipeline ,选择“Pipeline”,点击“确定”。
  3. 在配置页面向下滚动到“Pipeline”部分。

7.2 编写Pipeline脚本

在“Definition”处选择“Pipeline script”,并输入以下示例脚本:

pipeline {
    agent any // 可以在任何可用的agent上运行,包括龙芯节点

    stages {
        stage('Checkout') {
            steps {
                echo '开始从Git仓库拉取代码...'
                // 这里假设你配置了Git凭据和仓库地址
                // git credentialsId: 'your-git-credential-id', url: 'https://your-git-repo.git'
                echo '模拟代码拉取完成。'
            }
        }
        stage('Build on LoongArch') {
            steps {
                echo '在龙芯架构上执行构建...'
                sh '''
                    echo "当前架构信息:"
                    uname -m
                    echo "Java版本信息:"
                    java -version
                    echo "模拟编译步骤..."
                    # 这里可以替换为实际的构建命令,例如:make 或 mvn clean package
                    echo "构建完成。"
                '''
            }
        }
        stage('Test') {
            steps {
                echo '运行测试...'
                // 可以在此处运行单元测试或集成测试
                echo '测试通过。'
            }
        }
        stage('Package') {
            steps {
                echo '打包制品...'
                sh '''
                    # 模拟创建一个制品文件
                    echo "This is a dummy artifact built on LoongArch64" > artifact-$(date +%Y%m%d%H%M%S).txt
                    ls -la *.txt
                '''
                archiveArtifacts artifacts: '*.txt', fingerprint: true
            }
        }
    }
    post {
        always {
            echo 'Pipeline执行结束。'
        }
        success {
            echo '恭喜,Pipeline成功!'
        }
        failure {
            echo 'Pipeline执行失败。'
        }
    }
}

这个脚本不依赖特定代码库,它主要演示了:

  • 多阶段(Stage)流程。
  • 在龙芯Agent上执行Shell命令,并输出架构信息。
  • 创建并归档简单的制品。

7.3 运行与验证

  1. 点击“保存”,然后点击“立即构建”。
  2. 在构建历史中点击本次构建,进入“Console Output”查看实时日志。
  3. 你应该能看到 uname -m 输出 loongarch64 ,以及Java版本信息。这证明Pipeline正在龙芯架构的节点上正确执行。
  4. 构建成功后,在构建页面可以看到归档的 artifact-*.txt 文件,可以下载查看。

8. 性能调优与生产环境注意事项

在龙芯3B6000上运行Jenkins,除了功能实现,还需关注性能和稳定性。

8.1 JVM参数优化

龙芯平台的Java虚拟机性能调优至关重要。在 docker-compose.yml JAVA_OPTS 环境变量中调整:

environment:
  - JAVA_OPTS=-Djava.awt.headless=true -Xmx2048m -Xms1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200
  • -Xmx2048m -Xms1024m :根据主机物理内存调整。建议为Jenkins容器分配不少于2GB的堆内存。
  • -XX:+UseG1GC :使用G1垃圾收集器,通常能提供更好的大内存堆性能。
  • -XX:MaxGCPauseMillis=200 :设定GC最大停顿时间目标。

8.2 数据持久化与备份

务必通过Docker卷(Volume)持久化 /var/jenkins_home 目录。我们的 docker-compose.yml 已经做了映射 ( ./jenkins_home )。定期备份此目录。

# 简单备份示例
tar -czf jenkins_backup_$(date +%Y%m%d).tar.gz ./jenkins_home

8.3 网络与安全

  • 防火墙 :确保主机防火墙开放了8080和50000端口。
  • 反向代理 :生产环境建议使用Nginx或Apache作为反向代理,配置SSL/TLS加密,并将Jenkins放在子路径(如 /jenkins )下。
  • 避免挂载Docker套接字 :示例中挂载 /var/run/docker.sock 是为了方便在Pipeline中调用Docker。 在生产环境中,这是高风险操作 ,因为它赋予了容器内进程几乎与主机root等同的权限。更安全的做法是使用Docker-in-Docker(dind)方案或单独的Docker主机作为构建节点。

8.4 监控与日志

  • 容器日志 :使用 docker-compose logs -f --tail=50 跟踪日志。
  • 资源监控 :使用 docker stats 查看容器CPU、内存使用情况。
  • Jenkins系统监控 :安装 Monitoring 插件,观察系统负载、队列长度等。

9. 常见问题与排查思路

在龙芯平台上部署Jenkins,你可能会遇到一些特有或常见的问题。

问题现象 可能原因 排查方式 解决方案
docker pull docker run 报错: no matching manifest for linux/loong64 尝试拉取或运行了非龙架构的镜像。 docker image inspect <镜像名> 查看其支持的架构。 寻找或构建支持 linux/loong64 的镜像。
构建镜像时 yum install 失败 1. 网络问题。
2. 软件源未配置或不可用。
1. ping 测试网络。
2. 检查 /etc/yum.repos.d/ 下的repo文件。
1. 配置网络。
2. 更换为可用的龙芯系统软件源。
Jenkins启动失败,报Java相关错误 1. 容器内Java未正确安装。
2. JVM内存参数设置不当。
1. 进入容器检查Java: docker exec -it <容器名> java -version
2. 查看启动日志。
1. 确保Dockerfile中Java安装成功。
2. 调整 JAVA_OPTS ,减少 -Xmx 值。
访问 http://IP:8080 连接被拒绝 1. Jenkins容器未成功启动。
2. 端口映射错误或端口被占用。
3. 主机防火墙阻止。
1. docker-compose ps 查看状态。
2. docker-compose logs 查看错误。
3. netstat -tlnp | grep 8080 检查端口。
1. 根据日志修复启动问题。
2. 修改 docker-compose.yml 中的端口映射。
3. 开放防火墙端口。
插件安装极慢或失败 默认更新中心连接国外服务器慢。 在浏览器开发者工具“网络”标签页查看插件下载请求。 更换插件更新中心为国内镜像站(见6.1节)。
Pipeline中执行 sh 命令找不到工具(如git, mvn) 构建用的Jenkins Agent镜像或环境中未安装这些工具。 在Pipeline的 sh 步骤中执行 which git 等命令检查。 1. 在用于构建的自定义Docker镜像中预装所需工具。
2. 在Agent节点上手动安装。
构建性能感觉比x86慢 1. 龙芯3B6000单核性能与同代x86有差距。
2. JVM未优化。
3. 磁盘I/O或网络慢。
1. 监控系统资源( top , iostat )。
2. 分析构建日志,看耗时在哪个阶段。
1. 合理设置JVM参数。
2. 使用更高效的构建工具和配置(如Maven镜像)。
3. 确保使用SSD硬盘。

10. 总结与后续方向

通过本文的步骤,你应该已经在龙芯3B6000上成功部署了一个基于Docker的Jenkins服务,并理解了在非x86架构下进行软件部署的核心理念—— 从“消费镜像”转向“构建镜像”

这个过程的关键收获在于:

  • 架构意识 :在国产化环境中,必须时刻关注软件的架构兼容性。
  • 可控构建 :掌握编写Dockerfile构建自有镜像的能力,是摆脱平台依赖的关键。
  • 渐进式适配 :从基础服务部署,到插件安装,再到流水线编写,每一步都需要根据目标平台进行验证和调整。

作为后续深入的方向,你可以:

  1. 构建专属Agent镜像 :为不同的构建环境(如Java、Golang、Python)制作包含龙芯版本工具链的Docker镜像,提升流水线效率和一致性。
  2. 集成国产化组件 :将流水线与国产代码仓库(如Gitee)、国产制品库、国产部署环境进行对接。
  3. 探索Kubernetes :在龙芯服务器集群上部署K8s,并使用Jenkins的Kubernetes插件动态创建构建Pod,实现资源的弹性调度。

国产化替代是一条长路,在龙芯这样的新架构上搭建完整的开发运维工具链,是其中坚实的一步。希望这篇详尽的指南能帮助你扫清障碍,顺利搭建起属于你的龙芯CI/CD流水线。如果在实践中遇到新的问题,不妨回到Dockerfile和基础环境这两个根本点进行排查,往往能发现问题的根源。

更多推荐