docker中安装jenkins,并在node和cloud上跑通基于源码控制SCM的pipeline

news2024/11/17 12:41:39

目录

一、摘要

二、部署和使用

1. docker部署jenkins

1.1 准备数据目录

1.2 拉取jenkins镜像并启动

1.3 初始化配置

1.3.1 登录容器查看初始化密码

1.3.2 访问jenkins并输入初始化密码

1.3.3 创建管理员账户

1.3.4 初始化完成

2. jenkins使用之多分支流水线

2.1 准备代码分支

2.1.1 gitlab创建一个仓库

2.1.2 添加JenkinsFile和build脚本

2.1.3 基于main分支创建一个dev分支

2.2 创建多分支流水线

2.2.1 新建Item

2.2.2 选择创建多分支流水线

2.2.3 弹出配置页面并输入名称

2.2.4 选择分支源并配置

2.2.5 点击确认

2.2.6 查看多分支流水线状态

2.2.7 流水线更新

2.3 让流水线运行到其他开发机

2.3.1 arm机器环境准备

2.3.2 新建node

2.3.3 在新node中运行流水线

2.3.4 查看状态

2.4 让流水线运行到docker中

3. Jenkins cloud(通过docker服务器管理node)

3.1 准备node镜像

3.2 准备主机

3.2.1 打开docker服务的tcp端口

3.2.2 测试docker tcp服务

3.3 创建cloud

3.3.1 新建node

3.3.2 配置docker cloud details

3.3.3 配置docker agent templete

3.4 创建freestyle流水线并使用cloud

3.4.1 新建freestyle project类型的Item

3.4.2 限制流水线运行在cloud上

3.4.3 选择git并指定分支

3.4.4 输入build步骤

3.4.5 运行流水线

4. Jenkins的docker插件(docker in docker支持)

4.1 要求

4.2 具体方案

4.3 多分支流水线示例(基于node)

4.3.1 修改dockerfile

4.3.2 jenkins中安装docker插件

4.3.3 新建基于SCM的多分支流水线

4.3.4 启动状态确认

4.4 多分支流水线示例(基于cloud)

4.4.1 配置cloud

4.4.2 为流水线指定cloud

三、注意事项


一、摘要

本文先介绍了jenkins在docker中的部署

然后以SCM多分支流水线配置为例创建了基于内置node的流水线

接下来让SCM多分支流水线跑在基于其他物理机或者docker机器环境的node中

最后创建jenkins cloud并以FreeStyle流水线为例,让node在docker服务器上执行任务

  • 在docker中部署jenkins

  • 基于源码管理的SCM流水线

  • jenkins node:在jenkins slave上跑流水线

  • jenkins cloud:node集合

主要包含4小块内容

二、部署和使用

1. docker部署jenkins

1.1 准备数据目录
makedir -p /home/jenkins/jenkins-data
1.2 拉取jenkins镜像并启动

这里以2.440.3-lts版本为例

docker pull jenkins/jenkins:2.440.3-lts

docker run \
  --name jenkins-jenkins \
  # 容器在退出时,自动清除挂在的卷,以便清除数据
  # 等价于在容器退出后,执行docker rm -v,正式环境下不要使用
  --rm \
  # 后台运行
  --detach \
  # jenkins web访问端口为主机的9880, jenkins slave连接端口为50000
  --publish 9880:8080 --publish 50000:50000 \
  # 物理机/home/jenkins/jenkins-data指定为jenkins数据目录
  -v /home/jenkins/jenkins-data:/var/jenkins_home \
  # jenkins复用物理主机的docker服务
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:2.440.3-lts
1.3 初始化配置
1.3.1 登录容器查看初始化密码
docker exec -it jenkins-jenkins bash
cat /var/jenkins_home/secrets/initialAdminPassword
# 399861214afc433e80980d4b607e60df

1.3.2 访问jenkins并输入初始化密码

通过127.0.0.1:9880访问jenkins网页

跳过新手入门界面

等待jenkins初始化一段时间

1.3.3 创建管理员账户

输入用户名和密码

记住访问地址

1.3.4 初始化完成

2. jenkins使用之多分支流水线

这个例子中

我们先创建一个含有JenkinsFile的代码仓库,并额外创建dev分支

