龙芯平台Jenkins部署实战:从Docker镜像构建到CI/CD流水线搭建
如果你正在为国产龙芯平台搭建CI/CD流水线,可能会发现一个尴尬的现实:大多数Jenkins部署教程都是基于x86架构的,而龙芯的LoongArch架构意味着你需要面对完全不同的依赖环境、镜像兼容性和系统配置。更具体地说,当你在龙芯3B6000上执行
docker pull jenkins/jenkins
时,大概率会得到一个“镜像与平台不匹配”的错误。
这不仅仅是拉取镜像失败的问题,它背后反映的是国产化替代浪潮下,开发者必须直面的工程挑战:如何在非x86的主流生态中,复用那些成熟的开源工具链?本文将以 龙芯3B6000 + Docker + Jenkins 这个组合为切入点,为你提供一个从零开始、完全可复现的部署方案。你将了解到:
- 为什么在龙芯上直接使用官方Jenkins镜像行不通 ,以及背后的架构差异原理。
- 如何为龙芯平台 构建或寻找可用的Jenkins Docker镜像 。
- 一套完整的 环境配置、容器部署、网络设置与基础流水线验证 流程。
- 在龙芯平台上运行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引擎在运行时会检查镜像的架构标签,如果不匹配,就会拒绝启动容器。
这导致了两个直接的后果:
- 镜像不可用 :无法直接拉取运行绝大多数x86镜像。
- 依赖库缺失 :即使你能运行一个基础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"]
关键点解析:
-
基础镜像
:必须使用龙架构基础镜像,这里是
cr.loongnix.cn提供的。 -
Java环境
:安装
java-11-openjdk-devel,这是Loongnix仓库中适配龙芯的JDK包。 -
用户权限
:遵循安全最佳实践,创建专门的
jenkins用户运行服务。 - Jenkins WAR包 :我们直接下载官方的WAR包。由于WAR包是平台无关的Java字节码,只要JVM是龙芯兼容的,就能运行。这比直接安装deb/rpm包更可靠。
- 健康检查 :方便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 初始访问与解锁
-
服务启动后,在浏览器访问
http://<你的龙芯机器IP>:8080。 - 首次访问会进入“解锁Jenkins”页面,要求输入初始管理员密码。
-
该密码存储在Jenkins主机的文件中。在我们的配置中,主机目录
./jenkins_home被挂载到容器内。密码文件路径为:# 在宿主机上执行 cat ./jenkins_home/secrets/initialAdminPassword - 复制密码到网页,点击“继续”。
- 接下来是插件安装界面。 这里有一个关键点 :由于网络和架构原因,直接安装推荐插件可能会失败。建议选择“安装推荐的插件”,但需要做好重试准备,或者先“跳过插件安装”,进入系统后再逐个安装。
- 创建第一个管理员用户,完成安装。
6. 插件安装与龙芯环境适配
Jenkins的强大依赖于插件,但在龙芯平台上,插件安装可能遇到两类问题:
- 网络问题 :默认更新中心连接慢或超时。
- 原生库依赖问题 :某些插件(如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观察是否稳定:
-
基础必需
:
Locale,Pipeline,Git,Credentials Binding。 -
版本控制
:
GitLab或Gitee(根据你的代码仓库选择)。 -
构建工具
:
Maven Integration,Gradle。 -
容器与云
:
Docker Pipeline,Kubernetes(如需)。 -
通知
:
Email Extension,Telegram或钉钉。
重要提示
:对于依赖本地二进制文件的插件(如
Docker Pipeline
需要
docker
命令行),你需要确保容器内可以访问到龙芯架构的对应二进制文件。这通常通过将主机Docker套接字挂载到容器(如我们compose文件所做)或将二进制文件打包进自定义镜像来实现。
6.3 配置龙芯架构的构建节点(Agent)
如果你的Jenkins需要编译龙芯原生应用(如C/C++、Golang),主节点(Master)可能资源不足或环境不纯净。需要配置龙芯架构的常驻Agent或使用SSH Agent。
- 准备一台龙芯构建机 (可以是同一台机器的另一个容器或另一台物理机),确保已安装Java(版本与Master兼容)。
- 在Jenkins Master上:Manage Jenkins -> Nodes -> New Node。
- 输入节点名称,选择“Permanent Agent”。
-
配置:
-
远程工作目录
:如
/home/jenkins/agent - 启动方式 :选择“Launch agent via SSH”
- 主机 :填写构建机的IP或主机名
- Credentials :添加SSH用户名和密钥
- 主机密钥验证策略 :选择“Non verifying Verification Strategy”(测试环境)或手动接受密钥。
-
远程工作目录
:如
- 保存后,Jenkins会尝试通过SSH连接到该节点并自动启动agent程序。你需要在构建机上确保Java可用,并且网络通畅。
7. 创建一个验证流水线(Pipeline)
部署完成后,我们创建一个简单的Pipeline任务,验证整个CI/CD链路在龙芯平台上是否工作正常。
7.1 新建Pipeline任务
- 在Jenkins首页点击“新建Item”。
-
输入任务名称,例如
test-loongarch-pipeline,选择“Pipeline”,点击“确定”。 - 在配置页面向下滚动到“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 运行与验证
- 点击“保存”,然后点击“立即构建”。
- 在构建历史中点击本次构建,进入“Console Output”查看实时日志。
-
你应该能看到
uname -m输出loongarch64,以及Java版本信息。这证明Pipeline正在龙芯架构的节点上正确执行。 -
构建成功后,在构建页面可以看到归档的
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构建自有镜像的能力,是摆脱平台依赖的关键。
- 渐进式适配 :从基础服务部署,到插件安装,再到流水线编写,每一步都需要根据目标平台进行验证和调整。
作为后续深入的方向,你可以:
- 构建专属Agent镜像 :为不同的构建环境(如Java、Golang、Python)制作包含龙芯版本工具链的Docker镜像,提升流水线效率和一致性。
- 集成国产化组件 :将流水线与国产代码仓库(如Gitee)、国产制品库、国产部署环境进行对接。
- 探索Kubernetes :在龙芯服务器集群上部署K8s,并使用Jenkins的Kubernetes插件动态创建构建Pod,实现资源的弹性调度。
国产化替代是一条长路,在龙芯这样的新架构上搭建完整的开发运维工具链,是其中坚实的一步。希望这篇详尽的指南能帮助你扫清障碍,顺利搭建起属于你的龙芯CI/CD流水线。如果在实践中遇到新的问题,不妨回到Dockerfile和基础环境这两个根本点进行排查,往往能发现问题的根源。
更多推荐


所有评论(0)