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

news2024/11/26 7:29:23

自动化是 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 步:创建作业并运行

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go1.21 速览:骚操作 panic(nil) 将成为历史!以后别这么干了。。。

大家好,我是煎鱼。 在 Go 语言中,返回错误、抛出异常一直是大家比较关注的话题。在抛出异常上,我们一般都是这么用的: func mayPanic() {panic("脑子进煎鱼了") }func main() {defer func() {if r : recover(); r ! nil…

Vagrant编排虚拟机安装与配置

1.安装VirtualBox与Vagrant VirtualBox与Vagrant是支持不通过操作系统的;根据具体操作系统下载对应版本即可。(这里使用windows操作系统搭建) VirtualBox https://www.virtualbox.org/wiki/Downloads Vagrant https://developer.hashicorp.com/vagrant/downloads Va…

设计模式之~状态模式

状态模式(State),当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。 能够让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中将这些 可能发生的外部情况全部考虑到&#xff…

基于html+css的图展示102

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

应用运维的三个项目

应用运维 目录概述需求: 设计思路实现思路分析1.开发和运维2.比重3.历史项目4.工作内容5.历程 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,…

程序员的新出路:维护老项目?

1 张大胖刚进入公司,遇到了一个神奇的同事:何小痩。 别人工作都很忙, 何小痩工作似乎特别轻松,从来不加班,到点儿就回家。 张大胖向别人一打听,原来何小痩一直在维护一个老项目,维护了5年了。 …

「小产品独立变现实战训练营1期」门票限时优惠

大家好,我是凯凯刘,一名程序员,一直在做小产品的开发变现,目标就是让小产品的变现更简单。【小产品独立变现实战训练营1期】这个课程主要是围绕着如何开发出一个赚钱小产品这个主题。来跟大家一起从0开始实战,一步步跟…

为什么对象存储深度归档价格低?

AWS(亚马逊云服务)对象存储S3(Simple Storage Service)有以下四种不同的存储类型: S3 标准存储: 这是最常用的S3存储类型之一,它保证了高持久性,并提供 99.999999999% 的数据耐久性…

chatgpt赋能python:Python人脸识别:从入门到工程实践

Python人脸识别:从入门到工程实践 介绍 近年来,人脸识别技术越来越成熟,广泛应用于各行各业,如社交媒体、安防、金融等领域。Python人脸识别作为一种基于机器学习的技术,可以通过训练模型从图像中自动识别出人脸,并进…

致敬六一,用外观模式实现一个儿童乐园畅玩平台

一、概述 外观模式(Facade Pattern)是一种结构型设计模式,它为多个子系统中的操作提供一个统一的高层接口,用于访问复杂子系统的功能。其核心思想是通过一个外观类将子系统的复杂操作进行封装,客户端只需与外观类进行…

IO 多路复用是什么意思?Redis中的IO又是什么?

点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 本文首发于我的知乎:https://zhuanlan.zhihu.com/p/632776455 当你打开电脑,任何时候都在进行着IO的操作! 比如一次 API 接口调用、向磁盘写入日志信息&…

[数据结构习题]栈——中心对称链

[数据结构习题]栈——中心对称链 👉知识点导航💎:【数据结构】栈和队列 👉[王道数据结构]习题导航💎: p a g e 70.4 page70.4 page70.4 本节为栈和链表综合练习题 题目描述: 🎇思路…

Semaphore线程信号量

文章目录 前言一、Semaphore 是什么?定义对比 二、使用步骤1. 场景分析2. 编码如下 总结 前言 Semaphore 也是juc中的一个关键类,他与之前的lock 类似,也有公平和非公平两种,它与他们应用含义,引用场景有很大的不同; 与阻塞队列类似,但是也不一样;听我细细道来~ 一…

MTK capture 拍照流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、多帧拍照请求概览二、多帧拍照回帧概览 一、多帧拍照请求概览 多帧拍照请求概览如下: 多帧拍照请求 1.1 APP 下发拍照请求到 Camera Fr…

新Linux服务器安装Java环境[JDK、Tomcat、MySQL、Nacos、Redis、Nginx]

文章目录 JDK服务Tomcat服务MySQL服务Nacos服务Redis服务Nginx服务 说明:本文不使用宝塔安装 温馨提示宝塔安装命令:yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh JDK服务…

vitepress从0到1,让每个前后端小伙伴都拥有一个属于自己的博客

📸前言 之前周一的个人博客是用vuepress来搭建,但随着文章的数量越来越多,导致每回在启动的时候构建都特别慢,于是周一有了改构建工具的想法。这不,vitepress工具自发布后,在技术圈内一直有些火热&#xf…

数据库新闻速递 亚马逊Cosmos DB 添加了AI toolchain (译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

chatgpt赋能python:如何将Python代码打包成软件

如何将Python代码打包成软件 Python是一种直译式、交互式、面向对象的高级编程语言。由于其简洁明了的语法,Python在科学计算、Web开发、人工智能等领域得到了广泛的应用。但是,Python程序通常需要运行在特定的环境中,这限制了Python程序的移…

NodeJs之同源限制问题

1. 说明 app1是基于3001端口的服务器, app2是基于3002端口的服务器。 gitee地址:https://gitee.com/studyCodingEx/studys/ 2. app1 2.0 app1.js const express require(express); const path require(path); // 向其他服务器端请求数据的模块 const request …

Linux常用命令——gunzip命令

在线Linux命令查询工具 gunzip 用来解压缩文件 补充说明 gunzip命令用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或…