CICD:jenkins pipeline搭建项目流水线,遇到的问题和方案

文章目录

  • [1. 下载镜像](#1. 下载镜像)
  • [2. docker compose 启动jenkins容器](#2. docker compose 启动jenkins容器)
  • [3. jenkins登录、配置密钥等](#3. jenkins登录、配置密钥等)
  • [4. 制作项目 pipeline 流水线](#4. 制作项目 pipeline 流水线)
    • [4.1 jenkins基础配置](#4.1 jenkins基础配置)
    • [4.2 新建项目](#4.2 新建项目)
    • [4.3 配置项目 pipeline](#4.3 配置项目 pipeline)
      • [①:配置自动构建触发器(代码推送后自动构建 - 按需选配)](#①:配置自动构建触发器(代码推送后自动构建 - 按需选配))
      • [①:配置 pipeline](#①:配置 pipeline)
  • [5. 一步一坑](#5. 一步一坑)
    • [①:docker build时报错 docker: not found](#①:docker build时报错 docker: not found)
    • [②:还未进入流水线代码时,就报错:stderr: fatal: not in a git directory](#②:还未进入流水线代码时,就报错:stderr: fatal: not in a git directory)
    • [③:进入流水线docker build报错: dial unix /var/run/docker.sock: connect: permission denied](#③:进入流水线docker build报错: dial unix /var/run/docker.sock: connect: permission denied)
    • [④:缺少BuildKit :ERROR: BuildKit is enabled but the buildx component iss missing or broken.](#④:缺少BuildKit :ERROR: BuildKit is enabled but the buildx component iss missing or broken.)

1. 下载镜像

略

2. docker compose 启动jenkins容器

略

3. jenkins登录、配置密钥等

略

4. 制作项目 pipeline 流水线

4.1 jenkins基础配置

在新建项目之前,需要配置一下jenkins的基础配置,用于jenkins脚本、或者流水线语法中的变量引用

①:配置git仓库连接

②:添加全局凭证

全局凭证的作用:提前设置一些变量,用于jenkins中要执行的脚本、pipeline语法中变量引用,我这边设置了四个全局凭证

  1. gitee拉取代码的私人令牌
  2. gitee的登陆账号密码
  3. 腾讯云镜像仓库 登录账号密码(如果没有推送远程仓库的需求,这个可以不要)
  4. 部署服务器的SSH密钥

入口:Manage Jenkins > Credentials > System > Global credentials (unrestricted)

4.2 新建项目

点击创建之后,主页面视图中会出现一个待配置的流水线

4.3 配置项目 pipeline

点击 go-vue-admin-server 项目,进行项目配置,进入配置后,会自动适配之前在System中配置的 配置git仓库连接

①:配置自动构建触发器(代码推送后自动构建 - 按需选配)

如果想要代码推送到gitee后,jenkins自动执行代码构建,则需要配置构建触发器,打通 jenkins与 gitee 的连接

有了地址,还需要jenkins生成一个针对这个地址的密钥

gitee配置钩子

①:配置 pipeline

pipeline的配置方式有两种 ,这里我选择Pipeline script from SCM

  • Pipeline script:允许用户在Jenkins项目的配置界面中直接编写流水线脚本,修改脚本需要进入Jenkins项目配置界面,对脚本进行编辑。
  • Pipeline script from SCM:这种方式允许Jenkins从源代码管理(如Git、SVN等)中获取流水线脚本。通常,脚本文件名为Jenkinsfile,并存储在代码仓库的根目录或指定路径。流水线脚本与代码一起版本化,可以跟踪变更历史,方便回滚和协作,可以像管理代码一样管理流水线脚本,包括代码审查、自动化测试等。

5. 一步一坑

①:docker build时报错 docker: not found

  • 原因 :因为我的jenkins是docker容器启动的,这个报错是因为jenkins容器内部,并没有 docker环境,此时docker exec 进入jenkins容器内部,输入docker -v,是无法正确打印出docker版本号的!

  • 解决方式:使jenkins容器内部拥有容器环境!可以在启动jenkins容器时,挂载上宿主机的容器环境,修改docker-compose 如下

    java 复制代码
    version: "3.3"
    services:
      jenkins:
        image: jenkins/jenkins:jdk17
        container_name: jenkins-jdk17
        privileged: true  # 赋予容器内部特权
        restart: unless-stopped
        user: "1000:1000"  # 明确指定用户
        group_add:
          - "990"  # 关键:添加宿主机 docker 组的 GID
        environment:
          TZ: 'Asia/Shanghai'
        ports:
          - 18080:8080
          - 50000:50000
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock  # 挂载宿主机docker守护进程
          - /usr/bin/docker:/usr/bin/docker   # 挂载宿主机docker cli
          - /opt/jenkins-docker/jenkins_home:/var/jenkins_home

    解释:

    • Docker CLI 缺失 :Jenkins 镜像本身不包含 docker客户端命令,需要挂载宿主机的docker cli - /usr/bin/docker:/usr/bin/docker
    • Docker Daemon 不可达 :容器内无法连接到宿主机的 Docker 守护进程,需要挂载宿主机的守护进程 - /var/run/docker.sock:/var/run/docker.sock
    • 权限不足 :容器用户无权访问宿主机 Docker,需要赋予特权,检查容器内部和宿主机是否在一个用户组内,如不在需要添加进一个组
      • user: "1000:1000" # 明确指定容器内部用户

      • group_add:
        - "990" # 关键:添加宿主机 docker 组的 GID

        java 复制代码
        // 宿主机 docker 的 用户是root,位于docker组
        [root@my-tecent jenkins-docker]# ls -la /var/run/docker.sock
        srw-rw---- 1 root docker 0 Dec  4 20:22 /var/run/docker.sock
        // docker组id是 990
        [root@my-tecent jenkins-docker]# getent group docker
        docker:x:990:
        java 复制代码
        // 容器内部的用户是jenkins
        [root@my-tecent jenkins-docker]# docker exec -it jenkins-jdk17 bash
        jenkins@4cf8be6380d8:/$ whoami
        jenkins
        // id是1000,所属组是 1000,990(包含990是因为此处我已经使用上文的配置重启过)
        jenkins@4cf8be6380d8:/$ id
        uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins),990
        // 容器内部的docker已经和宿主机的组id一致
        jenkins@4cf8be6380d8:/$  ls -la /var/run/docker.sock
        srw-rw---- 1 root 990 0 Dec  4 20:22 /var/run/docker.sock

按照上述配置docker compose后重启jenkins,实测不会报这个错误了!

②:还未进入流水线代码时,就报错:stderr: fatal: not in a git directory

  • 原因 :这个报错因为还没有进入流水线代码, 是gitee触发器报的错误:两次连接到gitee的用户不同导致的,因为我在测试docker compose的时候第一次没有指定 user,第二次为了赋予容器内部docker的操作权限,使用了 user: root 去指定容器内部用户,触发了gitee的报错
  • 解决方案 :取消docker compose中的 user: root 配置,这样就会遇到流水线报下面的错误: dial unix /var/run/docker.sock: connect: permission denied,用第一个坑的解决方案即可

③:进入流水线docker build报错: dial unix /var/run/docker.sock: connect: permission denied

  • 原因:容器内部的用户无docker的操作权限,把他们放置到同一个组内即可解决
  • 解决方案:参考第一个坑的解决方案即可

④:缺少BuildKit :ERROR: BuildKit is enabled but the buildx component iss missing or broken.

  • 原因 :流水线构建项目的时候用了BuildKit
  • 解决方案 :暂时不用BuildKit,把BuildKit对应的语法转换成正常的docker语法
相关推荐
时间售卖铺7 分钟前
Oracle DQL精髓:从基础到高级实战
运维·数据库·云原生·oracle
分布式存储与RustFS14 分钟前
CI 老被 Docker Hub 的 429 卡住,自建 Registry 把镜像搬进内网
运维·docker·开源·镜像仓库·对象存储·ci·rustfs
Ruiery19 分钟前
Linux 6.6内核内存管理深度解析(十七):vmalloc — 内核要“虚拟连续“就够:物理页逐个凑,页表来连
linux·运维·服务器
pt104321 分钟前
Cisco设备网络安全系列-19:网络安全事件驱动与调整
运维·网络
sxgzzn26 分钟前
如何利用无人机提升光伏巡检效率?
运维·重构·无人机·开关柜局放在线监测·光伏运维管理系统
R²AIN SUITE44 分钟前
企业智能体平台私有化部署需要什么服务器?CPU、内存、显卡与项目管理集成的7个评估项
运维·服务器
刚入门的大一新生1 小时前
Linux-线程封装
linux·运维·服务器
n112121 小时前
Docker 容器时区错 8 小时:3 个坑
运维·docker·容器·故障排查·服务器运维·容器时区
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_dump_format调用流程与实战(十一)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之avcodec_find_decoder调用流程与实战(十二)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