文章目录[隐藏]
关于 CI/CD
在工作中,每家公司都会有 CI/CD,只是完善度、成熟度不同,大公司会自建和各个系统集成,形成很完善的 CI/CD 流程,小公司可能本着够用就好的心态,从无到有,在一次次的故障中不断完善。
CI/CD是一种持续集成/持续交付的流程,它的目的是让软件开发团队能够更快、更可靠地交付高质量的软件。以下是为什么在工程中需要CI/CD的原因:
- 提高开发效率:CI/CD在代码提交后自动构建和测试,减少了手动操作和等待时间,提高了开发效率。
- 更快速地部署:CI/CD可以自动化部署到不同环境,从而加快应用程序发布速度。
- 更好的可靠性和质量:CI/CD通过自动化测试,可以更早地发现并纠正错误,从而提高了软件质量和可靠性。
- 更好的团队协作:CI/CD可以帮助团队成员协作并共享代码库、文档等资源。
- 更好的版本控制管理: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. 安装Docker
和 Docker-compose
用 Docker 部署 Jenkins 是最方便的,所以在此之前,我们需要在树莓派上安装 Docker ,这个内容在之前的文章 中有介绍,如果需要请移步这篇文章:对开发者友好的树莓派系统配置
如果你已经装好了Docker
和Docker-compose
,那么可以继续往下看。
2. 构建树莓派可用的 Jenkins 镜像
如果你想用现成的,可以直接 clone 我的工程
GitHub - camelgeek/raspi-jenkins-docker: 用于树莓派上的 Jenkins Docker 镜像
正常情况下,我们通过sudo docker pull jenkins/jenkins
就可以拉取到镜像,这在其他平台上确实没有问题,但是在树莓派(4B)上会报错
意思是不支持linux/arm/v8
, 这就不好意思了,Jenkins
官方镜像不支持直接在树莓派上跑。
如果你在网上找教程,可能找到的都比较老,也可能会提供一个较老的镜像。但是如果我们想装最新的 Jenkins,那么就很难按网上的教程实现,这里我教大家从头编译一个镜像,这也是这部分内容的价值。
(1)找到 Jenkins官方 GitHub
GitHub - jenkinsci/docker: Docker official jenkins repo
如果你有实力,直接在树莓派上编译即可。下面我会挑出有用的文件,重新组成一个工程,这样只编译这个小工程就可以了。
(2)找到 Dockerfile 文件
在工程的首页,我们看到有 11
和17
两个文件夹,它们代表 Java 的版本,是jdk11
和jdk17
, 那么我们选择11
因为树莓派官方系统是基于debian
的,所以依次往下选,会看到Dockerfile
文件
(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
找不到
错误如下:
我们在 Docker 的 GitHub 上,可以看到根目录有instal-plugins.sh
文件
将这个文件也拷贝到services/jenkins
目录。
接下来,还会遇到一些错误,比如下面的:
sudo docker images
根据上面的 3 个提示,依次还有jenkins-plugin-cli.sh
,jenkins.sh
,jenkins-support
这 3 个文件找不到,很幸运,这3个文件都在 Github 的根目录,把他们拷贝到services/jenkins
目录。
然后再次sudo docker build -t raspi-jenkins:2023041301 .
这回没有报错
不过因为网络原因,会很慢,等好久之后可以看到成功了。
3. 还有一个可执行权限问题
按照上面的步骤,本来以为成功了,但是还是太年轻了,在后面启动容器的时候,还会报一个错。
主要是 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 替换成你树莓派的)
然后看到了如下页面:
此时需要一个管理员密码,在文件/var/jenkins_home/secrets/initialAdminPassword
, 这个目录是 docker 镜像中的目录,我们配置过Volume
,所以我们在/app/jenkinssecrets/initialAdminPassword
就能找到。
输入之后,这个文件会被删除,然后进入以下插件安装界面。关于插件安装,后面再写一篇文章介绍吧,这里选择安装推荐的插件
。
选完之后,进入插件安装阶段,等待片刻。
出现了创建用户的界面,这个用户创建完就是 Jenkins 的管理员。
完成之后,进入首页,我们创建一个 job,试一下。点击Create a job
输入名称test
, 选择Freestyle project
之后会进入配置页面,我们划到下面,添加一个 shell ,我们只写pwd
和ls
测试。
保存
应用
之后,可以立即构建
可以看到构建完成,时间也是对的。
致辞在树莓派上搭建完成了 Jenkins。
从此自动化的大门打开了。
发表回复