Docker Buildx Bake:加速构建和管理多平台镜像的利器

随着容器化技术的普及和应用场景的增多,构建和管理多平台镜像变得越来越重要。Docker Buildx 是 Docker 官方对于 Docker CLI 的一个扩展,为 Docker 用户提供了更强大和灵活的构建功能。包括:

  1. 多平台构建:Docker Buildx 允许用户在一个构建命令中为多个不同的平台构建容器镜像。这样,你可以一次性构建适用于多种 CPU 架构的镜像,比如 x86、ARM 等,从而在不同的硬件设备上运行相同的镜像。
  2. 构建缓存优化:Docker Buildx 改进了构建过程中的缓存机制,通过自动识别 Dockerfile 中哪些部分是可缓存的,从而减少重复构建和加快构建速度。
  3. 并行构建:Buildx 允许并行构建多个镜像,提高了构建的效率。
  4. 多种输出格式:Buildx 支持不同的输出格式,包括 Docker 镜像、OCI 镜像、以及 rootfs 等。
  5. 构建策略:通过支持多种构建策略,用户可以更好地控制构建过程,例如,可以在多个节点上构建、使用远程构建等。

使用 docker buildx 需要 Docker Engine 版本不低于 19.03。

其中,Docker Buildx Bake 是 Buildx 的一个子命令,也是本篇文章要重点介绍包括概念、优势、使用场景以及如何使用该功能来加速构建和管理多平台镜像。

什么是 Docker Buildx Bake?

Docker Buildx Bake 是 Docker Buildx 的一项功能,它旨在简化和加速镜像构建过程。Bake 是一种声明式的构建定义方式,它允许用户在一个命令中定义多个构建配置和目标平台,实现自动化批量构建和发布跨平台镜像。

为什么使用 Docker Buildx Bake?

1. 提高构建效率

Bake 通过并行构建和缓存机制来提高构建效率。使用 Bake 可以一次性定义和构建多个镜像,而无需为每个镜像分别执行构建过程,这样可以大大节省构建时间,提高工作效率。

2. 支持多个平台和架构

Docker Buildx Bake 的另一个优势是它能够构建多个平台和架构的镜像。通过在 Bake 配置中指定不同的平台参数就可以轻松构建适用于不同操作系统和架构的镜像。这对于跨平台应用程序的开发和部署非常有用。

3. 一致的构建环境

通过 docker-bake.hcl (除了 HCL 配置文件之外还可以是 JSON 或是 YAML 文件)文件描述构建过程确保一致的构建环境,使不同的构建配置和目标平台之间具有相同的构建过程和结果。这种一致性有助于减少构建过程中的错误,而且构建配置更易于维护和管理。

如何使用 Docker Buildx Bake?

以下是使用 Docker Buildx Bake 进行高效构建的基本步骤,首先确保你已经安装了 Docker Engine 或 Docker Desktop 版本 19.03 以及以上。

然后你的 docker 命令将变成这样 docker buildx bake。以下 docker buildx bake --help 的帮助输出:

docker buildx bake --help

Usage: docker buildx bake [OPTIONS] [TARGET...]

Build from a file

Aliases:
docker buildx bake, docker buildx f

Options:
--builder string Override the configured builder instance
-f, --file stringArray Build definition file
--load Shorthand for "--set=*.output=type=docker"
--metadata-file string Write build result metadata to the file
--no-cache Do not use cache when building the image
--print Print the options without building
--progress string Set type of progress output ("auto", "plain", "tty"). Use plain to show container output (default "auto")
--provenance string Shorthand for "--set=*.attest=type=provenance"
--pull Always attempt to pull all referenced images
--push Shorthand for "--set=*.output=type=registry"
--sbom string Shorthand for "--set=*.attest=type=sbom"
--set stringArray Override target value (e.g., "targetpattern.key=value")

接下来尝试一下如何使用 docker buildx bake

1. 创建 Bake 配置文件

比如创建一个名为 docker-bake.dev.hcl 的 Bake 配置文件,并在其中定义构建上下文、目标平台和其他构建选项。以下是一个简单的示例:

# docker-bake.dev.hcl
group "default" {
targets = ["db", "webapp-dev"]
}

