【问题标题】:Gitlab CI Runner Predefined Macro MSBuildGitlab CI Runner 预定义宏 MSBuild
【发布时间】:2017-12-18 21:47:46
【问题描述】:

您好,我正在尝试使用环境变量作为 Gitlab 运行程序设置上的 MSBuild 过程的一部分,以传递 CI_PIPELINE_ID 和 CI_COMMIT_SHA 以使用增量构建 ID 构建应用程序并提交 sha 以跟踪二进制文件版本。

我的 .gitlab-ci.yml 配置如下:

variables:
  Solution: Project.sln

before_script:
  - "echo off"
  - 'call "%VS140COMNTOOLS%\vsvars32.bat"'
  - echo.
  - set
  - echo.
  - echo %HALCONROOT%|find "13" >nul
  - if errorlevel 1 (echo not13) else (set HALCONVERSION=HALCON_13)

stages:
  - build

build:
  stage: build
  script:
  - echo building...
  - 'msbuild.exe /p:Configuration="Release" /p:Platform="x64" "%Solution%"'
  tags:
  - "HALCON 13"
  except:
  - tags

我需要做什么才能在我的 c++ 项目中访问这样的环境变量?

#ifndef CI_COMMIT_SHA
#define COMMIT_SHA                  0
#else
#define COMMIT_SHA                  CI_COMMIT_SHA
#endif

【问题讨论】:

    标签: c++ visual-studio msbuild gitlab


    【解决方案1】:

    你可以使用Settings --> CD/CD --> Secret variables来定义你想在.yml中使用的变量,例如:

    那么你可以如下使用它:

    script:
    - echo $USERNAME
    

    关于在C++中访问环境变量,你可以试试:

    std::string getEnvVar( std::string const & key ) const
    {
        char * val = getenv( key.c_str() );
        return val == NULL ? std::string("") : std::string(val);
    }
    

    【讨论】:

    • CI_PIPELINE_ID 和 CI_COMMIT_SHA 已预定义 docs.gitlab.com/ce/ci/variables/README.html。我的问题是我如何将它与 msbuild 一起使用,以便通过访问键值与它们一起编译。
    • @a_dizzle:已修改。
    • 我不想在运行时获取键值,仅在编译时。我可以通过在 msbuild 命令末尾添加 /D CI_PIPELINE_ID=$(CI_PIPELINE_ID) /D CI_COMMIT_SHA=$(CI_COMMIT_SHA) 将这些添加到项目中。但是,如果它们不存在,我不想这样做。
    • 所以你想做if $(CI_PIPELINE_ID) build_with_ci_env else build_without_ci_env之类的事情?
    • 没错。我几乎让它与 /D 输入一起工作,但是当它建立在没有这些 CI_PIPELINE_ID 的环境上时,它将被设置为一个空字符串,这将打破定义周围的 STRINGIZE。我的下一个问题是如何为 msbuild 执行 P99_IS_EMPTY 之类的操作?
    【解决方案2】:

    通过在属性页的 C/C++ 命令行中添加以下代码解决。

    /D CI_PIPELINE_ID=$(CI_PIPELINE_ID) /D CI_COMMIT_SHA=$(CI_COMMIT_SHA)
    

    但是,当您不在 CI 环境中运行时,您现在必须检查这些是否为空,以下检查取自 How to test if preprocessor symbol is #define'd but has no value? 并进行了修改。 (EXPAND 函数中需要 A + 0 以防止在定义为空时出现 C4003 警告。

    #define DO_EXPAND(VAL)  VAL ## 1
    #define EXPAND(VAL)     DO_EXPAND(VAL)
    
    #define DO_QUOTE(X)        #X
    #define QUOTE(X)           DO_QUOTE(X)
    
    #if !defined(CI_PIPELINE_ID) || (EXPAND(CI_PIPELINE_ID + 0) == 1)
    #define VERSION_BUILD               9999
    #else
    #define VERSION_BUILD               CI_PIPELINE_ID
    #endif
    
    #if !defined(CI_COMMIT_SHA)
    #define COMMIT_SHA                  ""
    #else
    #define COMMIT_SHA                  CI_COMMIT_SHA
    #endif
    

    【讨论】:

      猜你喜欢
      • 2015-10-07
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多