如何使用GitVersion环境变量

时间:2016-04-30 12:08:44

标签: f# environment-variables f#-fake appveyor gitversion

我有一个项目,我曾经通过AppVeyor构建。构建顺序如下:

  1. 安装并运行GitVersion
  2. 构建项目
  3. 使用评估版本号创建包。
  4. 最后一步是通过PowerShell命令完成的:

    nuget pack path/tofile.nuspec -Version (get-item env:GitVersion_InformationalVersion).Value
    

    正如您所看到的,版本取自GitVersion定义的环境变量。 现在我想将构建迁移到FAKE构建脚本。

    我在脚本中定义了这些依赖项。

    "Clean"
      =?> ("GitVersion", Choco.IsAvailable)
      ==> "RestorePackages"
      ==> "BuildApp"
      ==> "CreatePackage"
      ==> "Default"
    

    Git版步骤很简单。

    Target "GitVersion" (fun _ ->
        "gitversion.portable" |> Choco.Install id
        Shell.Exec("gitversion","/l console /output buildserver" ) |> ignore
    )
    

    我可以在日志中看到变量是由GitVersion设置的。

      

    添加环境变量。名= 'GitVersion_SemVer'   值= '1.1.1-XXX'

    下一步是创建包。

    Target "CreatePackage" (fun _ ->
        TraceEnvironmentVariables()
        let version = 
            match buildServer with 
            | AppVeyor -> environVar "GitVersion_SemVer"
            | _ ->  baseVersion + "-local"
        NuGet (fun p -> 
            {p with
                OutputPath = packagingDir
                WorkingDir = "."
                Version = version
                Publish = false }) 
                nuspecFileName
    )
    

    我正在打印定义的所有变量,之后我试图通过读取变量并将其分配给version来获取版本。

    不幸的是,version在运行构建时保持为空。添加TraceEnvironmentVariables()方法调用后,我可以看到GitVersion定义的变量都没有出现在输出中。

    正如John Palmer和dustinmoris所说,由Shell.Execute开始的过程将所有变量设置为过程级变量。

    有没有办法使用Shell.Execute以便进程可以设置全局范围环境变量?

    UPD

    作为一种解决方法,我在AppVeyor.yml配置文件中添加了额外的步骤:

    init:
      - git config --global core.autocrlf input
    install: 
      - choco install gitversion.portable -y
    before_build:
      - ps: gitversion /l console /output buildserver /b (get-item env:APPVEYOR_REPO_BRANCH).Value 
    
    build_script:
      - cmd: build.bat BuildApp
    

    在这种情况下,变量是在全局范围内设置的,我可以在构建脚本中获取它们并使用它们。

    显然,PowerShell以不同的方式启动GitVersion。我想,我应该在我的构建脚本中以某种方式模仿它。

    所以我的问题仍然是一样的,如何在我的脚本中使用GitVersion作为目标并获取版本号。

2 个答案:

答案 0 :(得分:1)

您的问题是您创建了一个进程级环境变量。存在shell进程后,下一步在不同的进程中运行,并不知道你在那里设置的任何env变种。

您必须设置永久环境变量,如用户级或机器级变量。

查看.NET中的Environment.SetEnvironmentVariable方法。

示例:

Environment.SetEnvironmentVariable("key", "value", EnvironmentVariableTarget.Machine);

然而,我并不认为这是一个很好的解决方案。我不知道GitVersion,坦率地不明白为什么你需要这个东西。您的构建脚本可以不确定语义版本本身吗?显然设置sem版本是一个手动步骤,因为没有自动化工具会知道如何根据代码更改正确增加版本。因此,您应该在项目中选择一个位置(1个文件,如自述文件或其他任何有意义的地方)来设置语义版本,并让所有其他工具从那里读取它以在构建期间设置程序集版本,包nuget包,在git中创建标签等。

答案 1 :(得分:1)

你看过Fake GitVersionHelper吗? http://fsharp.github.io/FAKE/apidocs/fake-gitversionhelper.html

data1 = [['a', 1100], ['b', 2100], ['c', 3300], ['d', 4400]]
sales = sqlContext.createDataFrame(data1,['user_id','total_sale'])
data2 = [['b', 1000],['c',2000],['d',3000],['e',4000]]
target = sqlContext.createDataFrame(data2,['user_id','personalized_target'])

sales.join(target, 'user_id', "outer").show()
# +-------+----------+-------------------+
# |user_id|total_sale|personalized_target|
# +-------+----------+-------------------+
# |      e|      null|               4000|
# |      d|      4400|               3000|
# |      c|      3300|               2000|
# |      b|      2100|               1000|
# |      a|      1100|               null|
# +-------+----------+-------------------+