为什么我的 Jenkins Controller 越来越慢?可能犯了这些错误...

就像标题所说的,为什么我的 Jenkins Controller 越来越慢,可能是因为没有遵循 Jenkins pipeline 编写的一些最佳实践。

所以主要介绍 Jenkins pipeline 的一些最佳实践,目的是为了向 pipeline 作者和维护者展示一些他们过去可能并没有意识到的“反模式”。

我会尽量列出所有可能的 Pipeline 最佳实践,并提供一些实践中常见的具体示例。

一般问题

确保在 pipeline 中使用 Groovy 代码作为粘帖剂

使用 Groovy 代码连接一组操作而不是作为 pipeline 的主要功能。

换句话说,与其依赖 pipeline 功能(Groovy 或 pipeline 步骤)来推动构建过程向前发展,不如使用单个步骤(例如 sh)来完成构建的多个部分。

pipeline 随着其复杂性的增加(Groovy 代码量、使用的步骤数等),需要 controller 上的更多资源(CPU、内存、存储)。将 Pipeline 视为完成构建的工具,而不是构建的核心。

示例:使用单个 Maven 构建步骤通过其构建/测试/部署过程来驱动构建。

在 Jenkins pipeline 中运行 shell 脚本

在 Jenkins Pipeline 中使用 shell 脚本可以通过将多个步骤合并到一个阶段来帮助简化构建。shell 脚本还允许用户添加或更新命令,而无需单独修改每个步骤或阶段。

Jenkins Pipeline 中使用 shell 脚本及其提供的好处:

Read More

2022 年终总结

时间过得好快,又过完了一年。

今年想写一些总结回顾一下过去的一年发生在自己身上的重要事件。

由于 2021 年没有写年终总结,2021 年在我的脑海里已经变化模糊,我只能凭着一些照片和日记才想起来的一些事情。看来以后的年终总结不能落下。

回顾 2021

2021 年我的个人关键词是“最后的潇洒”。

年初我搬家了,新家离公司开车只要十几分钟。这节省了很多花在路上的时间,周末我也更愿意往公司跑。

四月,第一次 Fork 并开始维护 cpp-linter-action 这个开源项目,并且吸引了另外一个开发者与我共同维护。

七月,广鹿岛旅行

八月,老婆怀孕了。现在回看 2021 的照片,两个人的生活真的是太自在和潇洒了,两人吃饱全家不饿。

十一月,被告知为次密接,要求去酒店隔离。就这样我们被拉去酒店隔离了一周,然后回家后又要求隔离一周。现在想想呵呵不可思议!

回顾 2022

2022 的我个人的关键词就是“责任”。

五月,随着女儿的出生的,除了工作之外,几乎所有的时间都花在了照顾家庭方面,留给我学习和输出时间寥寥无几了。

孩子的出生最直接的感受就是身上责任的重大,养育一个孩子不但需要付出时间还有金钱,我真正地成为了上有老下有小的中年人了,一刻都不能倒下。

以前觉得自己无所不能,未来可期,现在觉得自己肩膀上的责任重大,从此再也无法躺平了。

六月至九月,陪产假。当全职奶爸,在孩子的睡觉的时候放弃了一些休息时间用来读书和开源。

十月至十二月,回归岗位,因为疫情关系大部时间都在家办公。上班工作,下班看娃,再也没有大块时间来学习和输出了。

因此我今年输出的文章很少,博客上一共发布了 19 篇,其中公众号只输出了 11 篇文章。这些输出绝大多数发生在上半年孩子还没出生的时候。

在业余时间相较于输出文章,第一优先级还是在开源项目,这能让我学到更多。我在 cpp-linter 这个项目上花了比较多的业余时间,目前 cpp-linter-action 已经其他被超过 100 个其他项目所使用(依赖),我希望能把 cpp-linter 做成所有 C/C++ 项目的首选的代码格式化和静态检查工具。