target "db" {
dockerfile = "Dockerfile.db"
tags = ["xianpengshen/docker-buildx-bake-demo:db"]
}

target "webapp-dev" {
dockerfile = "Dockerfile.webapp"
tags = ["xianpengshen/docker-buildx-bake-demo:webapp"]
}

target "webapp-release" {
inherits = ["webapp-dev"]
platforms = ["linux/amd64", "linux/arm64"]
}

2. 运行 Bake 构建

运行以下命令开始使用 Bake 构建镜像:

$ docker buildx bake -f docker-bake.dev.hcl db webapp-release

3. 打印构建选项

你还可以无需构建打印构建选项,使用用 --print 来查看某个目标构建是否符合预期。例如:

$ docker buildx bake -f docker-bake.dev.hcl --print db
[+] Building 0.0s (0/0)
{
"group": {
"default": {
"targets": [
"db"
]
}
},
"target": {
"db": {
"context": ".",
"dockerfile": "Dockerfile.db",
"tags": [
"xianpengshen/docker-buildx-bake-demo:db"
]
}
}
}

4. 发布构建镜像

通过添加 --push 选项可以将构建完成的镜像一键发布的镜像仓库,例如 $ docker buildx bake -f docker-bake.dev.hcl --push db webapp-release

以上示例中的 demo 放在这里了:https://github.com/shenxianpeng/docker-buildx-bake-demo

5. Buildx Bake 高级用法

Buildx Bake 还有其他更多的使用技巧,比如 variable, function , matrix 等这里就不一一介绍了,详情请参见官方 Buildx Bake reference 文档。

总结

Docker Buildx Bake 是一个功能强大的构建工具,它提供了一种简化和加速构建过程的方法。通过使用 Bake 你可以高效地构建和测试多个镜像,并且可以跨多个平台和架构进行构建。所以说 Bake 是开发人员和构建工程师的重要利器,掌握 Docker Buildx Bake 的使用方法将帮助你更好地应对多镜像构建的带来的挑战、加快应用程序的交付速度。


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

详解SBOM:定义、关系、区别、最佳实践和生成工具

什么是 SBOM

SBOM 是软件材料清单(Software Bill of Materials)的缩写。它是一份详细记录软件构建过程中使用的所有组件、库和依赖项的清单。

SBOM 类似于产品的配方清单,它列出了构成软件应用程序的各种元素,包括开源软件组件、第三方库、框架、工具等。每个元素在 SBOM 中都会有详细的信息,如名称、版本号、许可证信息、依赖关系等。

SBOM 的目的是增加软件供应链的可见性和透明度,并提供更好的风险管理和安全性。它可以帮助软件开发者、供应商和用户了解其软件中使用的组件和依赖项,以便更好地管理潜在的漏洞、安全风险和合规性问题。通过 SBOM 用户可以识别和跟踪软件中存在的任何潜在漏洞或已知的安全问题,并及时采取相应的补救措施。

SBOM 还可以用于软件审计、合规性要求和法规遵从性等方面。一些行业标准和法规(如软件供应链安全框架(SSCF)和欧盟网络和信息安全指令(NIS指令))已经要求软件供应商提供 SBOM,以提高软件供应链的安全性和可信度。

总之,SBOM 是一份记录软件构建过程中使用的所有组件和依赖项的清单,它提供了对软件供应链的可见性,有助于管理风险、提高安全性,并满足合规性要求。

SBOM 和 SLSA 之间有什么关系,两者的区别是什么

SBOM(软件材料清单)和 SLSA(Supply Chain Levels for Software Artifacts)是两个不同但相关的概念。

  • SBOM 是软件材料清单,它提供了对软件供应链的可见性,包括组件的版本、许可证信息、漏洞等。SBOM 旨在帮助组织更好地管理和控制软件供应链,识别和处理潜在的漏洞、合规性问题和安全风险。
  • SLSA 是一种供应链安全框架,它定义了不同级别的安全要求和实践,以确保软件供应链的安全性。SLSA 旨在加强软件的可信度和安全性,防止恶意代码、供应链攻击和漏洞的传播。SLSA 关注整个软件供应链的安全,包括组件的来源、验证、构建过程和发布机制。

