Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD (4)

在 Fork 的仓库里面,我新建了一个 Readme.md 文件,然后点击创建合并,这个时候你看 Gogs 的 WebHook 推送记录就有一条新的数据推送给 Jenkins,同时你也可以在 Jenkins 看到流水线任务被触发了。

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

3.4 限定任务触发条件

通过上面的步骤,我们已经将 Gogs 和 Jenkins 中的具体任务进行了绑定。不过还有一个比较尴尬的问题是,Gogs 的合并事件不仅仅包括创建合并,它的原始描述是这样说的。

合并请求事件包括合并被开启、关闭、重新开启、编辑、指派、取消指派、更新标签、清除标签、设置里程碑、取消设置里程碑或代码同步。

如果我们仅仅是依靠上面的配置,那么上述所有行为都会触发构建操作,这肯定不是我们想要的效果。还好 Generic Webhook 为我们提供了变量获取,以及 Webhook 过滤。

我们从 Gogs 发往 Jenkins 的请求中可以看到,在 JSON 内部包含了一个 action 字段,里面就是本次的操作标识。那么我们就可以想到通过判断 action 字段是否等于 opened 来触发流水线任务。

首先,我们增加 4 个 Post content parameters 参数,分别获取到 Gogs 传递过来的 action 和 PR 的 Id,这里我解释一下几个文本框的意思。

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

除了这两个 Post 参数以外,在请求头中,Gogs 还携带了具体事件,我们将其一起作为过滤条件。**需要注意的是,针对于请求头的参数,在转换成变量时,插件会将字符转为小写,并会使用 '_' 代替 '-'。**

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

最后我们编写一个 Optional filter ,它的 Expression 参数是正则表达式,下面的 Text 即是源字符串。实现很简单,当 Text 里面的内容满足正则表达式的时候,就会触发流水线任务。

所以我们的 Text 字符串就是由上面三个变量的值组成,然后和我们预期的值进行匹配即可。

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

当然,你还想整一些更加炫酷的功能,可以使用 Jenkins 提供的 Http Request 之类的插件。因为 Gogs 提供了 API 接口,你就可以在构建完成之后,回写给 Gogs,用于提示构建结果。

这样的话,这种功能就有点像 Github 上面的机器人帐号了。

四、完整的项目示例

在上一节我们通过 Jenkins 的插件完成了远程仓库推送通知,当我们合并代码时,Jenkins 会自动触发执行我们的管道任务。接下来我将建立一个 .NET Core 项目,该项目拥有一个 Controller,接收到请求之后输出 “Hello World”。随后为该项目建立一个 xUnit 的测试项目,用于执行单元测试。

整个项目的结构如下图:

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

我们需要编写一个 UnitTest.Dockerfile 镜像,用于执行 xUnit 单元测试。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 # 还原 NuGet 包。 WORKDIR /home/app COPY ./ ./ RUN dotnet restore ENTRYPOINT ["dotnet", "test" , "--verbosity=normal"]

之后为部署操作编写一个 Deploy.Dockerfile ,这个 Dockerfile 首先还原了 NuGet 包,然后通过 dotnet publish 命令发布了我们的网站。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 as build-image # 还原 NuGet 包。 WORKDIR /home/app COPY ./ ./ RUN dotnet restore # 发布镜像。 COPY ./ ./ RUN dotnet publish ./TestProject.WebApi/TestProject.WebApi.csproj -o /publish/ FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 WORKDIR /publish COPY --from=build-image /publish . ENTRYPOINT ["dotnet", "TestProject.WebApi.dll"]

两个 Dockerfile 编写完成之后,将其存放在项目的根目录,以便 Slave 进行构建。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzgfp.html