Github Actions 与 Jenkins:你应该使用哪个?
“Github Actions Vs Jenkins 是众神之间的较量?!” 哈哈!这只是一个轻松的音符。让我们来解决一些可能困扰您的问题。您的软件开发工作流程如何实现自动化?哪些工具最适合我的软件开发工作流程?是詹金斯吗?是Github Actions吗? Github Actions 好吧,我们来看看一个流行的 CI/CD 工具,Github Actions。 Github Actions
“Github Actions Vs Jenkins 是众神之间的较量?!” 哈哈!这只是一个轻松的音符。让我们来解决一些可能困扰您的问题。您的软件开发工作流程如何实现自动化?哪些工具最适合我的软件开发工作流程?是詹金斯吗?是Github Actions吗?
Github Actions
好吧,我们来看看一个流行的 CI/CD 工具,Github Actions。 Github Actions 是一个事件驱动的持续集成和持续交付工具,可让您自动化构建、测试和部署应用程序到各种环境的过程。事件驱动是指 Github 操作工作流运行以响应您的 Github 存储库中发生的事件,例如拉取请求、推送到分支等。
与 Jenkins 不同,Github Actions 在您的 Github 存储库的框架内运行。这是可能的,因为 Github 为您提供了运行器_(Github 拥有的服务器,可以是 Linux、mac 或 Windows 服务器)_,它为您提供了构建、测试和部署应用程序的环境。 Github 工作流文件是用 YAML 编写的,与使用 Groovy 脚本的 Jenkins 不同。以下是典型的 Github Actions 工作流文件的样子:
使用 YAML 的示例 Github Actions 工作流程
一个典型的工作流文件有一个**name**
、一个**on**
参数,它定义了哪些事件导致管道像推送到主服务器、拉取请求等一样运行,以及一个或多个运行以构建/部署您的应用程序。
我不会深入探讨 Github Actions 的工作原理,但是,您可以在此处了解更多信息。 Github 操作也有一个市场,您可以在其中找到简化构建和部署应用程序过程的预制操作。您可以在市场上找到任何您想做的操作,从构建 nodejs 应用程序到在 Google App Engine 上部署应用程序。这是到市场的链接,因此您可以自己查看。
正如我们之前所说,Github Actions 为您提供免费的运行器_(实际上托管在 Microsoft Azure 上)_ 来构建您的应用程序。这些运行器是免费的,但有一些限制_(了解更多信息_here。) 您也可以使用自托管运行器来构建和部署您的应用程序。您还可以在工作流程中导入存储库机密,这样您就可以避免在工作流程中对任何敏感信息进行硬编码。
Github Actions的优势
好了,既然我们已经基本了解了 Github Actions 是什么,让我们看看使用 Github Actions 与 Jenkins 相比的一些优势:
-
易于使用: Github Actions 非常适合初学者。您只需一个 YAML 文件即可开始使用。对于初创公司/小型公司,您的开发人员可能已经对 YAML 有所了解,因此 Github Actions 作为 CI/CD 平台是一个合乎逻辑的选择。
-
设置和维护: 使用 Jenkins,您将在自定义服务器上运行它。这意味着您必须持续维护 Jenkins 服务器。但是,Github Actions 为您提供了可用于执行 CI/CD 操作的免费运行器。这些运行器由 Github 拥有和维护,但您也可以添加自托管运行器。
Github Action 的缺点
-
锁定: 使用 Github Actions,您或多或少地与 Github 作为源代码管理系统联系在一起。使用 Jenkins 允许您将代码存储在 Github、Gitlab、BitBucket 等的任何存储库中。
-
成熟度: Jenkins 已经存在并且比 Github Actions 更成熟。 Github 操作相对较新,因此社区支持较少。
詹金斯
让我们考虑另一个很棒的工具 Jenkins,您可以使用它来自动化构建工作流程。 Jenkins 只是一个用 Java 编写的开源自动化服务器,用于自动化持续构建、测试和部署软件项目的工作流。为了有效地使用 Jenkins,插件与工具集成,从而增加了功能_(根据项目要求使用插件)_。一些有助于提升 Jenkins 功能并进而增强构建工作流程的插件示例包括:
-
Docker 插件: 使用这个插件,Jenkins 可以自动启动 docker 容器以便在其上运行构建,因为直接在服务器上运行构建可能会产生很大的问题和资源密集型。这是与 Github Action Runners 类似的功能。
-
Slack 插件: Slack 可以与 Jenkins 集成以接收有关项目构建状态的通知。这些消息将发送到您在 Slack 平台上创建的自定义频道。
-
Jira 插件: 通过在 Jenkins 中集成 Jira,可以将有关构建、测试和部署的数据从 Jenkins 发送到 Jira,并且可以在 Jira 中正确跟踪问题。
-
Jenkins 流水线插件: Jenkins 流水线插件的功能是帮助用户仅使用 Jenkinsfile 将构建、测试和部署过程实施到他们的工作流中。这个 Jenkinsfile 可以存储在 SCM 中。如果没有插件,您将无法使用脚本自动创建构建工作流程。相反,您将在界面中指向并单击。安装插件后,它会自动搜索 Jenkinsfile,以便在拉取 repo 时在该脚本内实现构建阶段。
Jenkins 有超过 1,700 多个插件可用。显然,我们不能讨论所有这些,但是通过上面提到的那些,您现在可以了解插件为 Jenkins 带来的功能,这反过来又有助于您的构建工作流程。
上面显示的图像代表一个简单的 Jenkins 工作流,它从 Github 中提取代码,从代码中构建一个 docker 镜像,然后对其进行测试并进一步推送到远程存储库 DockerHub。开发人员向 Github 提交代码,然后由 Jenkins Pipeline 拉取代码并使用 docker 插件构建 docker 镜像。然后测试 docker 映像,如果测试过程失败,则会给出控制台输出。如果通过,镜像会自动推送到 DockerHub。您可以根据需要进一步处理您的构建工作流程并使用上面讨论的插件为其添加更多功能。
上面的 Jenkins 工作流程都可以通过简单地在 Jenkins UI 中指向和单击来手动实现,但是为了充分利用分配给您的时间,必须使构建工作流程更容易,这就是 Jenkins Pipeline Script 或 Jenkinsfile 进来,用于实现 Pipeline-as-Code。为了便于使用,用于 Github Actions 的 YAML 比 Jenkins 的 Groovy 脚本语言更易于使用和实现。由于它的可读性,它更容易构建工作流,因为它是保持逻辑简单的好习惯。编写管道需要逻辑,因此使用 YAML 编写管道比使用 Groovy 更容易。
下面是一个示例 Jenkinsfile, 只是为了提供对如何编写 Jenkinsfile 的基本理解。
使用 Groovy 语法的示例 Jenkins 工作流程
上面的 Jenkinsfile 以pipeline
语法作为起始块开始,agent
语法指定管道的执行器和工作区,stages
块由不同的可执行stage
块组成,stage
块包含实际执行步骤。要了解更多关于 Jenkinsfile 的工作原理以及如何创建自己的文件,您可以查看官方文档。
使用Jenkins的优势
-
使用 Jenkins 的优点之一是它是开源和免费,不像它的对应 Github Actions 是**“免费增值”。**
-
插件可用于支持缓存,其中来自先前构建的文件被缓存并在需要时在新构建中重新实现。
Jenkins的缺点
以下是使用 Jenkins 的一些缺点。
-
Jenkins 有很多插件提供给用户,遗憾的是,其中一些插件不是开发人员经常维护的。因此有必要在使用前检查插件是否支持正确。
-
高度依赖插件,有时很难找到不是插件的基本功能。
-
您必须自己维护和管理 Jenkins 基础架构。
-
由于服务器上负载的不确定性,在远程 (Cloud) 服务器上管理 Jenkins 的成本可能无法预测。这些负载包括代码量、人工制品量、提交次数等。
Github Actions 与 Jenkins: 进一步的比较如下表所示:
! zoz100077](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/9eca07ce79_1*tiw_lGbkebAbFS6K7gEDcg.jpg)
N/B: GitOps 是使用源代码版本控制平台 Git 管理基础架构和配置的实践。
-
异步集成只是意味着同时执行构建,使工作流程更快。至于 Jenkins,同步构建是主要内容。
-
Ad Hoc Workflow:对于在 Github Actions 中发生的构建,它会监视 git 事件触发器。另一方面,Jenkins 可以执行许多作业,例如:运行 bash 脚本、maven buildsm powershell 等。如果您需要运行作业以按顺序定期运行而不链接到代码库,那么 Jenkins 能够做到这一点。
了解每个工具的实际运行情况😉
我们已经对每个工具说了很多,但现在让我们来看看它们中的每一个。我们将在 Github Actions 和 Jenkins 中构建相同的简单 CI/CD 管道,以便构建 docker 镜像并将其推送到 Docker Hub。这是我们的工作流文件在 Github Actions 中的样子:
Github 操作
脚步:
-
Checkout:
checkout
动作用于签出源代码。 -
Uses:这告诉 Github 操作在构建环境中设置什么。
-
设置 Docker Buildx:
setup-buildx-action
用于在 runner 上设置 docker buildx。它提供与 docker build 相同的用户体验,具有许多新功能,例如创建作用域构建器实例和同时针对多个节点进行构建 -
登录 DockerHub: DockerHub 用户名和密码从存储库机密中检索并用于登录 DockerHub。
-
构建和推送: 最后,
build-push-action
从 Dockerfile 构建镜像并推送到 docker hub
你有它!我们已经编写了一个基本的工作流程来构建一个 docker 镜像并将其推送到 DockerHub。确保在存储库机密中设置了必要的机密。只要有推送到主分支,我们的管道就会运行。确保此 YAML 文件位于 .github/workflows 文件夹中。
现在让我们看看詹金斯。
詹金斯
好的,使用 Github Actions 构建了一个简单的管道,它只是构建了一个 docker 镜像并将其推送到 DockerHub。这次让我们使用 Jenkins 复制相同的工作流程。
首先,您需要在本地机器上安装 Jenkins,但使用 docker 进行容器化。好吧,你可能会问,为什么需要在 docker 容器中安装 Jenkins?这就是为什么:
-
可以将配置作为代码进行,因为 Jenkins 服务器的大多数配置都使用 Dockerfile 进行版本控制。
-
部署和扩展相对容易。
为了将 Jenkins 安装为 docker 容器,您可以简单地查看 Jenkins官方文档然后继续进行安装后向导设置帐户。
现在您已经设置好了,让我们继续安装建议的插件。
- 现在您已被引导至**“入门”页面,只需选择**“安装建议的插件”**,然后等待所有插件安装完毕。
- 接下来我们需要在 Jenkins 上安装所需的插件来帮助构建你的 docker 镜像。为此,只需导航至 “Manage Jenkins”。
- 点击**“Available”,然后在搜索栏上,只需搜索“docker”和所需的插件“Docker”、“Docker Pipeline”和“docker-build -step”** 将显示。然后点击**“无需重启即可安装”**。
- 现在让我们继续设置我们的凭据。导航回 Jenkins 仪表板,单击 “Manage Jenkins”,然后单击 “Manage credentials”。
- 然后在域下单击**“全局”**。
! swz 100101 swz 100102 swz 100100
- 然后选择**“添加凭据”,然后使用您的 Docker Hub 详细信息创建一个新凭据,然后单击“确定”。并为您的 Github 帐户添加另一个凭据**。使用您的用户名和密码填写表格,然后填写 ID 和描述。
! swz 100104 swz 100105 swz 100103
- 设置好凭据后,让我们导航回 Jenkins 仪表板并创建我们自己的管道。在仪表板上选择**“新项目”。**
! swz 100107 swz 100108 swz 100106
- 然后指定项目名称然后选择**“Multibranch Pipeline”并点击“OK”**。
! swz 100110 swz 100111 swz 100109
- 现在继续跳过**“General”,直接进入“Branch Sources”。选择“添加源”并在其下选择“Github”,然后指定您的Repository HTTPS URL**,然后单击保存。
NB: 在您希望从中构建 docker 镜像的 Github 存储库内部,它应该包含您的 Jenkinsfile 和一个 dockerfile 指定您稍后将推送到的镜像的构建过程码头工人中心。以下是您可以使用的示例 Jenkinsfile 格式:
**节点{
def app** **stage(‘克隆仓库’) {
结帐单片机
}
阶段('构建图像'){
app u003d docker.build(“dockerhub_username/dockerhub_repository”)
}
stage('测试图像') {
应用程序内部 {
sh ‘echo ‘测试通过’’
}
}
stage('推送图片') {
docker.withRegistry(‘https://registry.hub.docker.com’, ‘dockerhub_id’) {
app.push("${env.BUILD_NUMBER}")
app.push(“最新”)
}
}
}**
上面的代码是用 Scripted Pipeline Syntax (Groovy) 编写的。
注意:要了解脚本化管道和声明性管道之间的区别,请查看Jenkins 官方文档。
-
**node**
定义脚本的开头。在这个node
块内部包含将要执行的阶段。 -
**def app **
创建一个变量**app**
,稍后将为其赋值。 -
**stage(‘Clone repository’)**
块只是按照它所说的去做,它克隆了您在创建多分支管道时输入的 github 存储库。 -
**stage(‘Build image’)**
块从 github 存储库中存在的 dockerfile 构建 docker 映像。 -
**dockerhub_username/dockerhub_repository**
应替换为您的 DockerHub 用户名和您希望将图像推送到的存储库。 -
**stage(‘Test image’)**
只是在控制台中显示“测试通过”。这只是一个简单的命令,没有执行任何真正复杂的命令。但是您可能想要处理此问题并添加功能。 -
**stage(‘Push image’)**
顾名思义就是将 docker 镜像推送到 docker 注册表。
在 Jenkins 中添加 DockerHub 凭证时,* **dockerhub_id**
应替换为您的 DockerHub ID。
- 构建过程完成!已克隆 Git 存储库,已构建 docker 映像,使用**“测试通过”** 作为消息实现了一个简单的测试阶段,最后,映像已被推送到指定的 DockerHub 存储库。
现在我们仔细研究了每个工具的运行情况,您已经清楚地看到了每个工具的功能,因为在这两个工具上实现了相同的工作流程。在易用性方面,Github Action 占了上风。至于 Jenkins,特别是从安装到实现构建工作流程涉及很多,这可能会很麻烦。尽管使用 Github Actions,您几乎只能使用 Github 作为您的版本控制系统,但 Jenkins 可以灵活地选择您的版本控制系统,例如 AccuRev、CVS、Subversion、Git、Mercurial、Perforce、Clearcase、RTC 等。
也许您完全可以完全使用 Github 作为您的版本控制系统,那么 Github Actions 适合您,也许您正在寻找灵活性然后 Jenkins 适合您,或者您可能不愿意为高级服务付费用私有存储库实现 Github Actions,那么也许 Jenkins 适合你。最后,这一切都归结为您以及您的团队希望采用哪种方法。
结论
结束 Github 操作与 Jenkins 的比较;我们已经了解了两个同样流行的 CI/CD 工具,Github Actions 和 Jenkins。我们对这两种工具进行了简要但全面的研究,并讨论了使用其中任何一种的优缺点。我希望您现在能够更好地决定将哪些 CI/CD 工具用于您的下一个项目。为你的前程干杯!谢谢阅读!
加入 FAUN:网站💻**|播客🎙️|Twitter🐦1|(https://twitter.com/joinfaun)🐦3**|Facebook ](https://www.facebook.com/faun.dev/)👥*|Instagram📷|Facebook 群组🗣️|Linkedin 群组💬|Slack📱|** zwz * 新闻](https://thechief.io)📰**|更多.**
如果这篇文章对你有帮助,请多点击下方的鼓掌👏按钮,以表达对作者的支持👇
更多推荐
所有评论(0)