关于两者的区别:

  1. 视角不同:SBOM 关注软件构建物料的清单和可见性,提供对组件和依赖项的详细信息。SLSA 关注供应链的安全性,定义了安全级别和实践,强调确保软件供应链的可信度和安全性。
  2. 用途不同:SBOM 用于识别和管理软件构建中的组件、漏洞和合规性问题。它提供了一种管理软件供应链风险的工具。SLSA 则提供了一种安全框架,通过定义安全级别和要求,帮助组织确保软件供应链的安全性。
  3. 关联性:SLSA 可以利用 SBOM 作为其实施的一部分。SBOM 提供了 SLSA 所需的组件和依赖项的详细信息,有助于验证和审计供应链的安全性。SLSA 的实践可以包括要求使用 SBOM 生成和验证,以确保软件供应链的可见性和完整性。

SBOM 和 SLSA 都是软件供应链安全中的两个关键概念。它们可以相互关联和互补使用,以加强软件供应链的安全性和管理。

SBOM 和 Black Duck 之间有什么区别

SBOM(Software Bill of Materials)和 Synopsys BlackDuck 是两个相关但不同的概念。下面是它们之间的区别:

SBOM:

  1. 定义:SBOM 是一种文档或清单,用于记录软件构建过程中使用的所有组件和依赖项。它提供了对软件供应链的可见性和透明度。
  2. 内容:SBOM 列出了每个组件的名称、版本号、作者、许可证信息等详细信息。它有助于追踪和管理软件的组件、依赖关系、漏洞和许可证合规性等。
  3. 用途:SBOM 用于软件供应链管理、安全审计、合规性验证和风险管理。它帮助组织了解软件构建中使用的组件,识别潜在的漏洞和风险,并确保合规性。

Synopsys Black Duck:

  1. 功能:Synopsys Black Duck 是一种供应链风险管理工具。它可以扫描软件项目,识别其中使用的开源组件和第三方库,并分析其许可证合规性、安全漏洞和其他潜在风险。
  2. 特点:Black Duck 具有广泛的漏洞数据库和许可证知识库,可与开发流程和 CI/CD 工具集成,提供漏洞警报、许可证合规报告和风险分析等功能。
  3. 目的:Black Duck 帮助组织管理和控制软件供应链风险,提供实时的开源组件和第三方库的安全和合规性信息,以支持决策和采取适当的措施。

综上所述,SBOM 是记录软件构建中使用的组件和依赖项,提供对软件供应链的可见性和管理。而 Black Duck 是一种供应链风险管理工具,通过扫描和分析软件项目中的开源组件和第三方库,提供许可证合规性、安全漏洞和风险分析等功能。Black Duck 可以用于生成 SBOM,并提供更全面的风险和合规性分析。因此,Black Duck 是一个具体的工具,而 SBOM 是一种记录和管理软件供应链信息的概念。

SBOM 的最佳实践

  1. 自动化生成:使用自动化工具生成 SBOM,避免手动创建和维护,确保准确性和一致性。
  2. 包含详细信息:在 SBOM 中包含尽可能详细的信息,如组件名称、版本号、作者、许可证信息、依赖关系、漏洞信息等。
  3. 定期更新:定期更新 SBOM 以反映最新的构建物料清单,确保其准确性和完整性。
  4. 版本控制:对于每个软件版本,建立和管理相应的 SBOM 版本,以便跟踪软件版本和其对应的构建物料清单。
  5. 集成到软件生命周期:将 SBOM 集成到整个软件生命周期中,包括开发、构建、测试、部署和维护阶段。
  6. 漏洞管理和风险评估:利用 SBOM 中的漏洞信息,与漏洞数据库集成,进行漏洞管理和风险评估。
  7. 供应商合作:与供应商和合作伙伴共享和获取 SBOM 信息,确保他们也提供准确的 SBOM,并持续关注他们的漏洞管理和合规性措施。

