通过 Docker 在树莓派上搭建 Jenkins,解决官方镜像无法在树莓派上运行的问题

关于 CI/CD

在工作中,每家公司都会有 CI/CD,只是完善度、成熟度不同,大公司会自建和各个系统集成,形成很完善的 CI/CD 流程,小公司可能本着够用就好的心态,从无到有,在一次次的故障中不断完善。

CI/CD是一种持续集成/持续交付的流程,它的目的是让软件开发团队能够更快、更可靠地交付高质量的软件。以下是为什么在工程中需要CI/CD的原因:

  1. 提高开发效率:CI/CD在代码提交后自动构建和测试,减少了手动操作和等待时间,提高了开发效率。
  2. 更快速地部署:CI/CD可以自动化部署到不同环境,从而加快应用程序发布速度。
  3. 更好的可靠性和质量:CI/CD通过自动化测试,可以更早地发现并纠正错误,从而提高了软件质量和可靠性。
  4. 更好的团队协作:CI/CD可以帮助团队成员协作并共享代码库、文档等资源。
  5. 更好的版本控制管理:CI/CD可以对版本进行跟踪和管理,并保证每个版本都经过了自动化测试和审查。

CI/CD 工具主要有 Jenkins、GitLab CI、Travis CI 等。它们可以与版本控制工具(如 Git)和容器技术(如 Docker)结合使用,实现快速迭代和高效交付。

由于我们不是使用云服务,是在树莓派做 CI/CD,那么 Jenkins 是最合适的选择。

Jenkins 简介

Jenkins是一个自动化的开源工具,用于构建,测试和部署软件项目。它基于Java编写,并可通过插件扩展以支持各种不同的工具和技术。Jenkins可以自动化构建、测试、部署和监控软件项目,并提供了丰富的插件生态系统,使其可以与各种不同的工具和服务集成。Jenkins是一个非常流行的CI/CD工具,被广泛用于DevOps实践中。

引入 Jenkins 原因

之前文章  如何在一个机箱中使用 8 台树莓派、2 个路由器、5 个风扇、2 个插板和 6 个硬盘,构建一个高效的集群?中,我们搭建了树莓派集群, 部署了 k3s 利用 3个树莓派搭建一个k3s 集群,并且在 Mac 上用 k3sup管理 , 那么在有这么多机器的情况下,如何让工作更加自动化,这就是引入 Jenkins 的原因。

希望以后开发的代码,可以通过 Jenkins 做自动化打包,自动化发布,从而节省时间,用于做有意义的事情。

环境准备

1. 安装DockerDocker-compose

用 Docker 部署 Jenkins 是最方便的,所以在此之前,我们需要在树莓派上安装 Docker ,这个内容在之前的文章 中有介绍,如果需要请移步这篇文章:对开发者友好的树莓派系统配置

如果你已经装好了DockerDocker-compose,那么可以继续往下看。

2. 构建树莓派可用的 Jenkins 镜像

如果你想用现成的,可以直接 clone 我的工程
GitHub - camelgeek/raspi-jenkins-docker: 用于树莓派上的 Jenkins Docker 镜像


正常情况下,我们通过sudo docker pull jenkins/jenkins就可以拉取到镜像,这在其他平台上确实没有问题,但是在树莓派(4B)上会报错
image.png
意思是不支持linux/arm/v8, 这就不好意思了,Jenkins 官方镜像不支持直接在树莓派上跑。
如果你在网上找教程,可能找到的都比较老,也可能会提供一个较老的镜像。但是如果我们想装最新的 Jenkins,那么就很难按网上的教程实现,这里我教大家从头编译一个镜像,这也是这部分内容的价值

(1)找到 Jenkins官方 GitHub

GitHub - jenkinsci/docker: Docker official jenkins repo
如果你有实力,直接在树莓派上编译即可。下面我会挑出有用的文件,重新组成一个工程,这样只编译这个小工程就可以了。

(2)找到 Dockerfile 文件

在工程的首页,我们看到有 1117两个文件夹,它们代表 Java 的版本,是jdk11jdk17, 那么我们选择11
image.png
因为树莓派官方系统是基于debian的,所以依次往下选,会看到Dockerfile文件
image.png

(3) 在树莓派上创建工程

在树莓派上创建一个目录,比如叫raspi-docker, 用命令
sudo mkdir raspi-docker
然后创建子目录services/jenkins, 在里面添加Dockerfile文件

