龙芯平台Docker部署Jenkins实战:国产化CI/CD流水线搭建指南
在国产化替代浪潮中龙芯平台因其自主可控的特性正成为越来越多企业级应用部署的新选择。然而当我们将目光投向CI/CD持续集成/持续部署这一现代软件工程的核心环节时如何在龙芯架构上高效、稳定地搭建自动化构建与部署流水线成为了许多开发者和运维工程师面临的实际挑战。Jenkins作为业界广泛使用的开源自动化服务器结合Docker容器化技术无疑是解决这一问题的理想方案。本文将手把手带你完成在龙芯3B6000服务器上通过Docker部署Jenkins的全过程涵盖从环境准备、镜像适配、容器部署到基础配置和常见问题排查为你提供一份可直接复用的实战指南。1. 背景与核心概念在深入实操之前我们有必要厘清几个核心概念理解为什么要在龙芯平台上采用“Docker Jenkins”的组合。龙芯3B6000这是龙芯中科推出的新一代桌面/服务器级处理器采用自主指令系统LoongArch。对于开发者而言最需要关注的是其架构与常见的x86_64或ARM架构不同。这意味着许多为x86编译的软件包括部分Docker镜像无法直接运行需要寻找或构建适配LoongArch架构的版本。Docker一个开源的应用容器引擎允许开发者将应用及其依赖打包到一个可移植的容器中。在龙芯平台上Docker的价值尤为突出环境一致性确保Jenkins及其插件、构建工具在开发、测试、生产环境均为龙芯中行为一致。资源隔离与高效容器化部署避免了直接在宿主机安装多种Java版本、构建工具带来的环境冲突且启动迅速。简化部署通过镜像管理可以快速复制、迁移整个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 Engine20.10.x 或更高社区版(CE)即可。需确认支持LoongArch。Docker Composev2.x推荐使用用于编排服务可选但建议。Jenkins Docker Imagejenkins/jenkins:lts-jdk17或 LoongArch专用镜像官方镜像可能不直接支持LoongArch需寻找替代。Java (容器内)JDK 11 或 17Jenkins LTS版本通常与特定JDK LTS版本绑定。重要提示由于LoongArch生态仍在快速发展中直接使用docker pull jenkins/jenkins获取的官方镜像基于x86_64无法运行。我们的首要任务是解决镜像适配问题。3. 龙芯平台Docker安装与配置如果你的系统尚未安装Docker请按照以下步骤进行。3.1 安装Docker Engine龙芯平台的软件源通常已提供适配的Docker包。以统信UOS为例安装过程与Debian/Ubuntu类似。更新系统包索引sudo apt update安装必要的依赖包sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release添加Docker官方GPG密钥注意这里使用的是通用密钥适用于多架构curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg如果网络问题导致下载失败可以尝试从国内镜像源获取或检查系统源中是否已包含Docker包。设置稳定版仓库。由于LoongArch可能不在官方直接支持的架构列表中我们需要根据系统版本手动配置源。查看系统代号lsb_release -cs假设输出是uos。编辑或创建源列表文件echo deb [archloongarch64 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关键点将架构[archamd64]替换为[archloongarch64]但请注意Docker官方仓库可能未提供loongarch64的二进制包。更常见的做法是使用系统发行版自带的Docker包。实际安装推荐使用系统源 鉴于官方源可能不支持最可靠的方式是直接从UOS或麒麟的软件源安装sudo apt update # 搜索可用的docker包 sudo apt search docker-ce # 通常包名可能是 docker.io 或 docker-ce sudo apt install -y docker.io或者如果系统提供了docker-cesudo apt install -y docker-ce docker-ce-cli containerd.io验证安装sudo docker --version输出类似Docker version 20.10.12, build e91ed57即表示安装成功。启动Docker并设置开机自启sudo systemctl start docker sudo systemctl enable docker可选将当前用户加入docker组避免每次使用sudosudo usermod -aG docker $USER注意执行此命令后需要注销并重新登录或者新开一个终端用户组更改才会生效。3.2 配置Docker镜像加速器国内访问Docker Hub可能较慢建议配置国内镜像加速器以提升拉取镜像的速度。编辑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.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2 } EOF你可以保留一个或多个镜像加速地址。重新加载配置并重启Dockersudo systemctl daemon-reload sudo systemctl restart docker验证配置是否生效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模拟器。安装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启用Docker Buildxdocker buildx create --name mybuilder --use docker buildx inspect --bootstrap编写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 TARGETARCHloongarch64 # 安装必要的工具和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_VERSION2.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-network5.2 运行Jenkins容器执行以下命令启动容器sudo docker run -d \ --name jenkins \ --restartunless-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为容器指定一个名称便于管理。--restartunless-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 验证容器状态查看容器是否运行sudo docker ps | grep jenkins应该能看到jenkins容器处于Up状态。查看容器启动日志确认无报错sudo docker logs -f --tail 50 jenkins等待日志中出现类似Jenkins is fully up and running的信息表示启动成功。首次启动会进行初始化需要一些时间。6. 初始化配置Jenkins容器启动后即可通过浏览器进行初始化配置。访问Jenkins打开浏览器输入http://你的龙芯服务器IP:8080。解锁Jenkins页面会提示输入初始管理员密码。该密码存储在容器内的/var/jenkins_home/secrets/initialAdminPassword文件中。我们可以通过Docker命令获取sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword将输出的密码粘贴到Web页面中点击“继续”。安装插件接下来会提示安装插件。对于新手建议选择“安装推荐的插件”。插件安装过程可能需要一段时间速度取决于网络。在龙芯平台上所有插件都是Java字节码与架构无关可以正常安装。创建管理员用户插件安装完成后按提示创建第一个管理员用户建议不要跳过使用初始密码不安全。配置实例URL保持默认http://你的服务器IP:8080即可点击“保存并完成”。开始使用点击“开始使用Jenkins”你将进入Jenkins主面板。7. 基础配置与优化成功登录后进行一些基础配置能让Jenkins更好用。7.1 更换插件更新中心镜像加速插件下载由于网络原因插件安装和更新可能很慢。我们可以更换为国内镜像源。进入Manage Jenkins-Manage Plugins-Advanced选项卡。找到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勾选“Submit”下方的复选框点击“Submit”。回到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中配置。进入Manage Jenkins-Tools。JDK 如果Jenkins镜像内已自带JDK可以添加一个“Inherit from the JAVA_HOME”的JDK配置。如果需要其他版本可以手动解压安装到容器内或使用工具自动安装需网络。Git 通常容器内已安装路径为/usr/bin/git。Maven/Gradle 建议使用“自动安装”功能Jenkins会自动从官网下载。注意确保下载链接对应的二进制包有LoongArch版本。如果没有你需要手动下载LoongArch版本的压缩包放到服务器指定路径然后选择“手动安装”并指定路径。7.4 配置Docker Cloud用于动态创建Agent如果你在启动容器时挂载了Docker Socket可以配置Docker Cloud让Jenkins在需要时动态创建Docker容器作为构建代理Agent。进入Manage Jenkins-Manage Nodes and Clouds-Configure Clouds。点击“Add a new cloud”选择“Docker”。配置Docker Host URI如果使用挂载的socketURI为unix:///var/run/docker.sock。点击“Test Connection”应该显示“Version: …”表示连接成功。添加“Docker Agent templates”。这里需要指定一个用于构建的Docker镜像。关键点这个镜像也必须是LoongArch架构的例如你需要一个包含构建工具如Maven, JDK的LoongArch基础镜像。你可以参考第4节的方法准备这样的镜像。配置标签、执行器数量等保存。8. 创建你的第一个Pipeline任务现在我们来创建一个简单的Pipeline任务验证Jenkins是否正常工作。点击Jenkins首页的“新建Item”。输入任务名称例如“my-first-pipeline”选择“Pipeline”点击“OK”。在配置页面向下滚动到“Pipeline”部分。在“Definition”中选择“Pipeline script”。在脚本框中输入以下简单的Pipeline脚本pipeline { agent any // 使用任何可用的代理主节点或Docker动态代理 stages { stage(Hello) { steps { echo Hello, LoongArch Jenkins! sh uname -m // 打印系统架构应该是 loongarch64 sh java -version } } } }点击“保存”。回到任务页面点击“立即构建”。点击构建历史中的构建号再点击“Console Output”查看构建日志。你应该能看到输出的问候语、系统架构loongarch64以及Java版本信息。9. 常见问题与排查思路在龙芯平台部署Jenkins过程中你可能会遇到以下问题问题现象可能原因排查思路与解决方案docker pull镜像失败提示no matching manifestDocker 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’不是loongarch64Pipeline任务被调度到了错误的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. 最佳实践与工程建议镜像管理标签明确为你使用的LoongArch Jenkins镜像打上明确的标签如mycompany/jenkins:lts-loongarch64-2024便于版本追踪。私有仓库将定制好的镜像推送到内部私有镜像仓库如Harbor确保团队内部署环境一致。数据持久化与备份必须使用数据卷切勿将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 .进行简单备份。安全加固最小权限原则不要使用root用户运行Jenkins容器。确保你的镜像以非root用户如jenkins用户运行。谨慎挂载Docker Socket挂载/var/run/docker.sock意味着容器内拥有几乎与宿主机root等同的权限。仅在必要时使用并考虑使用更安全的替代方案如使用Jenkins的SSH Agent或Kubernetes集群。网络隔离使用自定义Docker网络如jenkins-network避免容器暴露在默认的桥接网络。更新与漏洞扫描定期更新Jenkins本体、插件以及基础镜像以修复安全漏洞。性能与稳定性资源限制为Jenkins容器设置合理的CPU和内存限制 (--cpus,-m)防止其耗尽宿主机资源。日志轮转配置Docker的日志驱动和大小限制如本文3.2节防止日志占满磁盘。插件清理定期审查并卸载不使用的插件减少升级冲突和内存占用。配置即代码JCasC对于生产环境建议使用Jenkins Configuration as Code插件。将系统配置、插件安装、凭据管理等全部通过YAML文件定义实现配置的版本化管理、一键部署和快速恢复。在龙芯3B6000平台上通过Docker部署Jenkins核心挑战在于基础镜像的架构适配。一旦解决了镜像问题后续的部署、配置和使用流程与x86平台并无本质差异。本文提供了从寻找/构建镜像、安装Docker、运行容器、初始化配置到排错和最佳实践的完整路径。希望这份指南能帮助你在自主可控的硬件平台上顺利搭建起高效、稳定的自动化构建与部署流水线为你的软件开发流程注入持续集成的强大动力。如果在实践中遇到新的问题欢迎在社区中交流分享共同丰富LoongArch的软件生态。