Jenkins Docker Cloud在Linux应用开发CI中的实践

Jenkins Docker Cloud在Linux应用开发CI中的实践

背景

通过代码提交自动触发CI自动构建、编译、打包是任何软件开发组织必不可少的基建,可以最大程度保证产物的一致性,方便跨组跨部门协作,代码MR等。

Docker在流水线中越来越重要,已经是最关键的组成部件之一,由于容器化具有的简单性,灵活性,隔离性和部署方便的特性,使得我们可以按需定制可重复的构建环境,本文就如何使用Docker容器作为Jenkins编译节点在Linux应用开发 CI中进行了实践。

前提条件

已部署好Jenkins服务,具备CI的基础设施。

技术方案

有别于windows,macos,ios可能较多会采用虚拟机或物理机方式部署编译节点,linux 采用 docker作为编译节点,容器化方式环境隔离性好,自动容器启动与关闭,环境部署方便,较虚拟机和物理机部署更节省人力时间成本。

工作流程:

  • Jenkins master发起pipeline流程
  • 通过Remote API去连接Docker Host
  • Docker Host拉起需要的容器,作为Jenkins slave
  • 容器中执行流水线工作
  • 流水线完成,Jenkins会停止并删除容器

ps: Jenkins master 节点只负责调控,具体的构建任务下放到Docker Slave节点中去

Jenkins docker slave node配置实践

1、 Jenkins 安装docker插件

安装完成后配置页面会生成Configure Clouds
路径:Jenkins - Manage Jenkins - System Configuration - Manage Nodes and Clouds

2、 docker host配置

2.1、 doker安装
复制代码
sudo apt update
sudo apt upgrade
sudo apt install docker.io
2.2、安装自定义docker镜像
  • 可以采用Dockerfile自动构建镜像,也可以手动构建,此处假定已经构建好镜像并导出:linux_x86_64_node.tar

  • 导入镜像:

    sudo docker load < linux_x86_64_node.tar

    sudo docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    linux_x86_64_node latest f2cded8e78d6 30 minutes ago 3.19GB

2.3、启用docker Remote API
  • 本地环境下,docker客户端(各种docker命令)默认通过unix域socket与docker daemon通信,但我们的场景需要跨主机访问,即jenkins服务需要访问docker host,因此需要通过配置让docker daemon把服务暴露在tcp的2375端口上,这样就可以在网络上操作docker了。

  • 修改/lib/systemd/system/docker.service,添加tcp支持

  • 修改完毕后执行如下命令使其生效:

    systemctl daemon-reload
    systemctl restart docker.service

3、jenkins docker cloud & agent配置

路径:Jenkins > Manage Jenkins > System Configuration > Manage Nodes and Clouds > Configure Clouds

3.1、 配置docker cloud
3.2、配置docker agent

4、 jenkins查看docker容器和镜像

路径:Jenkins > Manage Jenkins > Uncategorized > Docker

此处会列出远程docker host上所有运行的容器和安装的镜像,如下:

值得注意的是,jenkins通过Remote API启动docker容器时会进行SSH端口映射,将SSH端口22进行映射,如上图所示,将docker agent(启动的docker容器)的22端口映射为docker host宿主机的端口58255,这样jenkins才能通过ssh访问docker agent, workspace也是建立在docker agent中。

pipeline中使用docker agent

1、 声明式

复制代码
pipeline {
   agent { label 'master' }
   stages {
       stage('Hello') {
           agent { label 'lava_x86_64_node_accelerate' }
           steps {
               sh 'echo Hello World'
           }
       }
   }
}

2、 脚本式

复制代码
pipeline {
    agent { label 'master' }
     stages {
        stage('Hello') {
            steps {
                script {
                    node ("lava_x86_64_node_accelerate") {
                        sh 'echo Hello World'
                    }
                }
            }
        }
    }
}

值得注意的是:上面的"lava_x86_64_node_accelerate"节点就是上文Jenkins docker slave node配置实践 - 3.2、配置docker agent中的labels字段。

补充

整个pipeline流程如下:
gitlab+jenkins CI实践

相关推荐
人生苦短,菜的抠脚6 分钟前
Linux 内核IIO sensor驱动
linux·驱动开发
jz_ddk19 分钟前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux43 分钟前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科1 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望1 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen1 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记2 小时前
PPT宏代码
linux·服务器·powerpoint
mucheni2 小时前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky2 小时前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线2 小时前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb