使用 Docker 部署 Jenkins 代理(主从)控制服务器

自动化是 DevOps 的核心。各种自动化工具和技术真正实现了持续集成和持续交付的概念。这些工具多年来发展迅速,但似乎永远存在的一个名字是Jenkins。

我们不会在这篇文章中讨论 CI-CD 的介绍性概念,也不会浪费时间展示 Jenkins 安装步骤。如果您是 Jenkins 的新手,可以查看官方安装文档以开始使用 Jenkins。因此,这篇文章的目的是讨论如何设置 Jenkins 控制器-代理架构(也称为主从架构)并解决执行过程中出现的一些问题。这是因为,这个过程可能很乏味,如果您有一段时间没有这样做,您可能会浪费几个小时。

[为什么选择 Jenkins 控制器-代理架构?

控制器(主)节点是 Jenkin 的大脑,它是 Jenkins 应用程序运行的地方。如果我们在控制器节点上做太多工作(或它崩溃),整个应用程序可能变得不可用。因此,我们希望 master 尽可能可用。这可以通过将工作委托给代理节点(从节点)来完成。因此,在 Jenkins Controller-Agent 架构中,作业由控制器调度并分配给代理。控制器还跟踪从服务器是否在线,检索它们对构建结果的响应,并将构建结果输出到控制台。因此,主节点更可用,因此我们的 Jenkins 服务器的整体性能使用这种设计得到了提高。

图片描述

这种架构的另一个优点是我们只能在控制器节点上安装最少的工具集,而我们可以在代理节点上安装较重的工具(作业需要)。这使控制器保持轻量级,还允许我们根据应执行它们的代理来组织我们的作业。在上面的示例中,我们有一个 Jenkins 控制器和 4 个代理。每个代理都可以用于特定目的。

  • 例如,如果我们需要运行测试并构建基于 javascript 的应用程序的作业,我们可以限制这些作业在最左侧的代理上执行。
  • 同样,如果我们需要构建一些 .NET 应用程序,我们可以使用 Windows 主机设置 Jenkins 代理,并将这些作业限制在最右侧执行。
  • 此外,我们可以根据系统要求平衡负载来提高性能。比方说,我们正在为一个拥有数百个微服务的系统设置 CI-CD,其中使用基于 python 的堆栈编写的服务数量是任何其他堆栈的两倍。在这种情况下,我们可以安装两个基于 python 的工具的 Jenkins 代理,Jenkins 控制器可以平衡这两个代理之间的负载。

设置

第 1 步:启动 Jenkins 控制器(主)容器

我们可以使用官方的 jenkins docker 容器。这是您可以使用的示例 docker-compose 文件。

version: '3.8'

services:
  jenkins_controller:
    image: jenkins/jenkins:lts-jdk11
    privileged: true
    user: root
    container_name: $CONTAINER_NAME
    ports:
      - 50001:8080
      - 50002:50000
    volumes:
      - $JENKINS_HOME:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock

现在,我们需要启动容器,并且需要为 Jenkins 控制器节点安装所需的工具。我们可以编写一个简单的 bash 脚本来实现这一点。

#!/bin/bash
set -o nounset

JENKINS_CONTAINER_NAME=$1
JENKINS_HOME=`pwd`/jenkins/jenkins_home 
echo "JENKINS HOME: $JENKINS_HOME"

CONTAINER_NAME=$JENKINS_CONTAINER_NAME JENKINS_HOME=$JENKINS_HOME docker-compose -f docker-compose-controller.yaml up --build -d

sleep 10

# Here we have just installed git for our controller node, install as many tools as you require
docker exec $JENKINS_CONTAINER_NAME bash -c "apt-get update -y -q && apt-get upgrade -y -q && apt-get install -y -q git"
  • Jenkins 使用默认使用端口 8080 的 apache jetty,我们将主机的端口 50001 映射到容器的 8080。因此,输入http://host:50001应该会带您到 Jenkins web 仪表板。
  • 第一次检查容器日志管理员密码并创建一个新的管理员用户。

第 2 步:设置 Jenkins 代理(从属)

我们现在可以设置我们的代理。由于我们的 Jenkins 控制器将使用 SSH 与代理通信,因此我们需要生成 SSH 密钥。在这种情况下,Jenkins 主节点将充当 SSH 客户端,代理将充当 SSH 服务器。所以,我们需要相应地设置它。

  1. 生成密钥
ssh-keygen -t rsa -f jenkins_agent_1
  1. Goto Jenkins Dashboard > Manage Jenkins > Manage Credentials > 添加“系统”范围的凭据以启用 SSH 到 Jenkins Agent

系统凭证与全局凭证
系统:仅在 Jenkins 服务器上可用(jenkins 作业不可见)
全局:可在任何地方访问,包括 jenkins 作业

使用适当的值填写表格。这是一个示例,
用户名:jenkins # 我们希望以“jenkins”用户身份通过​​ ssh 进入代理,默认情况下该用户已存在于我们将使用的 jenkins-agent 容器中

ID:凭证的唯一ID,可用于引用凭证

私钥:SSH私钥文件内容(例如:jenkins_agent_1)

第 3 步:启动 Jenkins 代理(从属)容器

我们可以使用官方的 jenkins-ssh-agent docker 容器。这是您可以使用的示例 docker-compose 文件。

version: '3.8'

services:
  jenkins_agent:
    image: jenkins/ssh-agent:jdk11
    privileged: true
    user: root
    container_name: $CONTAINER_NAME
    expose:
      - 22
    environment:
      - JENKINS_AGENT_SSH_PUBKEY=$JENKINS_AGENT_SSH_PUBKEY

请注意,我们必须设置环境变量JENKINS_AGENT_SSH_PUBKEY,在本例中我们从 bash 变量中进行设置。我们还需要在 Jenkins 代理中安装所需的工具。我们可以使用如下所示的简单 bash 脚本来实现所有这些,

#!/bin/bash
set -o nounset

JENKINS_CONTAINER_NAME=$1
JENKINS_AGENT_SSH_PUBKEY=$2

CONTAINER_NAME=$JENKINS_CONTAINER_NAME JENKINS_AGENT_SSH_PUBKEY=$JENKINS_AGENT_SSH_PUBKEY docker-compose -f docker-compose-agent.yaml up --build -d

sleep 10

# Here we have just installed tools that help us create a python virtual environment for our agent node, install as many tools as you require
docker exec $JENKINS_CONTAINER_NAME bash -c "apt-get update -y -q && apt-get upgrade -y -q && apt-get install -y -q git python3 python3-venv"

第 4 步:从 Jenkins 控制器配置代理

转到Jenkins 仪表板>管理 Jenkins >管理节点和云>新节点

使用适当的值填写表格。例如:,


*Name*: JenkinsAgent1

*NumberOfExecutors*: 1-2

*RemoteRootDirectory*: /home/jenkins/agent

*Labels*: linux, python # Space separated values, Can be useful to restrict jobs to run on a particular agent

*Usage*: Use this node as much as possible

*Launch Method*: Launch agents via SSH

*Host*: jenkins_agent # Agent's Hostname or IP to connect. (docker-compose service name if controller and agent is on the same machine)

*Credentials*: Select the Credential created in Step 2

*HostKeyVerificationStrategy*: Non verifying Verification Strategy

Launch Method > Advanced

*ConnectionTimeoutInSeconds*: 60  
*MaximumNumberOfRetries*: 10  
*SecondsToWaitBetweenRetries*: 15

第 5 步:创建作业并运行

现在,我们的代理应该被控制器发现,我们可以开始将我们的工作委托给代理。我们可以通过使用我们在创建代理时分配的标签来限制作业在特定代理上运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26571.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节面试这么难?6年测开被暴虐.....

前几天我朋友跟我吐苦水,这波面试又把他打击到了,做了快6年软件测试员。。。为了进大厂,也花了很多时间和精力在面试准备上,也刷了很多题。但题刷多了之后有点怀疑人生,不知道刷的这些题在之后的工作中能不能用到&…

【python】之loguru库,好用的日志管理库!

在 Python 中用到日志记录,那就不可避免地会用到内置的 logging标准库 。虽然logging 库采用的是模块化设计,你可以设置不同的 handler 来进行组合,但是在配置上通常较为繁琐;而且如果不是特别处理,在一些多线程或多进…

Nautilus Chain全球行分享会,深圳站圆满举办

在北京时间 6 月 4 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在深圳(深圳南山区清华研究院)顺利举办,本次分享会联合主办方还包括 Stanford Blockchain Accelerator、Zebec …

OpenGL简介

1.简介 一般它被认为是一个API,包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。…

开发一个收废品小程序步骤

随着环保意识的提升和可持续发展的迫切需求,废品回收成为了一个重要的议题。预约上门回收小程序的开发为用户提供了方便、快捷的废品回收服务,促进了废品资源的再利用和环保行动的推进。本文将介绍开发预约上门回收小程序的流程,以帮助开发人…

IDEA启动图片更改替换(2021.1/2022及其之后的版本)

目录 先说2022.1及其之后的版本: 2022.1之前的版本: 2022其他版本修改方法 最近一直在整理接口数据,盯屏幕太久了,然后打开IDEA突然感觉这个启动页面好刺眼,正好整理工作做完了,中午有空就找了下方法,发现了不少坑,…

Linux命令(26)之uptime

Linux命令之uptime 1.uptime介绍 linux命令uptime是用来为用户提供系统从开启到当前运行uptime命令时系统已运行的时长信息,除此之外,还提了系统启动时间,当前登录用户,系统平均负载信息。 2.uptime用法 uptime [参数] uptime…

ChatGPT 提示的艺术 —— 如何编写清晰有效提示指南

ChatGPT 提示的作用 正如我们之前提到的那样,ChatGPT 对话中使用的提示的质量可以显著影响对话的成功。定义清晰的提示可以确保对话保持在正确的轨道上,并涵盖用户感兴趣的主题,从而产生更引人入胜和信息丰富的体验。 那么什么样的 ChatGPT…

Linux进程间通信——管道,共享内存,消息队列,信号量

进程间通信 文章目录 进程间通信进程间通信的方式进程间通信的概念如何实现进程间通信管道什么是管道 进程间怎么通信 匿名管道pipe函数创建管道通信读写特征写慢读快写快读慢写端关闭,读端读完读端关闭,写端? 管道特征 命名管道命名管道特性…

2023接口自动化测试,完整入门篇(超详细~)

一、自动化测试 众所周知,自动化测试已经成为软件项目中不可或缺的测试方法。基于用户交互界面(GUI)的自动化测试方法具有模拟用户行为和过程可视化的特点,因此受到了广大入门自动化人士的喜爱。诸如:QTP、Selenium等…

BR 5AP1130.156C-000

物料号: 5AP1130.156C-000 描述: 自动化装置面板 15.6" FullHD TFT - 1920 x 1080 像素 (16:9) - 多点触控(投射电容) - 开关柜安装 - 横向 - 用于 PPC900/PPC2100/PPC3100/ 联接模块 B&R ID 代码0xEC5D许可证 显示屏 类型TFT 彩色对角线…

图论试题2020

n-m 2 16 Pk(Kn)k(k-1)…(k-n1)。 C:A2对角线元素aii2等于对应顶点vi的度数,所以对角线元素之和等于边数的两倍。 A的所有特征值的平方和等于A2的对角线元素之和。 B 完全图没有顶点隔,实际上也只有以完全图为生成子图的图没有顶点隔。 连通…

StarRocks案例2: 升级后性能变慢

文章目录 一. 问题描述二. 解决方案2.1 从慢查询定位2.2 定位CPU解析时间就的问题 一. 问题描述 2023-05-18 将StarRocks从2.3.0升级到2.5.5。 升级完成后,所有的查询均比较慢,前端报表页面点开也卡。 二. 解决方案 2.1 从慢查询定位 StarRocks慢查询…

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人&#xff0…

Spring Boot如何实现自定义Starter?

Spring Boot如何实现自定义Starter? 在 Spring Boot 中,Starter 是一种特殊的依赖,它可以帮助我们快速地集成一些常用的功能,例如数据库连接、消息队列、Web 框架等。在本文中,我们将介绍如何使用 Spring Boot 实现自…

web前端 --- BOM编程、DOM编程

BOM编程(browser object model -- 浏览器对象模型) BOM给JavaScript提供用来操作浏览器的若干的"方法" 操作 在 js 看来,一个完整的浏览器包含如下组件: window窗口 // 整个浏览器的窗口 |-- history …

练手必备,20个Python实战项目含源代码

“读”代码是不能给你带来任何收益的,正如“读书”一样,如果在读的时候你不琢磨,保管你读完仨月准忘了一大半。真正需要的是去“试”代码,动手去调调代码,改改这改改那,看看把A变成B这个代码的结果会有什么…

最新成果展示:AlInN/GaN DBR模型数据库的开发与应用

由于AlN和GaN之间存在较大的晶格失配和热膨胀失配,导致很难获得高质量的AlN/GaN布拉格反射镜(Distributed Bragg Reflection,DBR)结构。为解决该问题,天津赛米卡尔科技有限公司技术团队基于先进的TCAD仿真设计平台开发…

MySQL 的锁

目录 一、锁的分类 二、全局锁、表级锁、页级锁、行级锁 三、乐观锁和悲观锁 四、共享锁和排它锁 五、意向共享锁和意向排它锁 六、间隙锁、临键锁、记录锁 锁的分类和用途 一、锁的分类 1、MySQL锁可以按模式分类为: 乐观锁悲观锁。 2、按粒度分可以分为&a…

STM32H743烧录后无法识别Jlink的问题

利用Cubemx生成H743的代码,点击烧录后,无法再识别到Jlink了,只能烧录时按着复位再松开(类似51单片机)。 烧录后不运行,用keil进行debug,调试发下芯片进去内存管理错误中断。 经过不断调试发现&…