PDJJ14 WIKI : Linux 기반 Jenkins 서버에서 C# 솔루션 컴파일 하기

1. MS 컴파일을 위한 플러그인 설치

(MSBuild 를 사용하면 컴파일이 잘 안됨. devenv.exe 를 이용하는 방법 사용. 단, MSTest plugin 은 테스트 수행 결과 전시를 위해 설치해야 함)

  • Jenkins 웹페이지에 Admin 계정으로 로그인
  • <Jenkins 관리> → <플러그인 관리> 로 이동
  • <설치 가능> 탭으로 이동하여 아래의 플러그인을 모두 설치
    • MSBuild Plugin
    • MSTest plugin
    • MSTestRunner plugin
    • NAnt Plugin
    • NCover plugin
  • 상황에 따라 Jenkins Web Server 재시작
  • <Jenkins 관리> → <플러그인 관리> → <설치된 플러그인 목록> 에 그림과 같이 설정이 되어 있어야 함

1.1. MS Build 플러그인 설정

  • Jenkins 웹페이지에 Admin 계정으로 로그인
  • <Jenkins 관리> → <Global Tool Configuration> 으로 이동
  • <MSBuild> 에서 <Add MSBuild> 버튼 클릭
  • 아래의 그림과 같이 설정하고 페이지 제일 하단의 <Save> 버튼 클릭

2. Visual Studio 가 설치된 Windows 컴파일 서버 등록

사전 조건

  • Windows 컴파일 서버에는 JAVA JVM 이 설치되어 있어야 함
  • .Net Framework 컴파일러가 설치되어 있어야 함
  • Git 이 설치되어 있어야 함

2.1. Jenkins 서버 작업

  • Jenkins 웹페이지에 Admin 계정으로 로그인
  • <Jenkins 관리> → <노드 관리> 로 이동
  • 페이지 좌측 메뉴 중 <신규 노드> 클릭
  • 아래 그림과 같이 설정하고 <OK> 버튼 클릭
  • 아래 그림과 같이 설정하고 <Save> 버튼 클릭
    • 설정해야 하는 값은 아래와 같음
      • Remote root directory
        • 원격 서버에서 사용할 Root Directory 의 절대 경로를 입력
          • 원격 서버를 기준으로 입력하는 것임
      • Node Properties
        • Git, MSBuild 의 실행 파일의 위치를 지정
  • 아래의 그림과 같이 새로 추가한 Server 가 (오프라인) 상태로 출력됨을 확인

2.2. Windows 컴파일 서버 작업

  • Jenkins 웹페이지에 Admin 계정 or 사용자 계정으로 로그인
  • 좌측에 출력된 <빌드 실행 상태> 중, 새로 생성한 Server (오프라인) 을 선택
  • 새로 표시된 페이지에서 <Launch> 버튼 클릭
  • 다운 받은 jnlp 파일 실행
  • 아래와 같이 Agent 가 실행됨을 확인

3. 프로젝트 생성

  • Jenkins 웹페이지에 Admin 계정 or 사용자 계정으로 로그인
    • 사용자 계정의 경우, 신규 Item 생성 권한이 설정되어 있어야 함
  • 좌측 메뉴 중, <새로운 Item> 선택
  • 과제 이름을 입력하고 Freestyle project 선택 후 <OK> 버튼 선택
  • 각 Part 의 설정을 마무리 한 뒤, 페이지 하단의 <저장> 버튼 클릭

3.1. General Part 설정

  • General part 에서 <Restrict where this project can be run> 체크박스 선택하고 Label Expression 에 신규 서버 이름 설정
    • 본 과제의 소스를 다운로드하고 컴파일 할 서버를 설정해 주는 작업

3.2. 소스 코드 관리 Part 설정

  • Source 관리 part 에서 <Git> 을 선택하고 Repository 정보 입력
    • 자격 증명까지 함께 입력해야 함
      • 자격 증명의 경우, 존재하는 값이 없다면 Credentials 의 우측에 위치한 <Add> 버튼을 클릭해서 신규로 추가 가능함

3.3. 빌드 유발 Part 설정

  • 빌드 유발 part 에서 <Build periodically> 를 선택하고 Schedule 에 "H H 1,15 1-12 *" 입력

3.4. Build Part 설정

  • <Nuget 설치 → Release 컴파일 → 테스트 결과 파일 삭제 → 테스트 수행> 의 순서로 작업이 진행되도록 Batch Command 설정

3.4.1. Nuget 설치

  • nuget.exe 를 원격 빌드 서버의 특정 위치에 복사 (여기서는 D:\ 드라이브에 놓았다고 전제)<Add build step> 에서 <Execute Windows batch command> 를 선택하여 아래와 같이 설정
    • $(nuget 파일 절대 경로) restore $(솔루션 파일 절대 경로)
    • "D:\nuget.exe" restore "D:\Jenkins_Slave\workspace\OGST\OGS.sln"

3.4.2. Release 컴파일

  • <Add build step> 에서 <Execute Windows batch command> 를 선택하여 아래와 같이 설정
    • $(devenv.exe 파일 절대 경로) $(솔루션 파일 절대 경로) /build $(컴파일 조건)
    • "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" "D:\Jenkins_Slave\workspace\OGST\OGS.sln" /build "Release|Any CPU"

3.4.3. 테스트 결과 파일 삭제

  • 테스트 수행 후 결과 파일이 덮어써지지 않기 때문에 본 command 를 수행하는 것임. 덮어쓰기가 가능하다면 본 단계 제거 가능
  • <Add build step> 에서 <Execute Windows batch command> 를 선택하여 아래와 같이 설정
    • del $(테스트 결과 파일 절대 경로)
    • del D:\Jenkins_Slave\workspace\TestResult\ogstTestResults.rtx 