cd raspi-docker
sudo mkdir -p services/jenkins
sudo touch Dockerfile
(4) 将 第(2)步的 Dockerfile 文件内容复制到第(3)步创建的Dockerfile文件中

复制之后,用命令sudo vim Dockerfile打开,粘贴,:wq保存

(5)Docker build,排错

有了 Dockerfile,我们可以直接 Build,出错了再依次解决

sudo docker build -t raspi-jenkins:2023041301 .

/instal-plugins.sh 找不到
错误如下:
image.png

我们在 Docker 的 GitHub 上,可以看到根目录有instal-plugins.sh 文件
image.png

将这个文件也拷贝到services/jenkins目录。
接下来,还会遇到一些错误,比如下面的:
image
image.png
sudo docker images
image.png
image.png

根据上面的 3 个提示,依次还有jenkins-plugin-cli.sh,jenkins.sh,jenkins-support这 3 个文件找不到,很幸运,这3个文件都在 Github 的根目录,把他们拷贝到services/jenkins目录。
然后再次sudo docker build -t raspi-jenkins:2023041301 . 这回没有报错

不过因为网络原因,会很慢,等好久之后可以看到成功了。
image.png

3. 还有一个可执行权限问题

按照上面的步骤,本来以为成功了,但是还是太年轻了,在后面启动容器的时候,还会报一个错。
image.png
主要是 jenins.sh权限问题。用以下命令可以解决:

sudo chmod +x jenkins.sh

现在重新 Build 镜像,你就可以得到一个树莓派可用的镜像了。

使用Docker-compose 安装 Jenkins

raspi-docker目录,创建一个docker-compose.yml文件,内容如下:

version: '3'
services:
   jenkins:
       build:
           context: ./services/jenkins
           dockerfile: Dockerfile
       restart: always
       environment:
           JAVA_OPTS: -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Shanghai
       networks:
           - node-network
       ports:
           - "50000:50000"
           - "9001:8080"
       volumes:
           - ./app/jenkins:/var/jenkins_home

networks:
   node-network:
       driver: bridge
  • build 部分指示 Docker 在 ./services/jenkins 目录下查找 Dockerfile 文件来构建服务镜像。
  • restart 部分指示 Docker 总是重启 Jenkins 服务,无论是否发生故障或 Docker 守护进程是否在启动时启用了重启策略。
  • environment 部分提供在 Jenkins 容器中设置的环境变量,这里 JAVA_OPTS 环境变量在 Jenkins 中配置 Asia/Shanghai 时区。这个很重要,可以保证 Jenkins 的时间是对的
  • networks 部分定义容器使用的网络,这里定义了名称为 node-network 的自定义网络,默认为 bridge 驱动。
  • ports 部分映射 Jenkins 服务容器的端口到主机上的端口,并允许从浏览器使用 9001 访问 Jenkins 界面。
  • volumes 部分指定容器要挂载的目录,将 Jenkins 数据卷映射到位于主机的 ./app/jenkins 目录。

最后,在 networks 段中定义 node-network 网络。该网络驱动程序使用了 Docker 默认的 Network Bridge 驱动程序。

从上面配置来看,我们需要新建一个app/jenkins目录,用于将 Jenkins 的内容挂载到这里。

sudo mkdir app/jenkins

至此,Docker-compose 配置完成,可以用sudo docker-compose up -d命令启动。

Jenkins 初始化配置

在浏览器输入http://ip:9001(ip 替换成你树莓派的)
然后看到了如下页面:
image.png
此时需要一个管理员密码,在文件/var/jenkins_home/secrets/initialAdminPassword, 这个目录是 docker 镜像中的目录,我们配置过Volume,所以我们在/app/jenkinssecrets/initialAdminPassword 就能找到。
输入之后,这个文件会被删除,然后进入以下插件安装界面。关于插件安装,后面再写一篇文章介绍吧,这里选择安装推荐的插件

image.png

选完之后,进入插件安装阶段,等待片刻。
image.png
出现了创建用户的界面,这个用户创建完就是 Jenkins 的管理员。
image.png
完成之后,进入首页,我们创建一个 job,试一下。点击Create a job

image.png
输入名称test, 选择Freestyle project
image.png

之后会进入配置页面,我们划到下面,添加一个 shell ,我们只写pwdls测试。
image.png
保存 应用 之后,可以立即构建
image.png
可以看到构建完成,时间也是对的。
image.png

致辞在树莓派上搭建完成了 Jenkins。

从此自动化的大门打开了。


已发布

分类

作者:

标签

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注