以这个基本的构建管道(带有 gradle 任务)为例:
根据 Jez Humble 的“Continuous Delivery”一书,您应该只构建一次二进制文件。所以在上面的理论管道中,在第 1 步中我们清理、编译和构建 WAR,在第 2 步中我们运行集成测试(使用第 1 步中编译的代码),在第 3 步中我们运行验收测试(使用编译后的代码)步骤 1 中的代码),并在步骤 4 中部署 WAR(在步骤 1 中构建)。到现在为止还挺好。
我正在尝试在 Jenkins 中实现这个管道。因为每个作业都有自己的工作区,所以第 2、3 和 4 步最终会重新编译代码并构建 WAR,这违反了只构建一次二进制文件的“持续交付”准则。
为了解决这个问题,我使用了“克隆工作区 SCM ”Jenkins 插件,它将从第一个构建中压缩工作区,并成为构建 2、3 和 4 的工作区源。但是,gradle 仍然重新编译每个构建中的代码步骤,因为它显然使用文件的绝对路径来确定是否需要执行任务。由于插件将文件移动到了新的工作空间,因此绝对路径发生了变化,这让 gradle 认为它需要从头开始而不是执行增量构建。
现在我们可以在 Jenkins 中共享工作区,但由于可能有两个作业针对共享工作区运行,因此这也令人不悦。
那么如何在坚持持续交付、Jenkins 和 Gradle 的最佳实践的同时,使用 Jenkins 和 Gradle 实现上述管道呢?
我正在云中的 VSTS 上构建 .net core asp.net 应用程序。设置此选项时,它与我的 .net 框架的其他构建管道不同,因为您不选择要构建的解决方案,而是提供可以找到项目文件的相对(通配符)路径。
对我来说,这最终是:Portal/API/**/*.csproj
问题是,在这条路径中还有一些项目文件,我不想将其构建为该特定管道的一部分。
我尝试通过执行以下操作从构建中删除特定路径,^Portal/API/Services/IdentityServer/**/*.csproj但这没有效果。我真的宁愿不必直接指定我想要构建的所有项目,因为然后我将不得不添加应包含的任何新项目(基本上是除身份服务器项目之外的所有项目)。
那么,我可以排除通配符路径包含的项目吗?
更新。 根据这个页面:
https://blogs.infosupport.com/tfs2015-build-tasks-the-wildcard-format-explained/
我应该能够编写,Portal/API/**/*.csproj;-:Portal/API/Services/IdentityServer/**/*.csproj但这不起作用,并且使用此配置,构建存在错误,指出:未找到项目。
我目前正在使用模板构建和部署应用程序
oc new-app -f ./openshift/template.yaml
Run Code Online (Sandbox Code Playgroud)
我使用的是模板,而不是单独的部署、构建等配置,因为我也希望能够传递参数,例如
oc new-app -f ./openshift/template.yaml --p DATABASE_PW=PW
Run Code Online (Sandbox Code Playgroud)
据我所知,这是不可能使用
oc create -f ./openshift/deploymentconfig.yaml --p SOME_PARAM=TEST
Run Code Online (Sandbox Code Playgroud)
现在我也将其集成到了 Jenkins 的构建管道中。我现在的问题是这样的。这在第一次部署时一切正常,但对于重新部署则不起作用。我可以用 Jenkins 重建应用程序,就像
oc start-build my-app
Run Code Online (Sandbox Code Playgroud)
但这会导致我的模板的更改不会被考虑。我也无法使用 new-app,因为它不会替换现有的配置,从而产生与此类似的错误
--> Creating resources ...
error: services "my-app" already exists
....
--> Failed
Run Code Online (Sandbox Code Playgroud)
有办法解决这个问题吗?也许像命令一样new-app replace所有配置都被替换?我目前正在解决这个问题,方法是使用 shell 文件完全终止该应用程序,然后再次启动它;但这总是会导致几分钟的停机时间,这确实让我很烦恼。
command-line-interface jenkins build-pipeline openshift openshift-client-tools
我有一个dotnet core在本地构建良好的项目,但多次抛出以下错误:
Retrying 'FindPackagesByIdAsync' for source 'https://mycontrol.pkgs.visualstudio.com/_packaging/f8292c33-blah-blah-blah-e5e14bb9ba87/nuget/v3/flat2/microsoft.net.test.sdk/index.json'.
Response status code does not indicate success: 401 (Unauthorized).
Run Code Online (Sandbox Code Playgroud)
此错误出现在项目中使用的每个包的 VSTS 构建日志中。
打开链接显示:
{
$id: "1",
innerException: null,
message: "Can't find the package 'microsoft.net.test.sdk' in feed 'MyFeeds'.",
typeName: "Microsoft.VisualStudio.Services.NuGet.WebApi.Exceptions.PackageNotFoundException, Microsoft.VisualStudio.Services.NuGet.WebApi",
typeKey: "PackageNotFoundException",
errorCode: 0,
eventId: 3000
}
Run Code Online (Sandbox Code Playgroud)
虽然我NuGet.Config在项目文件夹中没有一个,但我在父文件夹中有一个:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="_nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
<add key="_myget.org" value="https://dotnet.myget.org/F/mstestv2/api/v3/index.json" />
</packageSources>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我也会收到此错误(但仅限于日志中的 1 或 2 个包):
C:\hostedtoolcache\windows\dotnet\sdk\2.1.701\NuGet.targets(121,5): error : Failed to retrieve information about 'specflow' from …Run Code Online (Sandbox Code Playgroud) 在我的 azure devops 项目中,我使用模板创建了一个管道。这是我的构建管道的主要 yaml 文件
name: Test-$(Date:yyyyMMdd)$(Rev:.r)
resources:
repositories:
- repository: api
type: git
name: porject/api
ref: master
- repository: front
type: git
name: project/front
ref: master
- repository: strapi
type: git
name: project/strapi
ref: master
trigger:
branches:
include:
- master
pool:
vmImage: 'ubuntu-latest'
workspace:
clean: all
variables:
- name: workingDir
value: project
- name: tfVersion
value: 0.12.29
- name: backendServiceGCP
value: test
- name: backendGCPBucketName
value: test
- name: tfpath
value: test
- name: env
value: dev
stages: …Run Code Online (Sandbox Code Playgroud) 因此,我一直在构建一个构建管道,每当向 master 发出拉取请求时就会触发该管道,因此我们有一个分支策略,使得对 master 分支的唯一更改是通过拉取请求。
我希望构建管道检查 PR 的源分支,并作为构建管道的一部分对源分支进行一些提交。我以为我可以只使用该Build.SourceBranchName变量,但是当触发管道时,SourceBranchName 是 master。所以我无法使用它。
有什么简单的方法可以做到这一点吗?
完成Windows平台的构建(exe)后,我必须将两个文本文件和一个文件夹复制到我的构建数据文件夹中。每次构建时,我都想将这些文件和文件夹从资产复制到构建数据文件夹。这可以统一吗?因为有时我忘记在数据文件夹中复制所需的文件,而我的播放器无法正常工作。
我是 Aure Dev Ops 的新 CI/CD 领域。所以我创建了一个测试 ASP.NET MVC 应用程序。我在 Visual Studio Online 的 git repo 中签入了该应用程序。我的构建管道工作正常,但ms build似乎找不到我发布的文件所在位置的配置。这是我msbuild configuration的yml文件:
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
Run Code Online (Sandbox Code Playgroud)
在我的发布管道中,我使用了copy task以下内容yml
steps:
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)/deploy'
inputs:
SourceFolder: '$(build.artifactStagingDirectory)'
TargetFolder: '$(Build.ArtifactStagingDirectory)/deploy'
Run Code Online (Sandbox Code Playgroud)
这是我尝试部署发布时遇到的错误:
##[error]Unhandled: Not found SourceFolder: D:\a\r1\a\$(build.artifactStagingDirectory)
Run Code Online (Sandbox Code Playgroud) yaml build-pipeline azure-devops azure-pipelines-release-pipeline
今天,我试图在 NuGet 还原阶段修复来自多个来源的构建管道,但无法找到要使用的正确设置。
我有三个不同来源的包,
我使用以下 Yaml 设置了 azure 构建管道
该项目是一个简单的 hello world 控制台应用程序,用 c# .net core 3.1 编写
当我在本地构建或发布该项目时,我得到以下输出:
但是,通过构建管道发布的工件为我提供了以下文件:
所以在这里,文件大小更小,更重要的是 TestYaml.exe 丢失了,并被 TestYaml 文件替换。
这应该相当简单,但我不明白缺少什么。
先谢谢您的帮助!
build-pipeline ×11
azure-devops ×8
jenkins ×2
yaml ×2
.net ×1
.net-core ×1
asp.net-core ×1
azure ×1
azure-pipelines-release-pipeline ×1
build ×1
build-agent ×1
c# ×1
devops ×1
gradle ×1
openshift ×1