Jenkins를 활용하여 MFC(Window app) 프로그램의 CI/CD환경을 구성한다.

1. Jenkins에 svn, msbuild 플러그인 설치

2. MSBuild 설정

3. svn 계정설정.

4. Item(Job)생성
5. Tag별로 빌드 구성

 

Jenkins 관리 -> 플러그인 관리
설치 가능 선택 후 "subversion" 검색하여 항목 선택 후 "Install after restart"
MSBuild 검색 후 설치 
Jenkins 관리 -> Global Tool Configuration.
MSBuild가 설치된 경로 설정 후 SAVE
New Item 생성 -> 이름입력, FreeStyle project "OK"
General 상단에 이 빌드는 매개변수가 있습니다. 체크 후 List Subversion Tags 선택
Credentials->add를 눌러서 SVN계정 추가
소스 코드 관리에서 Subversion 설정

Repository URL, svn 주소 CI/CD는 지속 통합 지속 배포가 목적이기에 배포목적인 tag경로를 설정한다.

위에 매개변수로 설정한 rel_version을 사용하는 경로로 지정한다.

Tags 디렉토리 구조가 아래와 같으면

Tags - rel_v2/client/projects/project1/project1.sln

      └ rel_v3

      └ rel_v4

      └ rel_v5...

 

rel_v2/client/projects/project1/project1.sln의 빌드 설정

MSBuild version은 사전에 설정해둔 msbuild 설정을 선택.

MSBuild Build File에는 빌드할 프로젝트 파일 경로

Command Line Arguments: MSBuild 옵션이며 스크린샷과 같이 실행 시 Win32(x86), Release로 Rebuild 실행한다. 

저장 후  Build With Parameters 선택해서 정상적으로 빌드진행이 되는지 테스트가 가능한다.

매개변수 선택 combobox에 tag 버전 리스트를 선택후 빌드하기를 눌러 진행한다.

최초 진행시 workspace에 svn checkout 을 받으면서 시간이 오래걸린다. 

또, 빌드의 Console Output 으로 진행상태 확인이 가능하다.

MFC로 프로그램을 만들고 보면 이런 경우가 종종있다.


Debug로 했을때는 프로그램이 안뻗는다, 릴리즈로 돌렸을때 뻗는 경우.


이때 가장 먼저 하는게 resource.h 에 중복되는 숫자를 제거하는 방법이지만,


이걸로 안돼면 이 디버그 메시지가 있는지 확인해야한다.


... 첫번째 예외가 발생하였습니다 ...

혹은

... First-Chance exception ...


이 메시지는 잠재적인 문제를 알려주는 것인데, 보통에는 문제가 없어서 지나가기 쉽다.


이 메시지를 디버깅 하기위해서는 환경설정의 디버그 -> 예외 에서 모든 예외 상황을 브레이킹하게 설정해서


디버깅할 수 있다. Access violation 체크!


단축키로는 ctrl + alt + E 를 누른다.





이미지에 표시된 항목을 체크하면 첫번째 예외 메시지가 출력되는 상황에서 디버깅이 걸릴 것이다.






목표 : 작업폴더내 모든 파일명 앞에 현재 날짜 년 월 일  이 붙도록 하는 콘솔 프로그램

단계 :

폴더 경로 얻기 -> 폴더 경로 내의 파일 검색 -> isDot  - no -> 파일명 수정 -> next

  - yes-> next



1. 폴더 (Directory) 경로 얻기


함수 : GetCurrentDirectory



2. 폴더내 파일 검색


struct _finddata_t cfile;

long hFile;



if( (hFile = _findfirst( "*.*", &c_file )) == -1L )

printf( "No files in current directory!\n" );

else

{

/* Find the rest of the .c files */

do

{

  // 작업

     }while( _findnext( hFile, &c_file ) == 0 );


_findclose( hFile );

}









3. isDot ?


콘솔로 폴더를 검색하면 상위 폴더를 보는 . 과 .. 이 있기때문에 이를 걸러주어야함.

if(!strcmp(".", c_file.name)) _findnext( hFile, &c_file );

if(!strcmp("..", c_file.name)) _findnext( hFile, &c_file );




4. 시스템 시간 얻기

SYSTEMTIME 을 이용하는 방법, time_t를 이용하는 방법이 있는데, 

time_t는 뭔가 부정확한 느낌이다.





5. 파일명 바꾸기.


rename 함수를 이용한다

rename("기존 파일명 (경로포함)" , "바뀔 파일명(경로포함);














C++ 현재시간을 구한다. 

1. SYSTEMTIME 을 이용
CString GetToDay(CString data)
{
    CString strToday;
    SYSTEMTIME    time;    // 시간 구조체.
    ::ZeroMemory(reinterpret_cast<void*>(&time), sizeof(time));     // time 초기화.
    ::GetLocalTime(&time);    // 현재시간을 얻음.
    strToday.Format (_T("%4d%02d%02d%02d%02d"), time.wYear ,time.wMonth ,time.wDay, time.wHour, time.wMinute); // 형식에 맞게 받음..
    return strToday;
}
2. time_t 를 이용
char sysDate[MAX_PATH2] ="";

struct tm* today;

time_t ltime;

time(<ime);

today = localtime(<ime);

sprintf(sysDate, "%04d년%02d월%02d일_",today->tm_yday+1778, today->tm_mon+1, today->tm_mday);


3. CTime 활용


CString strToday = CTime::GetcurrentTime();


+ Recent posts