展望 2023

  • 工作和家庭的平衡,希望女儿健康成长,早点睡整觉,这样爸爸可以晚上工作和学习了
  • 英语和技术能够有进步,比如通过 TOEIC Tests 和加入知名的 Python Org 和学习 Cloud 方面的技术
  • 超过 2022 年在博客和公众号的输出文章数,完成 24(博客)+ 12(公众号)要求不高吧
  • 保持身体健康,恢复游泳、足球、运动,让体重回到 160 斤以下

过去的年终总结

2020 年终总结
2019 年终总结
2018 从测试到开发的五个月


转载本站文章请注明作者和出处,请勿用于任何商业用途。欢迎关注公众号「DevOps攻城狮」

How to implement [skip ci] for Jenkins multi-branch pipeline

When I want to implement [skip ci] or [ci skip] for Jenkins multi-branch pipeline, the existing plugin seems broken.

My advice: try not to use the Jenkins plugin if possible.

Good, it’s time to implement [skip ci] myself.

If you like me used Jenkins shared library, you can create a function like SkipCI from src/org/cicd/utils.groovy, then other jobs can reused this function.

// src/org/cicd/utils.groovy
def SkipCI(number = "all"){
def statusCodeList = []

String[] keyWords = ['ci skip', 'skip ci'] // add more keywords if need.
keyWords.each { keyWord ->
def statusCode = null
if (number == "all") {
statusCode = sh script: "git log --oneline --all | grep \'${keyWord}\'", returnStatus: true
} else {
statusCode = sh script: "git log --oneline -n ${number} | grep \'${keyWord}\'", returnStatus: true
}
statusCodeList.add(statusCode)
}

if (statusCodeList.contains(0)) {
return true
} else {
return false
}
}

Then I can call this function from other jobs.

// The following is not the complete code, it is just sample code and may not be run successfully.

import org.cicd.utils

def call(){

pipeline {
agent {
node {
label 'linux'
}
}

parameters {
booleanParam defaultValue: true, name: 'Build', description: 'Uncheck to skip build.'
}

def utils = new org.cicd.utils()

stage("Checkout") {
checkout scm

// just check the latest commit message.
SkipCI = utils.SkipCI('1')
}

stage("Build"){
when {
beforeAgent true
expression { return params.Build && !SkipCI }
}

steps {
script {
sh "make build"
}
}
}
}
}

Please let me know if any questions or suggestions.


转载本站文章请注明作者和出处,请勿用于任何商业用途。欢迎关注公众号「DevOps攻城狮」

How to fix "Temporary Failure in name resolution" in WSL

Problem

I have encountered a problem when I ping google.com failed and return some error like “Temporary failure in name resolution”

How to fix

  1. Inside WSL2, create or append file: /etc/wsl.conf

  2. Put the following lines in the file in order to ensure the your DNS changes do not get blown away

    sudo tee /etc/wsl.conf << EOF
    [network]
    generateResolvConf = false
    EOF

Read More

Restrict others from login your important Linux machine

If you have a critical machine like your team’s CI server that runs on Linux, so you don’t want every members in your group to access it.

Modifying this setting /etc/security/access.conf on Linux can do it.

How to setup

I commented out the access settings for TEAM A, and add some user accounts can access.

#+ : (SRV_WW_TEAM_A_CompAdmin) : ALL
+ : shenx, map, xiar : ALL

Read More

C/C++ 代码格式化和静态分析检查的一站式工作流 Cpp Linter

本篇是关于 C/C++ 代码格式化和静态分析检查的实践分享。

目前 C/C++ 语言的代码格式化和检查工具使用的最为广泛的是 LLVM 项目中的 Clang-FormatClang-Tidy

LLVM 项目是模块化和可重用的编译器和工具链技术的集合。

对于 C/C++ 代码格式化和静态分析检查用到是 LLVM 项目中 clang-format 和 clang-tidy,放在一起我们称它为 clang-tools。

虽然我们有了工具,但如何把工具更好的集成到我们的工作流中才是本篇重点要讨论的。

cpp-linter 组织的诞生就是为 C/C++ 代码格式化和静态分析检查提供一站式的工作流,包括:

  1. 方便下载 clang-tools,提供了 Docker images 和 binaries 两种使用方式;
  2. 方便与工作流进行集成,包括与 CI 以及 git hooks 的集成。

