在 Fork 的仓库里面,我新建了一个 Readme.md 文件,然后点击创建合并,这个时候你看 Gogs 的 WebHook 推送记录就有一条新的数据推送给 Jenkins,同时你也可以在 Jenkins 看到流水线任务被触发了。
3.4 限定任务触发条件通过上面的步骤,我们已经将 Gogs 和 Jenkins 中的具体任务进行了绑定。不过还有一个比较尴尬的问题是,Gogs 的合并事件不仅仅包括创建合并,它的原始描述是这样说的。
合并请求事件包括合并被开启、关闭、重新开启、编辑、指派、取消指派、更新标签、清除标签、设置里程碑、取消设置里程碑或代码同步。
如果我们仅仅是依靠上面的配置,那么上述所有行为都会触发构建操作,这肯定不是我们想要的效果。还好 Generic Webhook 为我们提供了变量获取,以及 Webhook 过滤。
我们从 Gogs 发往 Jenkins 的请求中可以看到,在 JSON 内部包含了一个 action 字段,里面就是本次的操作标识。那么我们就可以想到通过判断 action 字段是否等于 opened 来触发流水线任务。
首先,我们增加 4 个 Post content parameters 参数,分别获取到 Gogs 传递过来的 action 和 PR 的 Id,这里我解释一下几个文本框的意思。
除了这两个 Post 参数以外,在请求头中,Gogs 还携带了具体事件,我们将其一起作为过滤条件。**需要注意的是,针对于请求头的参数,在转换成变量时,插件会将字符转为小写,并会使用 '_' 代替 '-'。**
最后我们编写一个 Optional filter ,它的 Expression 参数是正则表达式,下面的 Text 即是源字符串。实现很简单,当 Text 里面的内容满足正则表达式的时候,就会触发流水线任务。
所以我们的 Text 字符串就是由上面三个变量的值组成,然后和我们预期的值进行匹配即可。
当然,你还想整一些更加炫酷的功能,可以使用 Jenkins 提供的 Http Request 之类的插件。因为 Gogs 提供了 API 接口,你就可以在构建完成之后,回写给 Gogs,用于提示构建结果。
这样的话,这种功能就有点像 Github 上面的机器人帐号了。
四、完整的项目示例在上一节我们通过 Jenkins 的插件完成了远程仓库推送通知,当我们合并代码时,Jenkins 会自动触发执行我们的管道任务。接下来我将建立一个 .NET Core 项目,该项目拥有一个 Controller,接收到请求之后输出 “Hello World”。随后为该项目建立一个 xUnit 的测试项目,用于执行单元测试。
整个项目的结构如下图:
我们需要编写一个 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 进行构建。