然后在Jenkins中创建一个多分支流水线

接下来通过 立即扫描多分支流水线 拉取代码并配置流水线

最后点击运行按钮触发特定分支的流水线

注意:流水线首次创建完成后,会自动执行立即扫描多分支流水线的功能,拉取git仓库代码,并根据代码中的JenkinsFile自动配置流水线,自动在各个分支上执行触发特定分支的流水线功能。

2.1 准备代码分支

jenkins会通过代码仓库下的JenkinsFile构建流水线,跟gitlab-ci.yml类似

该例子中

Build阶段每个分支(main和dev)都会执行,Test阶段每个分支都会执行 Release for dev阶段只有dev分支会执行,Release for main阶段只有main分支会执行

2.1.1 gitlab创建一个仓库

2.1.2 添加JenkinsFile和build脚本

JenkinsFile内容

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'pwd && ls -alh'
                sh 'bash ./build_b.sh building'
            }
        }
        stage('Test') {
            steps {
                sh 'bash ./build_b.sh testing'
            }
        }
        stage('Release for dev') {
            when {
                branch 'dev' 
            }
            steps {
                sh 'bash ./build_b.sh release when dev'
                # 实现流水线和jenkins前台交互,执行到这里的时候需要在jenkins任务界面点击确认按钮
                # 不是必须的
                input message: 'Finished using the web site? (Click "Proceed" to continue)'
                sh 'bash ./build_b.sh release when dev after input'
            }
        }
        stage('Release for main') {
            when {
                branch 'main'  
            }
            steps {
                sh 'bash ./build_b.sh release when main'
                # 实现流水线和jenkins前台交互,执行到这里的时候需要在jenkins任务界面点击确认按钮
                # 不是必须的
                input message: 'Finished using the web site? (Click "Proceed" to continue)'
                sh 'bash ./build_b.sh release when main after input'
            }
        }
    }
}

build脚本内容(输出如下内容和命令行参数)

echo "[main branch]this is a test build b test script: $@"
2.1.3 基于main分支创建一个dev分支

多分支流水线会根据分支和jenkinsfile执行不同的steps

2.2 创建多分支流水线
2.2.1 新建Item

2.2.2 选择创建多分支流水线

2.2.3 弹出配置页面并输入名称

2.2.4 选择分支源并配置

选择Git

输入git仓库地址

选择添加git凭据

添加一个全局凭据

2.2.5 点击确认

自动进入多分支流水线扫描(自动通过gitlab凭据拉取代码)

首次构建完成会扫描并自动执行,如左下角进度所示

2.2.6 查看多分支流水线状态

点击任意一个查看执行状态

可以回到主页查看整体状态 也可以点击右侧三角图标重新触发流水线

2.2.7 流水线更新

如果代码内容有变更,需要手动重新扫描多分支流水线触发代码的重新拉取

2.3 让流水线运行到其他开发机

默认情况下上面的多分支流水线会在jenkins的内置node中执行,也就是在jenkins所在环境中运行

我们将jenkins安装到了dcoker中,因此上面的流水线会在jenkins所在docker容器中运行

上面的流水线相对简单,主要是执行了一个bash脚本,因此内置的node可以跑起来

但是当我们的build脚本比较复杂,对运行环境有要求,那么内置的node就不能满足我们的需要了 这时候我们就需要额外创建node,让我们的任务跑在指定的环境上

我们将一台arm机器作为node,来运行我们的流水线

2.3.1 arm机器环境准备

安装java 11

sudo apt-get install openjdk-11-jdk

准备一个node的工作目录, Jenkins会将一些必要的文件copy到工作目录中

mkdir -p /home/cpf/jenkins/node_work_dir/
2.3.2 新建node

打开管理jenkins页面并点击nodes

点击新建node

输入node名称并创建

添加ssh凭据,jenkins将通过凭据登录node

这里为了演示方便统一使用用户名和密码作为凭据(也可以用sshkey)

工作目录,标签和启动方式配置

点击保存后查看node状态

2.3.3 在新node中运行流水线

修改流水线配置,将node指定为我们刚才创建的node

先打开build流水线界面,点击左侧配置菜单

拖到最下面, 输入dockerlable(之前步骤中设置的node的lable)后save

重新触发流水线