下面介绍如何使用 clang-tools 下载工具,以及集成到工作流中。

Read More

How to create GPG keys and add to GitHub

First, List your GPG key

# If folders does not exist will create be related automatically
$ gpg --list-keys
gpg: directory '/home/ubuntu/.gnupg' created
gpg: keybox '/home/ubuntu/.gnupg/pubring.kbx' created
gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created

$ gpg --list-key

Second, generate GPG key

Read More

12 周的陪产假我一刻都没闲着

有幸赶上了公司的政策变化,我有 12 周的陪产假来做全职奶爸,照顾家人的同时希望挤出时间来学习,毕竟在职期间很有有机会能有近 3 个月的假期。

照顾孩子兼顾学习真不是一件轻松的事情,我尽力兼顾了两者,做了如下的流水账记录。

计划

我知道 12 周会很快过去,就在已经快要过去了 2 周时我决定有计划的来完成一些任务,比如:

  • 完成《代码整洁之道》、《重构》以及《动手学习深度学习这三本书》的阅读和豆瓣评论
  • 为 pre-commit 写一个 clang-format 和 clang-tidy 的 cpp-linter-hooks
  • 完成每个月 15 节英语课以及 3~4 的体育锻炼(游泳和足球)
  • 找一个可以作为长期业余参与的开源项目,例如 pytest,tox,pypa。

也就是从休假的第 2 周开始,我开始记录每周的完成的小任务。

Read More

在 Windows 做开发还能这么爽?WSL + VS Code + Docker Desktop 你值得有用

很久以来很多程序员都遇到过在 Windows 做开发的各种不便:

比如设置开发环境不能像 Linux 和 Mac 那样只需要输入一行命令就能安装各种 command 和 package,因此有的程序员从此转到了 Mac 上开发,也有的干脆就使用 Linux 作为开发机,只有那些不得不使用 Windows 作为开发环境程序员还一直留在了 Windows 上继续凑合中。

直到 WSL 的到来,准确来说是 WSL2。

WSL + VS Code + Docker Desktop 这三剑客的组合,开始让我觉得在 Windows 上做开发是一件非常爽的事情。

什么是 WSL

WSL 是 Windows Subsystem for Linux 的缩写,它是 Windows 10 操作系统的一项功能,使你能够在 Windows 上直接运行 Linux 文件系统,以及 Linux 命令行工具和 GUI 应用程序,并与传统的 Windows 桌面和应用程序一起运行。

WSL 的最低版本要求是 Windows 10 version 1903 及更高。

WSL 是专为那些需要使用 Linux 的开发人员所开发的,例如从事网络开发人员、开源项目、以及需要部署到 Linux 服务器环境的开发者。

WSL 适用于喜欢使用 Bash、常用 Linux 工具(sed、awk等)和 Linux 优先框架(Ruby、Python 等),同时也喜欢使用 Windows 作为生产力工具的人。

下面来看看 WSL 和虚拟机相比有哪些优势。

Read More

关于 Docker,containerd,CRI,CRI-O,OCI,runc 的解释以及它们是如何工作在一起的

自 Docker 开启了使用容器的爆发式增长,有越来越多的工具和标准来帮助管理和使用这项容器化技术,与此同时也造成了有很多术语让人感到困惑。

比如 Docker, containerd, CRI, CRI-O, OCI, runc,本篇将介绍这些你听过但并不了解的术语,并解释容器生态系统是如何在一起工作的。

容器生态系统

容器生态系统是由许多令人兴奋的技术、大量的专业术语和大公司相互争斗组成的。

幸运的是,这些公司偶尔会在休战中走到一起合作,商定一些标准,这些标准有助于使这个生态系统在不同的平台和操作系统之间更具互操作性,并减少对单一公司或项目的依赖。

这张图显示了 Docker、Kubernetes、CRI、OCI、containerd 和 runc 在这个生态系统中是如何结合的。

Read More