我正在尝试使用 Docker 构建我的 .net 核心应用程序。我想在 build 期间覆盖我的应用程序版本。在运行时稍后的某个地方显示它。
我的 Docker 文件如下所示:
FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /src
RUN apt-get update && \
apt-get install -y libgit2-dev && \
ln -s /usr/lib/x86_64-linux-gnu/libgit2.so /lib/x86_64-linux-gnu/libgit2-15e1193.so
COPY ..
WORKDIR /src/API
RUN dotnet restore
RUN dotnet tool install -g GitVersion.Tool --version=5.0.0-beta1-72
RUN export PATH="$PATH:/root/.dotnet/tools" && \
version="$(dotnet gitversion /output json /showvariable NuGetVersion)" && \
dotnet build --no-restore /property:Version=$version && \
dotnet publish --output "/app" --no-build
FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app .
ENTRYPOINT …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置GitVersion来处理我们项目的语义版本控制 (GitFlow),但它并没有像我预期的那样自动递增。我也在努力阅读项目的文档,这不是最容易理解的。
基本上我们希望建立一个具有 Major.Minor.Patch 约定的版本控制系统,我们手动增加 Major,当一个 release 分支合并到 master 时自动增加 Minor,当一个 feature 分支合并到 develop 时自动增加 Patch。
这是我的当前 GitVersion.yml
mode: ContinuousDeployment
branches:
feature:
increment: Patch
regex: feature?[/-]
release:
increment: Minor
regex: release?[/-]
develop:
regex: develop$
master:
regex: master$
ignore:
sha: []
Run Code Online (Sandbox Code Playgroud)
同样为了测试它,我写了一个小的 ruby 脚本来加速这个乏味的过程。我包含它只是为了确保我以预期的方式使用 GitVersion 和 GitFlow。
require "git"
def new_feature_branch i
g = Git.open(Dir.pwd)
branch_name = "feature/number-#{i}"
g.checkout("develop")
g.branch(branch_name).checkout
open('README.md', 'a') do |f|
f.puts "\r#{i}"
end
g.add("README.md")
g.commit("##{i}")
g.branch("develop").checkout
g.merge(branch_name)
g.branch(branch_name).delete
print(`gitversion`)
end
new_feature_branch(ARGV[0])
Run Code Online (Sandbox Code Playgroud)
输出 gitversion
{
"Major":1, …Run Code Online (Sandbox Code Playgroud) 我在 azure 中有一个存储库,它有默认分支“main”。
另外,我在 yml 文件中有一项用于语义版本控制的任务。
- task: gittools.gitversion.gitversion-task.GitVersion@5
displayName: Get Semantic Git Version
Run Code Online (Sandbox Code Playgroud)
我遇到了以下错误
找不到分支个人/release1 的分支配置,回退到默认配置 System.InvalidOperationException:无法找到“开发”或“主”分支,无论是本地还是远程。
所以,我刚刚创建了一个开发分支并触发了构建,然后语义版本就成功了。
我们不想按照指导方针维护开发或主分支。
在不维护master和develop分支的情况下如何克服错误呢?
谢谢
纳雷什·埃德
我正在运行管道,执行一个简单的任务来安装 git 并通过以下命令检查版本tasks。
一切都运行良好,直到我使用相同的 yaml 文件创建另一个临时管道以进行一些额外的测试和开发。
我没有对 yaml 文件进行任何更改,该文件仍然以绿色运行,具有相同的任务。
但是新管道中的执行任务失败并出现“意外”错误
steps:
- task: gitversion/setup@0
displayName: Install GitVersion
inputs:
versionSpec: "5.10.x"
- task: gitversion/execute@0
displayName: Determine Version
inputs:
useConfigFile: true
configFilePath: ./gitversion.yml
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
Command: dotnet-gitversion /agent/_work/26/s /output json /output buildserver /config /agent/_work/26/s/gitversion.yml
/opt/hostedtoolcache/GitVersion.Tool/5.10.3/x64/dotnet-gitversion /agent/_work/26/s /output json /output buildserver /config /agent/_work/26/s/gitversion.yml
ERROR [09/20/22 12:54:22:24] An unexpected error occurred:
System.NullReferenceException: Object reference not set to an instance of an object.
at LibGit2Sharp.Core.Handles.ObjectHandle.op_Implicit(ObjectHandle handle) in /_/LibGit2Sharp/Core/Handles/Objects.cs:line 509
at LibGit2Sharp.Core.Proxy.git_commit_author(ObjectHandle obj) in /_/LibGit2Sharp/Core/Proxy.cs:line …Run Code Online (Sandbox Code Playgroud) 我正在尝试git fetch从我的构建代理执行完整操作,以便在 TeamCity 中使用GitVersion。
根据http://gitversion.readthedocs.io/en/latest/build-server-support/build-server/teamcity/#agent-checkout,我选择在 TeamCity 中使用代理结帐选项
但是,当我对代理执行结帐时,我无法获取分支的完整 git 历史记录。我得到了与此相同的结果:https : //github.com/GitTools/GitVersion/issues/912 - 具体来说:
System.InvalidOperationException: 无法在本地或远程找到“开发”或“主”分支。
我的猜测是这是因为 TeamCity 只检查了回购历史的一个子集。
Github 问题有一个git fetch在每次构建开始时执行命令的解决方法。这是 TeamCity 可以作为 VCS 根的一部分本身支持的东西吗?
提前致谢
我正在使用 Cake 脚本通过持续集成在 Azure DevOps 中构建我的软件。要求是当我们提交/合并到 dev 或 master 分支时,适当的构建管道被启动。作为此构建的一部分,我们需要自动标记和版本我们的软件。我的蛋糕脚本中已经有以下代码可以使用 GitVersion 将语义版本控制添加到我的构建中:
Task("Version")
.Does(() =>
{
Information("Versioning software for configuration {0} of {1}...", configuration, solution);
GitVersion(new GitVersionSettings {
UpdateAssemblyInfo = true,
OutputType = GitVersionOutput.BuildServer,
WorkingDirectory = toolsDirectory
});
GitVersion versionInfo = GitVersion(new GitVersionSettings{ OutputType = GitVersionOutput.Json });
Information("Semantic Version: " + versionInfo.AssemblySemVer);
Information("Full Semantic Version: " + versionInfo.AssemblySemFileVer);
Information("Informational Version: " + versionInfo.InformationalVersion);
});
Run Code Online (Sandbox Code Playgroud)
我希望团队负责人或权威人士在此代码与分支合并之前增加主要和次要构建版本。或者我希望管道自动对软件和我们在构建管道末尾创建的最终 zip 工件进行版本控制。
所以这里是我的问题:
这有点宽泛,但我正在努力寻找在 …
我正在建立一个新项目,并想使用 GitVersion 来计算我的应用程序的当前版本。我需要的是使用 MAJOR.MINOR.PATCH 进行语义版本控制,其中 MAJOR 和 MINOR 随着发布分支名称的增加而增加,而 PATCH 在每个错误修复或修补程序合并时都会增加。
目前我正在尝试将 GitFlow 实施到我的分支策略中,但我会向您解释我正在做的事情。
问题出在步骤 3 中。例如,当我使用releases/0.1.0时,GitVersion 在bugfix/*合并后不会增加 PATCH 版本。它只是停留在 0.1.0 而不是想要的 0.1.1。它确实增加了提交计数!
目前我正在使用以下 gitversion.yml 文件(请参阅下一个标题)。其中包括一个应该增加补丁的修补程序分支。由于某种原因,在我创建bugfix/*分支后,当您在 bugfix 分支上运行 GitVersion 时,它不会增加 PATCH,所以我认为我在这里遗漏了一些东西。
唯一有效的方法是在bugfix/*分支的最后一次提交上设置一个标签到新版本(0.1.1-test)。但由于 GitVersion 在 bugfix 分支上计算版本 0.1.0,我无法自动升级 PATCH 并在提交上添加所需的 0.1.1-test 标签。
我还认为,当您合并回发布分支时,GitVersion 会增加版本。但即使我将增量设置为“补丁”,这种情况也不会发生。所以在这里,我也想我错过了一些东西,或者我只是想要 GitVersion 不适合的东西。
assembly-versioning-scheme: MajorMinorPatch
mode: ContinuousDeployment
branches:
develop: …Run Code Online (Sandbox Code Playgroud) 根据文档,当使用参数调用dotnet gitversion/updateassemblyinfo时,它将递归搜索git 存储库中的所有AssemblyInfo.cs文件并更新它们。它将更新以下程序集属性:
AssemblySemVer变量。MajorMinorPatch带有附加 .0 的变量。InformationalVersion变量。根据dotnet gitversion不带任何参数调用的输出(从整个 JSON 复制),这些变量当前具有以下值:
问题:是否可以在预定义的GitVersion.yml中或以某种方式通过参数“即时”更改这些变量的值dotnet gitversion?
原因是我当前的项目历史上不遵循 semver 方案,并且每次都需要将版本四重奏的第三部分设置为特定值,无论分支、标签或任何其他 git 特定信息如何。例如,我们的产品版本类似于v1.2.50.10或v02.04.30.01。
但是,即使我们不会充分发挥 semver 兼容版本控制的潜力,使用内置功能dotnet gitversion来更新AssemblyInfo.cs文件也会很好。
我对财产的运作方式感到困惑next-version。我阅读了官方文档,它只有两行“仅服务器作为基础版本”。我认为它会碰撞到我在下一次提交时设置的版本。但显然它不是那样工作的。看起来像是将当前版本号与 中的版本号相加next-version,但事实并非如此。希望有人能进一步解释一下。谢谢。
我想使用 Jenkinsdocker.Image.run()来运行GitVersion。
从bashshell 中,如果我运行
docker run --rm -v "$(pwd):/repo" gittools/gitversion:5.6.6 /repo
Run Code Online (Sandbox Code Playgroud)
...JSON 格式的字符串被发送到 stdout。
我希望我的 Jenkinsfile 能够使用这个标准输出。
我知道我可以从 Jenkinsfile 运行这个 docker 容器,如下所示:
pipeline {
agent any
stages {
stage("1") {
steps {
script {
def img = docker.image("gittools/gitversion:5.6.6")
img.run('-v "$(pwd):/repo"', '/repo')
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用捕获运行容器的标准输出docker.Image.run()?
我知道我可以通过调用捕获容器的标准输出sh,例如
def my_stdout = sh(script: 'docker run --rm -v "$(pwd):/repo" gittools/gitversion:5.6.6 /repo`,
returnStdout:true)
Run Code Online (Sandbox Code Playgroud)
...但是我想具体学习一下,如果可能的话/如何从 Jenkins' 捕获标准输出docker.Image.run(),如所述${JENKINS_URL}/job/${job}/pipeline-syntax/globals#docker
stdout jenkins docker gitversion jenkins-declarative-pipeline
gitversion ×10
azure-devops ×3
git ×3
.net ×2
docker ×2
git-flow ×2
.net-core ×1
assemblyinfo ×1
c# ×1
cakebuild ×1
dockerfile ×1
git-tag ×1
jenkins ×1
jenkins-declarative-pipeline ×1
pipeline ×1
stdout ×1
teamcity ×1
versioning ×1