基于 Docker 平台的 Jenkins 安装和蓝海使用入门 (1)
环境介绍:
CentOS 7.5 Docker 19.03.8 Jdk 1.8.0 Git 2.20.4
注意:
如果将Jenkins作为Docker 容器运行,安装JDK跟Git不是必需的。
Docker安装教程:
https://blog.****.net/qq_44895681/article/details/105540702
在Docker中下载并运行Jenkins
建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository)。
该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。
[root@localhost ~]# docker search jenkins NAME DESCRIPTION STARS OFFICIAL AUTOMATED jenkins Official Jenkins Docker image 4758 [OK] jenkins/jenkins The leading open source automation server 2021 jenkinsci/blueocean //推荐 https://jenkins.io/projects/blueocean 512 jenkinsci/jenkins Jenkins Continuous Integration and Delivery … 382 [root@localhost ~]# docker pull jenkinsci/blueocean //下载镜像 Using default tag: latest latest: Pulling from jenkinsci/blueocean e7c96db7181b: Pull complete ... [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jenkinsci/blueocean latest c522b7f778ef 21 hours ago 569MB [root@localhost ~]# docker run -itd -p 8080:8080 jenkinsci/blueocean [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca1e1c655590 jenkinsci/blueocean "/sbin/tini -- /usr/…" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp, 50000/tcp silly_wilbur
映射(例如“发布”)jenkinsci/blueocean 容器的端口8080到主机上的端口8080。第一个数字代表主机上的端口,而最后一个代表容器的端口。因此,如果您为此选项指定 -p 49000:8080 ,您将通过端口49000访问主机上的Jenkins。
访问Jenkins/blueocean Docker容器
通过终端/命令提示符访问docker exec
,则可以添加一个选项 --name jenkins-blueocean
,这会为 jenkinsci/blueocean 容器命名为 "jenkins-blueocean" 。这意味着你可以使用如下命令访问容器(通过单独的终端/命令提示符窗口) :
docker exec -it jenkins-blueocean /bin/bash
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca1e1c655590 jenkinsci/blueocean "/sbin/tini -- /usr/…" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp, 50000/tcp silly_wilbur [root@localhost ~]# docker exec -it ca1e1c65 /bin/bash //若docker run没有使用--name,也可用容器运行ID访问容器 bash-4.4$ java -version //容器内java环境版本 openjdk version "1.8.0_212" OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode) bash-4.4$ git --version //容器内git版本 git version 2.20.4 bash-4.4$ netstat -antulp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:50000 0.0.0.0:* LISTEN 6/java tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 6/java
访问Jenkins Docker容器控制台日志
您可能需要访问Jenkins控制台日志。例如,在解锁 Jenkins 作为安装后设置向导的一部分时。如果在docker run时没有指定分离模式选项 -d ,那么Jenkins控制台日志则是通过运行此Docker命令提示符窗口显示。
否则,您可以通过访问Jenkins控制台日志 Docker logs中 的 jenkinsci/blueocean ,使用以下命令:
docker logs <docker-container-name>
您的 <docker-container-name>
可以使用docker ps 命令获得 。如果您在运行docker run 命令时指定了 --name
参数(如:--name jenkins-blueocean
),则只需使用以下 docker logs 命令:
docker logs jenkins-blueocean
如果没有指定--name
,也可以使用容器运行时的ID来查看容器日志。
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca1e1c655590 jenkinsci/blueocean "/sbin/tini -- /usr/…" 2 hours ago Up 2 hours 0.0.0.0:8080->8080/tcp, 50000/tcp silly_wilbur [root@localhost ~]# docker logs ca1e1c65
安装后设置向导
[root@localhost ~]# docker exec -it ca1e1c65 /bin/bash bash-4.4$ cat /var/jenkins_home/secrets/initialAdminPassword 12a1f53845254ce9ae67d221c181be94
在解锁Jenkins 页面上,将此密码粘贴到管理员密码字段中,然后单击继续 。
自定义Jenkins
两个选项可以设置:
- 安装建议的插件 - 安装推荐的一组插件,这些插件基于最常见的用例。
- 选择要安装的插件 - 选择安装的插件集。当你第一次访问插件选择页面时,默认选择建议的插件。
注意:
可以看到上面有些插件安装失败,在所有插件安装完之后可以点击“重试”,来继续安装之前安装失败的插件,也可以点击“继续”,再按照下面的方法安装插件。
插件安装失败解决方法:https://blog.****.net/qq_44895681/article/details/104633654
创建第一个管理员用户
Blue Ocean 入门
安装 Blue Ocean
Blue Ocean 可以用以下方式安装:
- 作为 已有Jenkins实例上的一组插件
- Jenkins-Docker镜像的一部分
在已有Jenkins实例上安装
在大多数平台安装Jenkins时,默认情况下不安装 Blue Ocean 插件 及其所有其他依赖插件(组成Blue Ocean“插件套件”)。
要在现有的Jenkins实例上安装Blue Ocean插件套件,您的Jenkins实例必须运行Jenkins 2.7.x或更高版本。
任何拥有 Administer 权限(通过 基于Matrix 安全设置)的Jenkins用户都可以在Jenkins实例上安装插件 。拥有次权限的Jenkins用户还可以配置系统上其他用户的权限。
要将Blue Ocean安装到您的Jenkins实例:
1.如果需要,请确保您已经登录到jenkins(作为具有 管理员 权限的用户).
2.从Jenkins主页(即Jenkins经典用户界面的仪表板),单机左侧的 管理Jenkins ,然后单击中心的 管理插件 。
3.点击 可用的 选项卡,然后在 过滤 文本框键入 blue ocean ,将过两次插件列表为名称/描述包含“blue”和“ocean”的插件名单。
4.选择 安装 列顶部的 Blue Ocean 插件复选框,然后单击 立刻下载并在重启后安装 按钮(推荐)或 安装而不重新启动按钮 。
注意:
无需选择此过滤列表中其他插件的复选框,因为 Blue Ocean 插件具有其他插件的依赖关系(构成Blue Ocean的插件套件),当您点击安装, 其他插件将被自动选择和安装。如果你选择 安装不重启 按钮, 你可能需要重启Jenkins来获取Blue Ocean的完整功能。
Blue Ocean 在安装后不需要额外的配置,现有的pipeline 和其他项目(如*风格作业)将照常运行。但是,请注意, 首次使用特定的 Git 服务(即GitHub,Bitbucket或普通Git服务器)在 Blue Ocean中创建pipeline 时,Blue Ocean会提示您输入credentials 以访问Git服务器上的存储库。在Blue Ocean可以将 Jenkinsfile
写入存储库之前
作为Jenkins-Docker镜像的一部分
Blue Ocean套件也与Jenkins捆绑在一起,作为Jenkins Docker镜像 (jenkinsci/blueocean)的一部分,该镜像可以从 Docker Hub 存储库获得。
访问 Blue Ocean
一旦Jenkins环境安装了Blue Ocean,登录到Jenkins经典UI 后,您可以通过点击左侧的 打开Blue Ocean 来访问Blue Ocean页面。或者,您可以在您的Jenkins url后面追加 /blue 直接访问Blue Ocean (如 http://192.168.2.73:8080/blue)。
创建流水线
Blue Ocean 能够更容易的在Jenkins中创建一个流水线。
流水线可以由源代码控制中存在的Jenkinsfile
生成, 或者使用 Blue Ocean 流水线编辑器 生成一个新的流水线(作为 Jenkinsfile 会提交到源代码控制中)。
配置流水线项目
GitHub仓库
在 Connect to GitHub 部分的Your GitHub access token
字段, 输入你的 GitHub 访问令牌。
如果你没有 GitHub 访问令牌, 点击 Create an access key here
。
创建访问令牌
1.在一个新的选项卡中, 登录 GitHub 账户并且在 GitHub的 New Personal Access Token 页面,为你的GirHub访问令牌 (e.g. Blue Ocean)输入一个简短的 Token description。
Note: 访问令牌通常是一个字母数字字符串,它通过你的GitHub 账户对你的GitHub账户访问各种特性和区域的权限进行相应的处理。新的访问令牌过程 (通过上面的 Create an access key here 链接触发) 具有预选的合适权限, Blue Ocean 需要访问你的GitHub账户并与其进行交互。
2.向下滚动直到页面的末尾,然后点击 Generate token。
3.在生成的 Personal access tokens 页面, 复制新生成的访问令牌。
4.回到Blue Ocean, 粘贴访问令牌到 Your GitHub access token*字段并点击 *Connect。
你当前/登陆的Jenkins用户现在可以访问 GitHub a账户 (由你的访问令牌提供), 所以你现在可以 选择 GitHub 账户/组织和存储库。
Jenkins 为Jenkins用户注册了带有以下详细信息的凭证:
Domain: blueocean-github-domain
ID: github
Name: <jenkins-username>/****** (GitHub Access Token)
上一篇:
网络编程(第 3 版)》课后答案
推荐阅读
-
基于 Docker 平台的 Jenkins 安装和蓝海使用入门 (1)
-
小红书大产品部架构 小红书产品概览--经过性能、稳定性、成本等多个维度的详细评估,小红书最终决定选择基于腾讯云星海自研硬件的SA2云服务器作为主力机型使用。结合其秒级的快速扩缩、超强兼容和平滑迁移能力,小红书在抵御上亿次用户访问、保证系统稳定运行的同时,也实现了成本的大幅降低。 星海SA2云服务器是基于腾讯云星海的首款自研服务器。腾讯云星海作为自研硬件品牌,通过创新的高兼容性架构、简洁可靠的自主设计,结合腾讯自身业务以及百万客户上云需求的特点,致力于为云计算时代提供安全、稳定、性能领先的基础架构产品和服务。如今,星海SA2云服务器也正在为越来越多的企业提供低成本、高效率、更安全的弹性计算服务。 以下是与小红书SRE总监陈敖翔的对话实录。 问:请您介绍一下小红书及其主要商业模式? 小红书是一个面向年轻人的生活方式平台,在这里,他们发现了向上、多元的真实世界。小红书日活超过 3500 万,月活跃用户超过 1 亿,日均笔记曝光量达 80 亿。小红书由社交平台和在线购物两大部分组成。与其他线上平台相比,小红书的内容基于真实的口碑分享,播种不止于线上,还为线下实体店赋能。 问:围绕业务发展,小红书的系统架构经历了怎样的变革和演进? 系统架构变化不大,影响最深的是资源开销。过去三年,资源开销大幅增加,同比增长约 10 倍。在此背景下,我们努力进行优化,包括很早就开始使用 K8S 进行资源调度。到 18 年年中,绝大多数服务已经完全实现了容器化。 问:目前小红书系统架构中的计算基础设施建设和布局是怎样的? 我们目前的建设方式可以简单描述为星型结构。腾讯云在上海的一个区是我们的计算中心,承载着我们的核心数据和在线业务。在外围,我们还有两个数据中心进行计算分流,同时承担灾备和线上业务双活的角色。 与其他新兴电子商务互联网公司类似,小红书的大部分计算能力主要用于线下数据分析、模型训练和在线推荐等平台。随着业务的发展,对算力的需求也在加速增长。
-
【Netty】「萌新入门」(七)ByteBuf 的性能优化-堆内存的分配和释放都是由 Java 虚拟机自动管理的,这意味着它们可以快速地被分配和释放,但是也会产生一些开销。 直接内存需要手动分配和释放,因为它由操作系统管理,这使得分配和释放的速度更快,但是也需要更多的系统资源。 另外,直接内存可以映射到本地文件中,这对于需要频繁读写文件的应用程序非常有用。 此外,直接内存还可以避免在使用 NIO 进行网络传输时发生数据拷贝的情况。在使用传统的 I/O 时,数据必须先从文件或网络中读取到堆内存中,然后再从堆内存中复制到直接缓冲区中,最后再通过 SocketChannel 发送到网络中。而使用直接缓冲区时,数据可以直接从文件或网络中读取到直接缓冲区中,并且可以直接从直接缓冲区中发送到网络中,避免了不必要的数据拷贝和内存分配。 通过 ByteBufAllocator.DEFAULT.directBuffer 方法来创建基于直接内存的 ByteBuf: ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer(16); 通过 ByteBufAllocator.DEFAULT.heapBuffer 方法来创建基于堆内存的 ByteBuf: ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer(16); 注意: 直接内存是一种特殊的内存分配方式,可以通过在堆外申请内存来避免 JVM 堆内存的限制,从而提高读写性能和降低 GC 压力。但是,直接内存的创建和销毁代价昂贵,因此需要慎重使用。 此外,由于直接内存不受 JVM 垃圾回收的管理,我们需要主动释放这部分内存,否则会造成内存泄漏。通常情况下,可以使用 ByteBuffer.clear 方法来释放直接内存中的数据,或者使用 ByteBuffer.cleaner 方法来手动释放直接内存空间。 测试代码: public static void testCreateByteBuf { ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(16); System.out.println(buf.getClass); ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer(16); System.out.println(heapBuf.getClass); ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer(16); System.out.println(directBuf.getClass); } 运行结果: class io.netty.buffer.PooledUnsafeDirectByteBuf class io.netty.buffer.PooledUnsafeHeapByteBuf class io.netty.buffer.PooledUnsafeDirectByteBuf 池化技术 在 Netty 中,池化技术指的是通过对象池来重用已经创建的对象,从而避免了频繁地创建和销毁对象,这种技术可以提高系统的性能和可伸缩性。 通过设置 VM options,来决定池化功能是否开启: -Dio.netty.allocator.type={unpooled|pooled} 在 Netty 4.1 版本以后,非 Android 平台默认启用池化实现,Android 平台启用非池化实现; 这里我们使用非池化功能进行测试,依旧使用的是上面的测试代码 testCreateByteBuf,运行结果如下所示: class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf 可以看到,ByteBuf 类由 PooledUnsafeDirectByteBuf 变成了 UnpooledUnsafeDirectByteBuf; 在没有池化的情况下,每次使用都需要创建新的 ByteBuf 实例,这个操作会涉及到内存的分配和初始化,如果是直接内存则代价更为昂贵,而且频繁的内存分配也可能导致内存碎片问题,增加 GC 压力。 使用池化技术可以避免频繁内存分配带来的开销,并且重用池中的 ByteBuf 实例,减少了内存占用和内存碎片问题。另外,池化技术还可以采用类似 jemalloc 的内存分配算法,进一步提升分配效率。 在高并发环境下,池化技术的优点更加明显,因为内存的分配和释放都是比较耗时的操作,频繁的内存分配和释放会导致系统性能下降,甚至可能出现内存溢出的风险。使用池化技术可以将内存分配和释放的操作集中到预先分配的池中,从而有效地降低系统的内存开销和风险。 内存释放 当在 Netty 中使用 ByteBuf 来处理数据时,需要特别注意内存回收问题。 Netty 提供了不同类型的 ByteBuf 实现,包括堆内存(JVM 内存)实现 UnpooledHeapByteBuf 和堆外内存(直接内存)实现 UnpooledDirectByteBuf,以及池化技术实现的 PooledByteBuf 及其子类。 UnpooledHeapByteBuf:通过 Java 的垃圾回收机制来自动回收内存; UnpooledDirectByteBuf:由于 JVM 的垃圾回收机制无法管理这些内存,因此需要手动调用 release 方法来释放内存; PooledByteBuf:使用了池化机制,需要更复杂的规则来回收内存; 由于池化技术的特殊性质,释放 PooledByteBuf 对象所使用的内存并不是立即被回收的,而是被放入一个内存池中,待下次分配内存时再次使用。因此,释放 PooledByteBuf 对象的内存可能会延迟到后续的某个时间点。为了避免内存泄漏和占用过多内存,我们需要根据实际情况来设置池化技术的相关参数,以便及时回收内存; Netty 采用了引用计数法来控制 ByteBuf 对象的内存回收,在博文 「源码解析」ByteBuf 的引用计数机制 中将会通过解读源码的形式对 ByteBuf 的引用计数法进行深入理解; 每个 ByteBuf 对象被创建时,都会初始化为1,表示该对象的初始计数为1。 在使用 ByteBuf 对象过程中,如果当前 handler 已经使用完该对象,需要通过调用 release 方法将计数减1,当计数为0时,底层内存会被回收,该对象也就被销毁了。此时即使 ByteBuf 对象还在,其各个方法均无法正常使用。 但是,如果当前 handler 还需要继续使用该对象,可以通过调用 retain 方法将计数加1,这样即使其他 handler 已经调用了 release 方法,该对象的内存仍然不会被回收。这种机制可以有效地避免了内存泄漏和意外访问已经释放的内存的情况。 一般来说,应该尽可能地保证 retain 和 release 方法成对出现,以确保计数正确。