2017-12-18 33 views
0

안녕하세요 저는 Gitlab 러너 셋업에서 MSBuild 프로세스의 일부로 환경 변수를 사용하여 CI_PIPELINE_ID와 CI_COMMIT_SHA를 전달하여 증분 빌드 ID와 함께 애플리케이션을 빌드하고 SHA를 추적하여 바이너리 버전.Gitlab CI Runner 미리 정의 된 매크로 MSBuild

내 .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 

답변

1

다음 코드를 속성 페이지의 C/C++ 명령 줄에 추가하여 해결했습니다.

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

지금이 비어있는 경우 How to test if preprocessor symbol is #define'd but has no value?에서 촬영하고 수정 한 다음 검사와 CI 환경에서 실행되지 않을 때 확인해야 할 것이다 그러나

. (A + 0.가 define가 비어있을 때 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 
2

당신은 예를 들어, 당신이 .yml에서 사용할 변수를 정의 Settings --> CD/CD --> Secret variables를 사용할 수 있습니다에 관한

script: 
- echo $USERNAME 

다음과 같이

Secret variables

그런 다음 당신이 그것을 사용할 수 있습니다 C++에서 환경 변수에 액세스하면 다음을 시도 할 수 있습니다.

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

CI_PIPELINE_ID 및 CI_COMMIT_SHA 이미 https://docs.gitlab.com/ce/ci/variables/README 미리 정의되어있다. html. 내 질문은 키 값을 액세스하여 그들과 함께 컴파일되도록 msbuild 함께 사용하는 방법입니다. –

+0

@a_dizzle : 수정. –

+0

컴파일 할 때만 런타임에 키 값을 얻으려고하지 않습니다. msbuild 명령 끝에/D CI_PIPELINE_ID = $ (CI_PIPELINE_ID)/D CI_COMMIT_SHA = $ (CI_COMMIT_SHA)를 추가하여 프로젝트에 추가하십시오. 그러나 존재하지 않으면이 작업을 수행하지 않겠습니다. –