SBOM 的生成工具

  1. CycloneDX:CycloneDX 是一种开放的软件组件描述标准,用于生成和共享 SBOM。它支持多种语言和构建工具,具有广泛的生态系统和工具集成。
  2. SPDX:SPDX(Software Package Data Exchange)是一种开放的标准,用于描述软件组件和相关许可证信息。它提供了一种统一的方式来生成和交换SBOM。
  3. OWASP Dependency-Track:Dependency-Track 是一个开源的供应链安全平台,可生成和分析 SBOM,提供漏洞管理、许可证合规性和供应链可视化等功能。
  4. WhiteSource: WhiteSource 是一种供应链管理工具,提供了自动化的开源组件识别、许可证管理和漏洞分析,可以生成SBOM并进行风险评估。
  5. JFrog Xray:JFrog Xray 是一种软件供应链分析工具,可以扫描和分析构建物料清单,提供漏洞警报、许可证合规性和安全性分析。
  6. Microsoft sbom-tool:是一种高度可扩展、适用于企业的工具,可为各种工件创建 SPDX 2.2 兼容的 SBOM。
  7. trivy:支持在容器、Kubernetes、代码存储库、Cloud 等中查找漏洞、错误配置、密钥 和生成 SBOM。

除了以上这些还有一些其他工具也提供了 SBOM 生成、管理和分析的功能,你可以根据具体需求选择适合的工具来实施 SBOM 的最佳实践。

总结

希望通过这篇文章,让你了解了 SBOM 的概念、与 SLSA 和 Black Duck 的关系和区别、最佳实践以及可用的生成工具来帮助更好地管理软件供应链安全。

如果你是项目成员,是 Fork 原始仓库还是直接原始仓库中修改代码?

想必你也见到过很多开源项目中的 CONTRIBUTION.md 文档中通常都会让贡献者 Fork 仓库,然后做修改。

那么如果你是该开源项目中的成员是否需要 Fork 仓库进行修改呢?

以前我没有认真去想过这个问题,对于项目成员感觉 Fork 或不 Fork 好像差不多,但仔细想想 Fork 仓库与不 Fork 仓库其实是有以下几个主要的差别的:

修改权限

在原始仓库中,你可能没有直接修改代码的权限,当你 Fork 一个仓库时,会创建一个属于你自己的副本,你可以在这个副本中拥有完全的修改权限,你可以自由地进行更改、添加新功能、解决bug等,而不会对原始仓库产生直接影响。

做实验性的工作

如果你计划进行较大的修改或实验性工作,并且不希望直接影响原始仓库,那么 fork 仓库并在 fork 的中进行修改更为合适。

比如你需要实验性的去大量清理现有仓库里的一些垃圾文件或是代码,如果你需要需要多次尝试,并将多次修改直接 git push 到推送原始仓库进行保存或是测试,这大大增加原始仓库的存储空间,如果你的修改是大型文件,那么对原始仓库的存储空间影响则会更大;如果你是 Fork 仓库则不会造成原始仓库的影响,直到你完成修改通过 Pull Request 合并到原始仓库时才会产生新的存储空间。

代码审查和协作

当你 Fork 一个仓库并在自己的副本中进行修改后,你必须通过 Pull Request(PR)向原始仓库合并修改,有助于确保代码质量和功能正确性。(当然不 Fork 也可以这样做或不做,但 Fork 了就必须这样做了)

版本控制和历史记录

Fork 一个仓库后,你可以在自己的副本中维护独立的版本控制历史。你可以跟踪自己的更改、回溯历史、管理代码版本,而不会影响到原始仓库的版本控制。同时,你可以从原始仓库同步最新的更改,保持你的副本与原始仓库的同步。

总结

Fork 仓库与不 Fork 仓库的主要差别在于修改权限、做实验性的工作、代码审查和协作,以及版本控制和历史记录。

个人认为只要一个仓库的贡献者超过 3 人,都建议所有人都 Fork 原始仓库,通过 Pull Request 方式合并代码。

但也有例外情况可能不适合 Fork:项目在 Fork 之后 CI/CD 无法独立工作,但是你需要它们。比如 Fork 后的仓库因为环境等原因不支持独立的运行 CI/CD 而你需要在提交 Pull Request 之前通过自动化对分支进行测试。