2.3.4 查看状态

查看状态

2.4 让流水线运行到docker中

在2.3中,我们在arm机器上安装了java 11后,可以创建一个基于实体机器的node,jenkins可以通过ssh链接到node并运行流水线

类似的,我们也可以启动一个安装了java 11的docker镜像,创建一个基于docker的node,jenkins通过ssh链接到docker中,并运行流水线

3. Jenkins cloud(通过docker服务器管理node)

在前面的示例中,我们需要提前准备一个安装有java11环境的实体机或者提前启动一个带有java11的docker镜像来作为node

然而jenkins的cloud提供了另外一种方式,任务创建后自动通过docker服务创建一个node,任务完成后自动销毁

3.1 准备node镜像

准备一个安装了java 11的镜像作为node(dockerhub上已经有这样的镜像了,我们可以直接拉取使用,注意:dockerhub上的node镜像没有安装docker)

3.2 准备主机

准备一台安装了docker的主机

注意:docker服务需要开启tcp服务已被jenkins连接,同时确保防火墙打开了docker的TCP侦听端口的2376端口

3.2.1 打开docker服务的tcp端口

默认情况下docker服务不开启tcp服务

我们可以通过修改启动配置打开tcp侦听服务

 sudo vi /lib/systemd/system/docker.service
# -H tcp://10.31.1.12:2376

需重新加载并启动服务后生效

 sudo systemctl daemon-reload
 sudo systemctl restart docker.service

检查确认端口已经侦听

3.2.2 测试docker tcp服务

在另一台机器上访问docker端口

curl http://10.31.1.12:2376/version

3.3 创建cloud
3.3.1 新建node

在管理kenkins界面点击Clouds

点击add

输入名字

3.3.2 配置docker cloud details

输入tcp链接地址和端口(docker服务器提供的服务地址和端口)

测试端口 点击右侧的按钮可以测试连接

3.3.3 配置docker agent templete

展开docker agent templete后点击Add Dcoker Templete按钮

  • Lables:docker_10.31.1.12

  • Name:docker_10.31.1.12

  • image:jenkins/agent:jdk11(注意这里的镜像是node的镜像也即agent镜像)

  • container setting:先不填写

Instance capacity:5

同时启动的docker agent镜像数量,这里设置为5),其他参数默认不管

连接方式选择attach docker container

通过docker exec的方式登录到docker内部

pull strategy修改为从不(我们手动维护aget镜像,不用每次重新pull)

点击保存

3.4 创建freestyle流水线并使用cloud
3.4.1 新建freestyle project类型的Item

3.4.2 限制流水线运行在cloud上

输入之前创建的cloud的标签

3.4.3 选择git并指定分支

3.4.4 输入build步骤

我们这里指定为运行代码仓库目录下的build脚本

注意:如果我们不指定构建步骤将只会clone代码

3.4.5 运行流水线

保存后运行流水线

4. Jenkins的docker插件(docker in docker支持)

以上的演示,我们的流水线任务和build步骤都是直接跑在node节点中的

  • 如果node节点是物理机,则流水线任务直接在物理机上跑,build步骤也一样

  • 如果node节点是docker镜像实例,则流水线任务会跑在docker实例中,build步骤也一样

  • 如果node节点是通过cloud启动的,则流水线任务任务会跑在cloud服务器启动的docker实例中,build步骤也一样

想像这样一个场景。前期公司没有jenkins,编译镜像也没有java 11环境,因此这些编译镜像是不能作为node镜像来用

其实node镜像和build镜像可以不是用一个。我们是可以让build步骤(构建过程)跑在其他镜像中来解决这个问题

4.1 要求

作为node的jenkins agent镜像需要支持docker in docker功能,也即在docker中使用docker的功能

4.2 具体方案

将宿主机的docker通信套接字挂载给node,这样node就会使用宿主机提供的docker服务,node启动的镜像实例会在宿主机上启动

4.3 多分支流水线示例(基于node)

在基于arm实体机器的node上运行多分支流水线,流水线中的build任务将基于 ubuntu:20.04 镜像运行

主要流程是 jenkins触发流水线->在物理机的node接收任务->启动一个ubuntu:20.04->执行build任务

4.3.1 修改dockerfile

