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语法
相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜7 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB8 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207010 天前
如何搭建本地yum源(上)
运维
大树8813 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质13 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务