另外还要为原始仓库需要做适当的分支权限设置,以防止就算两个人的团队另外一个人不熟悉 Git 使用了非常危险的操作,比如强制推送(Force Push),变基(Rebasing),强制检出(Force Checkout)可能导致代码丢失、数据损坏或版本控制问题。


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

程序员自我修养之Git提交信息和分支创建规范(工具篇)

Git 提交信息和 Git 分支命名规范是团队协作中非常重要的一部分,它们能够使代码库更加规范、易于维护和理解。

我们需要通过工具来帮助实现Git提交信息和分支创建规范,本篇将介绍如何使用 Commit Check 这个工具来验证提交信息、分支命名、提交用户名字、提交用户邮箱等是否符合规范。

更多关于Git提交信息和分支创建规范可以参看我之前发布的文章《程序员自我修养之Git提交信息和分支创建规范》,这里不再赘述。

Commit Check 简介

Commit Check 是一个可以检查 Git 提交信息,分支命名、提交者用户名、提交者邮箱等等。它是 Yet Another Commit Checker 的开源平替版。

Commit Check 的配置

使用默认设置

如果没有进行自定义设置,Commit Check 会使用默认设置。具体设置在此

默认设置中,提交信息遵循约定式提交,分支命名见分支模型详细信息

使用自定义配置

你可以在你的 Git 仓库下创建一个配置文件 .commit-check.yml 来自定义设置,例如:

