C++ 프로그래머의 일상: 2008년 3월 23일

CI 서버가 프로젝트 하나를 nightly build 작업에서 빼먹는다

팀에서 사용하고 있는 CI ((Continuous Intergration; 지속 통합. 코드 베이스의 변화를 지켜보고 있다가 프로그래머가 코드를 변경하고 커밋하면 이걸 체크아웃해서 빌드/테스트/deploy/문서생성 … 등 일련의 작업을 수행해준다. 실제로 중요한 부분은 빌드/테스트 결과를 커밋단위마다 반복해준다는 점))서버가 등록되어있는 작업 중에 유독 한 개만 nightly build 안하고 넘어가는 것.

그래서 방금 커밋하나 해놓고 빌드/테스트 되는 동안 서버 로그를 들여다보는데, 이게 왠걸.

ThoughtWorks.CruiseControl.Core.CruiseControlException: Source control operation failed: svn: (후략)

이런 로그가 매 nightly build마다 들어가 있더라. 대체 이게 왜 실패했을까 이유를 곰곰히 생각해봤는데,

  • 해당 프로젝트를 메인 소스 브랜치에 넣을지 확정되지 않았다
  • 그래서 내 로컬 컴퓨터에 SVN/trac을 만들어서 임시로 쓴다
  • CI 서버는 svn checkout을 내 로컬 컴퓨터에 요청한다
  • 빌드 시간대는 새벽 4시
  • 내 컴퓨터는 4시간 넘게 idle하면 Suspend 상태로 전환된다

새벽 4시라면 내가 12시에 퇴근하지 않고서야 내 컴퓨터는 suspend 상태고 -> SVN checkout 요청은 그대로 묵살. 그리고 CI 서버는 SVN 요청이 안되니 해당 프로젝트의 nightly build를 제대로 수행할 수가 없다 -_-;

C++ 의 bit-wise-and 연산자는 hat(^)이 아니다

mod 64, div 64를 빨리 수행해야할 코드가 좀 있어서,

  • value % 64 대신에 value ^ 64 value ^ 63 (잘못된 연산임) ((물론 이 연산자는 틀렸다. &를 써야함))
  • value / 64 대신에 value >> 6 ((2의 거듭제곱으로 표현되는 숫자로 나누거나 나머지를 구하는 것은 비트연산으로 바꾸기 쉽다))

를 썼다. 그런데 이게 왠걸, UnitTest 에서 계속 실패했다는 메시지를.

고민 좀 하다가 짱돌 하나보단 k개가 낫지 않나하고, IRC에 붙여넣었다. 그리고 한방에 문제를 파악했다. 대화 한토막.

@rein_uriel | x mod 64가
@rein_uriel | x ^ 0x3F
@rein_uriel | 랑 다른가효
@rein_uriel | …
@p_n_a___ | x mod 64는 x를64로 나눈 나머지 인건 알겠는데
@x_n_s_z_ | x xor 0x3F 이고,
@rein_uriel | ^ 가 and가 아니군

… 흔히 논리 연산에서 AND의 의미로 사용되고 hat(^)으로 표시하는 ^ 는 C/C++의 bitwise-XOR 연산자다. Orz

Jinuk Kim
Jinuk Kim

SW Engineer / gamer / bookworm / atheist / feminist

Articles: 935

7 Comments

Leave a Reply