添加agent指定镜像,image 'ubuntu:20.04'

pipeline {
    agent {
        docker {
            image 'ubuntu:20.04'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'pwd && ls -alh'
                sh 'bash ./build_b.sh building'
            }
        }
        stage('Test') {
            steps {
                sh 'bash ./build_b.sh testing'
            }
        }
        stage('Release for dev') {
            when {
                branch 'dev' 
            }
            steps {
                sh 'bash ./build_b.sh release when dev'
                input message: 'Finished using the web site? (Click "Proceed" to continue)'
                sh 'bash ./build_b.sh release when dev after input'
            }
        }
        stage('Release for main') {
            when {
                branch 'main'  
            }
            steps {
                sh 'bash ./build_b.sh release when main'
                input message: 'Finished using the web site? (Click "Proceed" to continue)'
                sh 'bash ./build_b.sh release when main after input'
            }
        }
    }
}
4.3.2 jenkins中安装docker插件

在管理jenkins中打开Plugins

安装docker pipeline插件

点击安装后,同时会自动安装docker插件

如果不装docker pileline插件将报错: 无法解析JenkinsFile中的docker字段

如果node中没有安装docker软件将会有如下错误

4.3.3 新建基于SCM的多分支流水线

基础配置

  • 输入仓库名

  • 设置凭据

  • 选择jenkinsfile模式并指定文件路径(默认不需要修改)

指定node为我们刚才创建的cloud

4.3.4 启动状态确认

重新运行

点击继续

运行成功

查看日志 docker inspect -f . ubuntu:20.04 执行成功了,日志正常打印

4.4 多分支流水线示例(基于cloud)
4.4.1 配置cloud

配置cloud,让node使用docker服务器的docker服务

即在node使用的docker命令都会在物理docker服务器运行

参考:Jenkins Docker plugin volume/mount what syntax to use

4.4.2 为流水线指定cloud

将4.3中的流水线指定在cloud上运行后,重新触发流水线即可

三、注意事项

  1. Jenkins node镜像请安装docker 在node中安装docker后,支持docker in docker这种构建方式

  2. Jenkins node可以共用主机的docker服务 如果node是一个镜像实例,则启动的时候可以挂载上主机的/var/run/docker.sock:/var/run/docker.sock以统一使用主机提供的docker服务

关注 非科班CPP程序员,一起进步。

更详细的内容:docker中安装jenkins,并在node和cloud上跑通基于源码控制SCM的pipeline

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

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

相关文章

WordPress主题 7B2 PRO 5.4.2 免授权开心版源码

本资源提供给大家学习及参考研究借鉴美工之用,请勿用于商业和非法用途,无任何技术支持! WordPress主题 7B2 PRO 5.4.2 免授权开心版源码 B2 PRO 5.4.2 最新免授权版不再需要改hosts,和正版一样上传安装就可以激活。 直接在Word…

安全+大模型应用系列之RSAC的Dropzone AI的分析

RSAC的AI元素 2024 RSAC上展示的半数以上的产品都加持了AI技术,从代码检测、数据分级分类、威胁检测、行为分析等检测技术到威胁告警分析研判和自动化处置都体现了AI的融入。 以SIEM产品为例,Elastic演示了可以集成任何第三方的威胁分析大模型&#xf…

uniapp移动端骨架屏流程

1.使用微信开发者工具来生成骨架屏;在分窗模式下选择页面信息,下拉选择生成骨架屏;他会基于当前页面生成骨架屏的样式 点击确定; 会自动生成这两个文件;一个是html结构文件,一个是css样式文件。 然后把这两…

【C++】学习笔记——map和set

文章目录 十五、map和set1. 关联式容器2. set的介绍3. set的使用4. multiset5. map的介绍6. map的使用7. multimap8. map中重载的operator[] 未完待续 十五、map和set 1. 关联式容器 我们已经接触过STL中的部分容器,比如:vector 、list 、deque 等&…

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接: NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

HP1010|图腾柱无桥PFC电流采样模式小结

伴随着氮化镓和碳化硅等第三代半导体功率器件在应用端的兴起,图腾柱PFC也随之从学术研究走到了现实的产品里。然而,在受益于拓扑电路简洁,高功率密度和效率的同时, 还是有很多技术难点是需要克服的。本文将讨论图腾柱PFC电流采样&…

