• 利用Docker快速安装Jenkins


    前提自己先安装好Docker

    CentOS安装Docker以及常用命令

    官方文档https://www.jenkins.io/doc/book/installing/docker/

    将之前的3篇内容来哦快速安装整合

    使用Docker Hub 存储库中推荐的官方jenkins/jenkins镜像。此映像包含Jenkins 当前的长期支持 (LTS) 版本,该版本已做好生产准备。但是,该映像不包含 Docker CLI,并且未与常用的 Blue Ocean 插件及其功能捆绑在一起。

    1.在Docker中创建桥接网络

    docker network create jenkins
    
    • 1

    Docker 网络是一种用于连接 Docker 容器的虚拟网络。这允许容器之间进行通信,同时也能与外部网络进行交互。

    应用场景:

    容器通信: 当你有多个容器需要相互通信时,可以将它们连接到同一个 Docker 网络。通过创建一个专用的网络,容器可以使用容器名称进行通信,而无需暴露真实的 IP 地址。

    docker network create mynetwork
    docker run --name container1 --network mynetwork myimage
    docker run --name container2 --network mynetwork myimage
    
    • 1
    • 2
    • 3

    外部访问控制: 通过将容器连接到特定网络,你可以更好地控制哪些容器可以与外部进行通信,哪些容器被隔离在内部网络中。

    docker network create internal
    docker network create external
    
    # 内部容器
    docker run --name internal-container --network internal internal-image
    
    # 外部容器
    docker run --name external-container --network external -p 8080:80 external-image
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.在宿主机上创建文件夹

    # 创建Jenkins目录文件夹
    mkdir -p /var/jenkins_home
    # 设置权限
    chmod 777 -R /var/jenkins_home
    
    mkdir -p /certs/client
    chmod 777 -R /certs/client
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    用于卷挂载在容器中保留 Jenkins 数据,以便在容器重新启动时保留 Jenkins 的配置和状态。

    通过将宿主机上的目录挂载到容器中,容器内的数据可以持久化存储在主机上。

    这种做法对于一些需要保存状态的应用程序(比如数据库、持久化存储配置的应用程序等)非常常见,因为容器本身是临时的,挂载卷可以确保数据的持久性和在容器之间的共享。

    --volume /var/jenkins_home:/var/jenkins_home 选项在你的 Docker 命令中表示将主机上的 /var/jenkins_home 目录挂载到容器内部/var/jenkins_home 目录,用于存储 Jenkins 的数据和配置。

    3.实现在Jenkins Docker节点内执行Docker命令

    # 拉取 Docker in Docker 镜像
    docker image pull docker:dind
    # 启动一个名为 jenkins-docker 的容器,该容器包含 Docker in Docker。
    # 该容器与 Jenkins 容器共享网络,并设置了一些环境变量和卷,以便在 Jenkins 中连接到 Docker。
    docker run --name jenkins-docker --rm --detach \
      --privileged --network jenkins --network-alias docker \
      --env DOCKER_TLS_CERTDIR=/certs \
      --volume /certs/client:/certs/client \
      --volume /var/jenkins_home:/var/jenkins_home \
      --publish 2376:2376 \
      docker:dind --storage-driver overlay2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • --name jenkins-docker:给容器指定一个名称为 jenkins-docker
    • --rm:当容器停止运行时,自动删除容器。
    • --detach:在后台运行容器。
    • --privileged:授予容器特权,允许它在其中运行 Docker 容器。
    • --network jenkins:将容器连接到名为 jenkins 的 Docker 网络。
    • --network-alias docker:为容器指定一个网络别名为 docker,这样 Jenkins 容器可以使用这个别名连接到这个容器。
    • --env DOCKER_TLS_CERTDIR=/certs:设置容器中 Docker 引擎 TLS 证书的目录。
    • --volume /certs/client:/certs/client:将主机上的目录 /certs/client 挂载到容器内部的 /certs/client,用于存储 TLS 证书。
    • --volume /var/jenkins_home:/var/jenkins_home:将主机上的目录 /var/jenkins_home 挂载到容器内部的 /var/jenkins_home,用于持久化存储 Jenkins 的数据和配置。
    • --publish 2376:2376:将容器的 2376 端口映射到主机的 2376 端口,这是 Docker 守护进程的 TLS 端口。
    • docker:dind:使用的 Docker in Docker 镜像。
    • --storage-driver overlay2:指定 Docker 存储驱动为 overlay2。

    docker:dind 是 Docker in Docker(DinD)的缩写,它是一个特殊的 Docker 镜像,设计用于在容器内运行 Docker 守护进程。这允许你在容器内部执行 Docker 命令,并且该容器本身具有运行其他容器的能力,实现了在容器中运行 Docker 的特性。

    Docker in Docker 镜像通常用于 CI/CD(持续集成/持续部署)流水线中,其中构建和测试需要在 Docker 容器中进行。通过在容器中运行 Docker 引擎,你可以方便地创建、启动和管理其他容器,实现更灵活的构建和测试环境。

    4.定制官方Jenkins Docker 镜像

    创建一个Dockerfile文件

    更改了阿里云源的版本

    # 使用了 jenkins/jenkins:2.440.1-jdk17 作为基础镜像
    # 这是 Jenkins 官方提供的基于 OpenJDK 17 的 Jenkins 镜像。FROM 关键字用于指定基础镜像。
    FROM jenkins/jenkins:2.440.1-jdk17
    # 切换用户到 root:
    USER root
    
    # 安装 lsb-release(Debian 系统中的包)和 curl
    # 使用 apt-get 更新包列表并安装 lsb-release。
    RUN apt-get update && apt-get install -y lsb-release curl
    
    # 下载 Docker GPG 密钥
    RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc https://mirrors.aliyun.com/docker-ce/linux/debian/gpg
    
    # 设置 Docker APT 源:
    # 使用阿里云的源,可以根据需要选择其他镜像源
    RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.asc] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
    
    # 安装 Docker CLI
    RUN apt-get update && apt-get install -y docker-ce-cli
    
    #将用户切换回 jenkins 用户
    # USER jenkins
    # 安装 Jenkins 插件
    # 使用 jenkins-plugin-cli 工具安装 Jenkins 插件,包括 "blueocean" 和 "docker-workflow"
    # RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    blueocean docker-workflow 这2个插件也可以启动jenkins后再安装。

    这是官网命令

    FROM jenkins/jenkins:2.440.1-jdk17
    USER root
    RUN apt-get update && apt-get install -y lsb-release
    RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
      https://download.docker.com/linux/debian/gpg
    RUN echo "deb [arch=$(dpkg --print-architecture) \
      signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
      https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
    RUN apt-get update && apt-get install -y docker-ce-cli
    USER jenkins
    RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    构建docker镜像

    从该 Dockerfile 构建一个新的 docker镜像,镜像名称为“laker-jenkins”:

    docker build -t laker-jenkins .
    
    • 1

    5.运行定制镜像

    docker run --name jenkins-laker-docker --detach \
      --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
      --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
      --publish 8080:8080 --publish 50000:50000 \
      --volume /var/jenkins_home:/var/jenkins_home \
      --volume /certs/client:/certs/client:ro \
      laker-jenkins
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    --name jenkins-laker-docker

    • 指定容器的名称为 jenkins-laker-docker

    --detach

    • 让容器在后台运行(detached 模式)。

    --network jenkins

    • 将容器连接到名为 jenkins 的 Docker 网络。这是为了确保 Jenkins 容器和之前提到的 Docker in Docker 容器可以相互通信。

    --env DOCKER_HOST=tcp://docker:2376

    • 设置环境变量 DOCKER_HOST,指定 Docker 客户端连接的 Docker 守护进程地址。这里使用了 Docker in Docker 容器的别名 docker 和端口 2376

    --env DOCKER_CERT_PATH=/certs/client

    • 设置环境变量 DOCKER_CERT_PATH,指定 Docker TLS 证书的路径。

    --env DOCKER_TLS_VERIFY=1

    • 设置环境变量 DOCKER_TLS_VERIFY,启用 Docker 客户端的 TLS 验证。

    --publish 8080:8080

    • 将 Jenkins 容器的 8080 端口映射到主机的 8080 端口,使得可以通过主机的 8080 端口访问 Jenkins Web UI。

    --publish 50000:50000

    • 将 Jenkins 容器的 50000 端口映射到主机的 50000 端口,这是 Jenkins 使用的 Agent 的通信端口。

    --volume /var/jenkins_home:/var/jenkins_home

    • 将主机上的 /var/jenkins_home 目录挂载到容器内部的 /var/jenkins_home,用于持久化存储 Jenkins 数据和配置。

    --volume /certs/client:/certs/client:ro

    • 将主机上的 /certs/client 目录挂载到容器内部的 /certs/client,用于存储 Docker TLS 证书。:ro 表示挂载为只读,以增加安全性。

    laker-jenkins

    • 指定要运行的镜像,这里假设你之前使用 docker build 命令构建了一个名为 laker-jenkins 的 Jenkins 镜像。

    查看docker容器日志,看是否启动成功。

    docker ps -a
    docker logs jenkins-laker-docker
    
    • 1
    • 2

    6.浏览器访问Jenkins

    在浏览器访问:http://localhost:8080

    7.获取管理员密码

    查看initialAdminPassword文件,把密码输入登录中的密码即可,开始使用。

    cat /var/jenkins_home/secrets/initialAdminPassword
    
    • 1

    登录进去后,安装插件这里先别选,先配置插件镜像加速,否则下载太慢。

    8.配置插件镜像加速

    vi /var/jenkins_home/hudson.model.UpdateCenter.xml
    
    • 1

    将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

    保存后,重启jenkins-laker-docker实例。

    docker restart jenkins-laker-docker
    
    • 1

    9.新建Jenkins任务

    在企业环境中,常见的 Jenkins 任务类型取决于具体的 CI/CD需求和项目特点,请根据你的具体情况选择最适合的类型:

    自由风格项目(Freestyle Project):

    • 适用场景:
      • 适用于灵活性较高的项目,例如构建简单的代码库、运行测试、打包发布等。
      • 对于小型项目或需要手动触发的任务,自由风格项目可能是更简单的选择。

    流水线项目(Pipeline):

    • 适用场景:
      • 复杂的 CI/CD 流程,包括构建、测试、部署等多个阶段。
      • 需要可维护、可版本控制的构建脚本。
    • 优势:
      • 可以将整个 CI/CD 流程定义为代码,易于版本控制和维护。
      • 支持流程中断、并行执行等高级特性。

    多分支流水线(Multibranch Pipeline):

    • 适用场景:
      • 项目有多个分支,每个分支可能有不同的构建和部署要求。
      • 自动化创建和管理分支对应的流水线。
    • 优势:
      • 自动创建分支对应的流水线,减少手动配置工作。

    GitHub 分支源(GitHub Branch Source):

    • 适用场景:
      • 项目使用 GitHub 作为版本控制,并有多个分支。
      • 想要通过 GitHub 仓库中的事件自动触发 Jenkins 流水线。
    • 优势:
      • 自动创建和管理 GitHub 仓库中的分支对应的流水线。

    构建其他项目(Build Other Projects):

    • 适用场景:
      • 有多个项目之间存在依赖关系,构建完成一个项目后需要触发其他项目的构建。
      • 设置项目间的构建顺序和依赖关系。
    • 优势:
      • 管理项目之间的依赖关系,实现自动触发构建。

    多配置项目(Multi-configuration Project):

    • 适用场景:
      • 需要在不同的配置下进行构建和测试。
      • 例如,支持多个操作系统、不同版本的依赖库等。
    • 优势:
      • 支持并行构建多个配置,提高构建效率。

    构建 Maven 项目(Maven Project):

    • 适用场景:
      • 项目使用 Maven 进行构建。
    • 优势:
      • 集成 Maven 构建的相关功能,方便 Maven 项目的构建和部署。

    以上类型并非互斥,可以根据实际需求组合使用。例如,可以在主项目中使用多分支流水线,同时使用构建其他项目触发子项目的构建。在选择时,考虑项目结构、团队熟悉度、自动触发需求等方面。

    流水线任务

    先根据用Docker Compose启动依赖的Mysql Redis章节,安装相关依赖中间件。

    这里以比较常用的流水线任务举例。例子内容为部署https://gitee.com/lakernote/easy-admin开源项目。

    pipeline {
        agent any
        stages {
            stage('Back-end') {
                agent {
                    docker { 
                        image 'maven:3.9.6-eclipse-temurin-8-alpine' 
                        args '-v $HOME/.m2:/root/.m2'
                    }
                }
                steps {
                     // 从Gitee仓库获取代码
                    git 'https://gitee.com/lakernote/easy-admin.git'  
                    sh 'mvn --version'
                    sh 'mvn clean install'
                     // 将构建产物存储到一个命名为 'backend-build' 的存储区域
                    stash name: 'backend-build', includes: 'target/*.jar,Dockerfile,web/**/*'
                }
            }
            
           stage('Start') {
       		   // 定义并使用 JDK 工具
       		  	// tools {
            		// 前提在jenkins全局配置中 定义 JDK 工具的名称和版本
            		//	jdk 'jdk8'
    
            		// 或者使用默认的 JDK
            		// jdk 'default'
               	//}
               steps {
                    // 恢复构建产物,路径相对于工作目录
                    unstash 'backend-build'
                    
                    sh "echo 'Running Java version'"
                    sh "java -version"
                    // 执行 Java 项目的 JAR 文件
                    sh "nohup java -jar target/easyAdmin.jar &"
                }        
            }
            
            stage('Front-end') {
                agent {
                    docker { image 'node:20.11.1-alpine3.19' }
                }
                steps {
                    sh 'node --version'
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 镜像
      • maven:3.9.6-eclipse-temurin-17-alpine JDK17
      • maven:3.9.6-eclipse-temurin-8-alpine JDK8

    扩展:用Docker Compose启动依赖的Mysql Redis

    在 Linux 上安装 Docker Compose

    下载 Docker Compose:

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    • 1

    授予执行权限:

    sudo chmod +x /usr/local/bin/docker-compose
    
    • 1

    验证安装:

    docker-compose --version
    
    • 1

    如果你已经安装好了 Docker Compose,但在执行时遇到问题,可能有一些原因导致。以下是一些建议:

    确认路径是否在系统的 PATH 中: 确保 /usr/local/bin 在你的系统 PATH 环境变量中。这样,系统才能找到 docker-compose 命令。你可以运行以下命令检查:

    echo $PATH
    
    • 1

    如果没有包含 /usr/local/bin,可以将其添加到 PATH 中。在你的 shell 配置文件(例如 ~/.bashrc~/.zshrc)中添加以下行:

    export PATH="/usr/local/bin:$PATH"
    
    • 1

    然后重新加载配置文件或打开一个新的终端窗口。

    docker-compose.yml

    使用Docker Compose来定义和管理多个容器的服务,包括MySQL、Redis等,并确保它们在同一个网络中以便相互通信。

    docker-compose.yml

    version: '3'
    
    services:
      mysql:
        image: mysql:5.7
        container_name: mysql
        environment:
          MYSQL_ROOT_PASSWORD: "123456"
          MYSQL_DATABASE: "laker"
          MYSQL_USER: "laker"
          MYSQL_PASSWORD: "123456"
        ports:
          - "3306:3306"
        networks:
          - jenkins # 上面定义的网络
        volumes:
          - /mysql-data:/var/lib/mysql # 持久化存储到宿主机
          
      redis:
        image: redis:latest
        container_name: redis
        ports:
          - "6379:6379"
        networks:
          - jenkins # 上面定义的网络
          
    networks:
      jenkins:
        external: true # 声明了 jenkins 网络是一个外部网络,也就是已经存在的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    mkdir -p /mysql-data
    chmod 777 -R /mysql-data

    运行以下命令启动 Docker Compose 服务:

    docker-compose up -d
    
    • 1
  • 相关阅读:
    在字节跳动和拼多多干了5年测试,熬夜总结出来的划水经验....
    面试题常考:LRU缓存
    GO学习之切片操作
    驱动制造业产业升级新思路的领域知识网络,什么来头?
    Linux: 进程(控制)
    学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计 汉语言文学设计题材网页
    快手如何快速的进行引流,并且推荐几款我正在用的工具。
    map和set底层实现【C++】
    SuperMap iServer 许可切换
    linux高级篇基础理论五(用户安全,口令设置,JR暴力破解用户密码,NMAP端口扫描)
  • 原文地址:https://blog.csdn.net/abu935009066/article/details/136450091