3.4.4. 테스트 수행

  • <Add build step> 에서 <Execute Windows batch command> 를 선택하여 아래와 같이 설정
    • $(mstest.exe 파일 절대 경로) /resultsfile:$(테스트 결과 파일 절대 경로) /testcontainer:$(테스트 함수를 포함하는 프로젝트 dll 파일의 절대 경로)
      • /testcontainer:$(테스트 함수를 포함하는 프로젝트 dll 파일의 절대 경로) 는 다수개를 쓸 수 있음. 단, 멀티라인은 불가
      • 아래 예제가 멀티라인처럼 보이지만 줄바꿈 때문에 그렇게 보이는 것이지 실제로는 한줄임

    • "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\mstest.exe" /resultsfile:D:\Jenkins_Slave\workspace\TestResult\ogstTestResults.rtx /testcontainer:"D:\Jenkins_Slave\workspace\OGST\99.TestProjects\DISTestProject4Core\Bin\Release\DISTestProject4Core.dll" /testcontainer:"D:\Jenkins_Slave\workspace\OGST\99.TestProjects\RCMSTestProject4Core\Bin\Release\RCMSTestProject4Core.dll"


3.5. 빌드 후 조치 Part 설정

  • <MSTest 결과 리포트 게제> 의 순서로 작업 설정

3.5.1. MSTest 결과 리포트 게제

  • <빌드 후 조치 추가> 에서 <Publicsh MSTest test result report> 를 선택하여 아래와 같이 설정
    • <Test report TRX file> 에는 <Build>-<테스트 수행> 에서 생성한 파일의 절대 경로를 설정
    • D:\Jenkins_Slave\workspace\TestResult\ogstTestResults.rtx 

4. 컴파일

Project 페이지에서 좌측 메뉴 중 <Build Now> 클릭

4.1. 코드 다운로드 에러 발생 시

4.1.1. 에러 메시지

 > C:\Program Files\Git\bin\git.exe fetch --tags --progress http://jjhan@sigma:9092/scm/ccm/ccm.git +refs/heads/*:refs/remotes/origin/*
ERROR: Error fetching remote repo 'origin'
hudson.plugins.git.GitException: Failed to fetch from http://jjhan@sigma:9092/scm/ccm/ccm.git
	at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:797)

4.1.2. 원인

Bitbucket 에 접근할 수 있는 권한이 없기 때문임

4.1.3. 해결책

Bitbucket 의 설정값을 아래와 같이 수정

  • (warning) 이렇게 변경하는 것이 보안 상 제대로 된 것인지는 모르겠음 (warning)

4.2. Nuget Package 경로 찾지 못한 컴파일 에러 발생 시

4.2.1. 에러 메시지

1>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3245: 이 참조를 확인할 수 없습니다. "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" 어셈블리를 찾을 수 없습니다. 어셈블리가 디스크에 있는지 확인하십시오. 해당 코드에 이 참조가 필요한 경우 컴파일 오류가 발생할 수 있습니다.
1>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3245: 이 참조를 확인할 수 없습니다. "EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" 어셈블리를 찾을 수 없습니다. 어셈블리가 디스크에 있는지 확인하십시오. 해당 코드에 이 참조가 필요한 경우 컴파일 오류가 발생할 수 있습니다.
1>D:\Jenkins_Slave\workspace\FTS\FTS.Server\FTS.Server.Database\FTSDB.Context.cs(13,23,13,29): error CS0234: 'System.Data' 네임스페이스에 'Entity' 형식 또는 네임스페이스 이름이 없습니다. 어셈블리 참조가 있는지 확인하세요.
1>D:\Jenkins_Slave\workspace\FTS\FTS.Server\FTS.Server.Database\FTSDB.Context.cs(14,23,14,29): error CS0234: 'System.Data' 네임스페이스에 'Entity' 형식 또는 네임스페이스 이름이 없습니다. 어셈블리 참조가 있는지 확인하세요.
1>D:\Jenkins_Slave\workspace\FTS\FTS.Server\FTS.Server.Database\FTSDB.Context.cs(16,40,16,49): error CS0246: 'DbContext' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.
1>D:\Jenkins_Slave\workspace\FTS\FTS.Server\FTS.Server.Database\FTSDB.Context.cs(23,49,23,63): error CS0246: 'DbModelBuilder' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.
1>D:\Jenkins_Slave\workspace\FTS\FTS.Server\FTS.Server.Database\FTSDB.Context.cs(28,24,28,47): error CS0246: 'DbSet<>' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.
1>D:\Jenkins_Slave\workspace\FTS\FTS.Server\FTS.Server.Database\FTSDB.Context.cs(23,33,23,48): error CS0115: 'FTSEntities.OnModelCreating(DbModelBuilder)': 재정의할 적절한 메서드를 찾을 수 없습니다.

4.2.2. 원인

Nuget 에서 다운 받아 사용하는 Package 에 대한 DLL 참조가 프로젝트의 Bin 폴더에 존재하는 DLL 로 설정되어 있기 때문임

4.2.3. 해결책

  1. 개발 서버에 접속하여 해당 DLL 참조가 Package 폴더로 설정되어 있는지 확인
  2. 그렇지 않다면 참조 항목에서 DLL 삭제 후, 관련 Package 다시 설치
  3. Package 에 대한 DLL 참조가 Package 폴더로 설정되어 있는지 확인
  4. 변경된 내용을 Bitbucket 에 commit

5. 참고페이지