南京沁恒微USB HUB CH334/CH335多种封装规格选择,外围简单,价格还美丽

概述: CH334 和 CH335 是符合 USB2.0 协议规范的 全速,下行端口支持 USB2.0 高速 480Mbps 个 TT 分时调度 4 个下行端口),还支持高性能的 工业级设计,外围精简,可应用于计算机和工控机主板 特点&#xff1…

NetBox-插件 QR二维码安装汉化教程

简介 本文章主要介绍安装QR插件并进行中文字体支持、字段汉化、增加下载功能,自定义显示字段等。 Netbox 的QR插件,用于给各种实体生成二维码标签,用于贴在实体上。二维码为实体的netbox网址。 Netbox系列文章:https://songxwn…

kali linux 网络配置

1. 静态IP配置 首先打开kali网络配置文件 /etc/network/interfaces vi /etc/network/interfaces 将下方内容添加 auto eth0 iface eth0 inet static address 192.168.136.199 netmask 255.255.255.0 gateway 192.168.136.254auto eth0 #网卡名 iface eth0 inet static …

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响? 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术,它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…

如何在.NET中集成SignalR

SignalR 简介 SignalR是一个开放源代码库,可用于简化向应用添加实时Web功能,实时Web功能使服务器端代码能够将内容推送到客户端。 SignalR开源库:https://github.com/SignalR/SignalR SignalR 应用场景 需要高频次从服务器获取信息的应用&am…

Jenkins 动态salve简单配置连接 EKS

安装Jenkins helm repo add jenkins https://charts.jenkins.io helm repo update # 当前版本 jenkins-5.1.18.tgz瘦身后的 values.yaml # grep -Ev ^\s*#|^$ values.yaml nameOverride: fullnameOverride: namespaceOverride: clusterZone: "cluster.local" kubern…

Docker仅需3步搭建免费私有化的AI搜索引擎-FreeAskInternet!

简介 FreeAskInternet 是一个完全免费、私有且本地运行的搜索引擎,并使用 LLM 生成答案,无需 GPU。用户可以提出问题,系统会进行多引擎搜索,并将搜索结果合并到ChatGPT3.5 LLM中,并根据搜索结果生成答案。 什么是 Fr…

RedHat9 | 配置转发DNS服务器

一、实验环境 1、介绍 转发服务器(Forwarding Server)接收查询请求,但不直接提供DNS解析,而是将所有查询请求发送到另外的DNS服务器,将查询的结果返回后保存到缓存中。如果没有指定转发服务器,DNS服务器会…

Springboot+Vue项目-基于Java+MySQL的交通管理在线服务系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

AI--构建检索增强生成 (RAG) 应用程序

LLM 所实现的最强大的应用之一是复杂的问答 (Q&A) 聊天机器人。这些应用程序可以回答有关特定源信息的问题。这些应用程序使用一种称为检索增强生成 (RAG) 的技术。 典型的 RAG 应用程序有两个主要组件 索引:从源中提取数据并对其进行索引的管道。这通常在线下…

FRAUDARCatchSync算法简介

参考:https://blog.51cto.com/u_15127663/2778705 1. 背景 Fraudar 要解决的问题是:找出社交网络中最善于伪装的虚假用户簇。虚假用户会通过增加和正常用户的联系来进行伪装,而这些伪装(边)会形成一个很密集的子网络,可以通过定义…

数据结构(二)单链表

一、链表 (一)概念 逻辑结构:线性 存储结构:链式存储,在内存中不连续 分为有头链表和无头链表 同时又细分为单向、循环、双向链表 (二)有头单向链表示意图 以下数据及地址只是为了方便理解…

STM32_ADC

1、ADC简介 ADC,即Analog-Digital Converter,模拟-数字转换器。 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC,1us转换时间。 输入电压范围:0~3.3…

MySQL数据库单表查询中查询条件的写法

1.使用比较运算符作为查询条件 ; !; >; >; <; <; 如上图所示&#xff0c;可以使用命令select 字段&#xff0c;字段 from 表名 where Gender “M”; 即挑选出Gender “M” 的教师&#xff0c; 如上图所示&#xff0c;可以使用命令select 字段&#xff0c;…