checks:
- check: message
regex: '^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test){1}(\([\w\-\.]+\))?(!)?: ([\w ])+([\s\S]*)|(Merge).*|(fixup!.*)'
error: "The commit message should be structured as follows:\n\n
<type>[optional scope]: <description>\n
[optional body]\n
[optional footer(s)]\n\n
More details please refer to https://www.conventionalcommits.org"
suggest: please check your commit message whether matches above regex
- check: branch
regex: ^(bugfix|feature|release|hotfix|task)\/.+|(master)|(main)|(HEAD)|(PR-.+)
error: "Branches must begin with these types: bugfix/ feature/ release/ hotfix/ task/"
suggest: run command `git checkout -b type/branch_name`
- check: author_name
regex: ^[A-Za-z ,.\'-]+$|.*(\[bot])
error: The committer name seems invalid
suggest: run command `git config user.name "Your Name"`
- check: author_email
regex: ^\S+@\S+\.\S+$
error: The committer email seems invalid
suggest: run command `git config user.email yourname@example.com`

你可以根据自己的需要来修改 regex, error, suggest 的值。

Commit Check 使用

Commit Check 支持多种使用方式

以 GitHub Action 来运行

例如创建一个 GitHub Action workflow 文件 .github/workflows/commit-check.yml

name: Commit Check

on:
push:
pull_request:
branches: 'main'

jobs:
commit-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: commit-check/commit-check-action@v1
with:
message: true
branch: true
author-name: true
author-email: true
dry-run: true
job-summary: true

详细请参考 https://github.com/commit-check/commit-check-action

以 pre-commit hook 运行

首选需要安装了 pre-commit

然后将如下设置添加到你的 .pre-commit-config.yaml 文件中。

-   repo: https://github.com/commit-check/commit-check
rev: the tag or revision
hooks: # support hooks
- id: check-message
- id: check-branch
- id: check-author-name
- id: check-author-email

以命令行来运行

可以通过 pip 先安装

pip install commit-check

然后运行 commit-check --help 命令就可以查看如何使用了,具体可以参见文档

以 Git Hooks 来运行

要配置 Git Hooks ,你需要在 Git 存储库的 .git/hooks/ 目录中创建一个新的脚本文件。

例如 .git/hooks/pre-push,文件内容如下:

#!/bin/sh
commit-check --message --branch --author-name --author-email

并修改为可执行权限 chmod +x .git/hooks/pre-push,然后当你运行 git push 命令时,这个 push hook 会自动执行。

Commit Check 执行失败示例

检查提交信息失败

Commit rejected by Commit-Check.

(c).-.(c) (c).-.(c) (c).-.(c) (c).-.(c) (c).-.(c)
/ ._. \ / ._. \ / ._. \ / ._. \ / ._. \
__\( C )/__ __\( H )/__ __\( E )/__ __\( C )/__ __\( K )/__
(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)
|| E || || R || || R || || O || || R ||
_.' '-' '._ _.' '-' '._ _.' '-' '._ _.' '-' '._ _.' '-' '._
(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)
`-´ `-´ `-´ `-´ `-´ `-´ `-´ `-´ `-´ `-´

Invalid commit message => test
It doesn't match regex: ^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test){1}(\([\w\-\.]+\))?(!)?: ([\w ])+([\s\S]*)

The commit message should be structured as follows:

<type>[optional scope]: <description>
[optional body]
[optional footer(s)]

More details please refer to https://www.conventionalcommits.org
Suggest: please check your commit message whether matches above regex

检查分支命名失败

Commit rejected by Commit-Check.

(c).-.(c) (c).-.(c) (c).-.(c) (c).-.(c) (c).-.(c)
/ ._. \ / ._. \ / ._. \ / ._. \ / ._. \
__\( C )/__ __\( H )/__ __\( E )/__ __\( C )/__ __\( K )/__
(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)(_.-/'-'\-._)
|| E || || R || || R || || O || || R ||
_.' '-' '._ _.' '-' '._ _.' '-' '._ _.' '-' '._ _.' '-' '._
(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)(.-./`-´\.-.)
`-´ `-´ `-´ `-´ `-´ `-´ `-´ `-´ `-´ `-´

Commit rejected.

Invalid branch name => test
It doesn't match regex: ^(bugfix|feature|release|hotfix|task)\/.+|(master)|(main)|(HEAD)|(PR-.+)

Branches must begin with these types: bugfix/ feature/ release/ hotfix/ task/
Suggest: run command `git checkout -b type/branch_name`

以上就是 Commit Check 的使用介绍了,更多新信息请参考 https://github.com/commit-check/commit-check


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

Jenkins agent service can not start automatically on Windows

What’s the issue

My Windows build machine is regular reboot after Windows updates, but my Jenkins agent service on this Windows can not
start automatically even I have set the startup type to Automatic.

Windows Service Config 2

Solution 1

After some research, select “Allow service to interact with desktop” with service properties on Log On tab can fix this problem.

In service properties -> Log On -> Select “Local System account” and select the checkbox for “Allow service to interact with desktop”.

Windows Service Config 2

Solution 2

Read More

SLSA 框架与软件供应链安全防护

随着近些年针对软件供应链发起的攻击次数越来越多,Google 发布了一系列指南来确保软件包的完整性,目的是为了防止未经授权的代码修改影响软件供应链。

Google 的 SLSA 框架(Supply-chain Levels for Software Artifacts 软件制品的供应链级别)是通过识别 CI/CD 流水线中的问题并减小影响,为实现更安全的软件开发和部署流程提供建议。

目录

  1. 什么是SLSA
  2. 软件供应链中的问题
    2.1 供应链攻击包括哪些
    2.2 真实世界的例子
  3. SLSA等级
    3.1 详细解释
    3.2 限制
  4. SLSA落地
  5. 其他工具

什么是SLSA

SLSA 全名是 Supply chain Levels for Software Artifacts, or SLSA (发音“salsa”).

SLSA 是一个端到端框架,一个标准和控制的清单确保软件构建和部署过程的安全性,防止篡改源代码、构建平台以及构件仓库而产生的威胁。

软件供应链中的问题

任何软件供应链都可能引入漏洞,随着系统变得越来越复杂,做好最佳实践从而保证交付工件的完整性变得非常重要。如果没有一定的规范和系统发展计划,就很难应对下一次黑客攻击。

供应链攻击包括哪些

Supply Chain Threats

A 提交未经认证的修改
B 泄露源码仓库
C 从被修改源代码构建
D 泄露构建过程
E 使用已泄露的依赖
F 上传被修改的包
G 泄露了包仓库
H 使用已泄露的包

真实世界的例子

完整性威胁 已知例子 SLSA 如何提供帮助
A 提交未经认证的修改 研究人员试图通过邮件列表上的
补丁程序故意将漏洞引入 Linux 内核。
两人审查发现了大部分(但不是全部)漏洞。
B 泄露源码仓库 PHP:攻击者破坏了 PHP 的自托管
git 服务器并注入了两个恶意提交。
一个受到更好保护的源代码平台
将成为攻击者更难攻击的目标。
C 从被修改源代码构建 Webmin:攻击者修改了构建基础设施
以使用与源代码控制不匹配的源文件。
符合 SLSA 标准的构建服务器会生成出处,
以识别实际使用的来源,从而使消费者能够检测到此类篡改。
D 泄露构建过程 SolarWinds:攻击者破坏了构建平台
并安装了在每次构建期间注入恶意行为的植入程序。
更高的 SLSA 级别需要对构建平台进行更强大的安全控制,
这使得妥协和获得持久性变得更加困难。
E 使用已泄露的依赖 event-stream:攻击者添加了一个无害的依赖项,然后更新了该依赖项
以添加恶意行为。更新与提交到 GitHub 的代码不匹配(即攻击 F)。
递归地将 SLSA 应用于所有依赖项会阻止这个特定的向量,因为
出处会表明它不是由适当的构建器构建的,或者源不是来自 GitHub。
F 上传被修改的包 CodeCov:攻击者使用泄露的凭据将恶意工件上传到
Google Cloud Storage(GCS),用户可以从中直接下载。
GCS 中工件的出处表明工件不是以
预期的方式从预期的源代码库中构建的。
G 泄露了包仓库 对包镜像的攻击:研究人员为几个流行的
包存储库运行镜像,这些镜像可能被用来提供恶意包。
与上面的 (F) 类似,恶意工件的来源表明它们不是
按预期构建的,也不是来自预期的源代码库。
H 使用已泄露的包 Browserify typosquatting:攻击者
上传了一个与原始名称相似的恶意包。
SLSA 不直接解决这种威胁,但将出处链接回源代码控制
可以启用和增强其他解决方案。

SLSA等级

Read More

如何在 DevOps 任务中使用 ChatGPT?

随着 DevOps 的流行,越来越多的开发团队正在寻找一些工具来帮助他们更好地完成任务。ChatGPT 是一款基于人工智能的自然语言处理工具,它可以用来帮助开发团队在 DevOps 任务中更加高效地工作。

本文将探讨如何在 DevOps 任务中使用 ChatGPT。

一、ChatGPT 简介

ChatGPT 是一款由 OpenAI 开发的人工智能自然语言处理工具。它可以用于许多不同的应用程序,例如语音识别、自然语言处理、文本生成等。
ChatGPT 使用深度学习技术,可以生成与输入内容相关的文本。它是一款非常强大的工具,可以帮助开发团队更加高效地工作。

二、ChatGPT 在 DevOps 中的应用

在 DevOps 中,开发团队通常需要快速解决问题,并与团队成员和客户进行有效沟通。ChatGPT 可以用来帮助解决这些问题。

  1. 自动化代码审查
    开发团队通常需要花费大量时间来进行代码审查。ChatGPT 可以用来自动化这个过程。它可以根据代码库中的样本代码,生成与样本代码风格相似的代码,并对新代码进行审查。这可以帮助开发团队更快地进行代码审查,并减少人为错误的可能性。

  2. 自动化测试
    测试是 DevOps 中不可或缺的一部分。ChatGPT 可以用来自动化测试。它可以根据测试用例生成相应的测试代码,并对测试结果进行评估。这可以帮助开发团队更快地进行测试,并减少人为错误的可能性。

  3. 自动化部署
    部署是 DevOps 中不可或缺的一部分。ChatGPT 可以用来自动化部署。它可以根据部署规则生成相应的部署代码,并对部署结果进行评估。这可以帮助开发团队更快地进行部署,并减少人为错误的可能性。

  4. 自动化文档生成
    文档是 DevOps 中不可或缺的一部分。ChatGPT 可以用来自动化文档生成。它可以根据项目的代码库和测试用例生成相应的文档,并对文档的质量进行评估。这可以帮助开发团队更快地生成文档,并减少人为错误的可能性。

三、如何使用 ChatGPT

要使用 ChatGPT,开发团队需要进行以下步骤:

Read More

为什么我的 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攻城狮」