Pages

October 15, 2013

[Unity] Jenkins로 유니티 자동 빌드 세팅하기 (2)

앞글에서 맥OS에 Jenkins를 설치하고 유니티 커맨드라인 빌드를 수행하는 Job을 만들어 실제로 자동 빌드를 수행해보았다. 그렇지만 빌드 콘솔 화면에서 "_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL." 이러한 에러를 보고 좌절하고 말았는데 이번에는 이 문제를 해결하는 방법을 알아보고자 한다.

이전에 구글링을 통해 밝힌것과 같이 이 문제는 Jenkins가 설치시에 jenkins라는 유저 어카운트를 생성하고 해당 어카운트가 LaunchDaemon의 권한으로 유니티를 실행하려고 해서 발생한 문제다.

이 문제를 해결하는 방법은 두가지가 있는데,


  • 첫번째 Jenkins를 로그인 유저로 실행하기.
  • 두번째 Jenkins Slave Agent 노드를 만들어 해결하기.


두가지 중 첫번째 방법이 좀 더 간단한 방법이지만 Jenkins의 Slave Agent가 어떻게 돌아가는지 궁금하다면 두번째 방법을 시도해보는 것도 좋겠다.


Jenkins를 로그인 유저로 실행하기


Jenkins가 jenkins라는 별개의 유저 어카운트 대신 맥OS에 로그인하는 사용자의 어카운트 권한으로 실행하도록 변경하여 Jenkins가 Unity를 실행하는데 문제가 없도록 만드는 방법이다.

주의 : 이렇게 변경하는 경우 기존의 Jenkins세팅이 모두 초기화 된다.  jenkins계정의 파일들을 로그인 사용자 계정의 Jenkins 홈디렉토리로 옮기면 기존 설정이 옮겨질것 같기도 한데 직접 테스트 해보진 않았다.

터미널을 열어 아래 명령을 입력하여 Jenkins Daemon설정을 수정하자.
sudo vi /Library/LaunchDaemons/org.jenkins-ci.plist



    StandardOutPath
    /var/log/jenkins/jenkins.log
    StandardErrorPath
    /var/log/jenkins/jenkins.log
    EnvironmentVariables
    
        JENKINS_HOME
        /Users/로그인사용자계정/Jenkins/Home
    
    GroupName
    daemon
    KeepAlive
    
    Label
    org.jenkins-ci
    ProgramArguments
    
                /bin/bash
        /Library/Application Support/Jenkins/jenkins-runner.sh
    
    RunAtLoad
    
    UserName
    로그인사용자계정
        SessionCreate
    



위와 같이 JENKINS_HOME과 UserName을 현재 OS에 로그인한 계정으로 변경해준다.

그리고 다음의 명령으로 Jenkins를 다시 시작하도록 한다.

sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist


그리고 잠시 기다리면 젠킨스에 다시 접속할 수 있다. 그러나 이전에 했던 세팅은 모두 날아간 상태. 완전히 초기화된 상태이다. 이전글을 참고하여 처음부터 다시 세팅하도록 하자. 주의할 점은 Jenkins는 이제 로그인계정으로 동작하므로 Key Pair를 만들때 jenkins계정이 아닌 현재 로그인한 계정의 Key Pair를 만들어서 Github혹은 Bitbucket에 다시 등록하여야 한다.


Jenkins Slave Agent 노드를 만들어 해결하기



이 방법은 조금 더 프로페셔널해 보이는 방법인데,  기존의 Jenkins 빌드 Job이 초기화되면 안된다거나,  Jenkins Slave Agent가 어떻게 돌아가는지 관심이 있다면 해볼만한 방법이다. 이 방법을 잘 활용한다면 여러대의 빌드머신으로 각기 다른 프로젝트의 빌드를 여러 다른 빌드머신의 Agent에 할당하여 부하를 분산할 수 도 있다.

Agent노드를 만들어야 하므로 Manage Jenkins -> Manage Nodes 페이지로 간다.


Manage Nodes Page

현재 Jenkins가 돌아가고 있는 master 노드가 보이는데 좌측의 New Node 메뉴를 클릭하여 새로운 노드를 생성하도록 하자.

Creating New Node

노드 네임은 원하는 이름을 입력하도록 하고, # of executers는 동시에 빌드 작업을 이 노드에서 실행할 수 있는 숫자인데 2 정도를 입력해놓고 (Unity는 복수개의 프로세스를 허용하지 않아서 동시에 여러개의 Unity 빌드를 실행할 수 없다.) Usage, Launch method는 아래 스샷과 같이 변경하도록 한다.



그리고 Save 버튼을 누르면 아래 화면이 나타난다. Slave 노드를 실행할 수 있는 방법을 설명한 페이지인데, Launch 버튼을 누르는 순간 Slave Agent가 실행이 되어야 할것 같은데 잘 안된다. (사파리 웹프라우저 사용) 그래서 두번째 커맨드라인 명령을 터미널에서 실행해야 했는데, 자바 런타임을 설치하라고 한다. 그래서 자바 런타임을 설치.



자바 런타임 다운로드

자바 런타임 설치후에 다시 명령을 실행. 아래 내용을 터미널에서 입력한다.

javaws http://localhost:8080/computer/unity_builder/slave-agent.jnlp

다음과 같은 경고창을 볼 수 있는데 체크박스를 체크하고 Run 클릭.




그럼 이렇게 화면상에서 작은 Jenkins Agent창을 볼 수 있고 Connected 메시지를 통해 Jenkins 메인 호스트와 접속이 되었음을 알 수 있다.

이어서 Jenkins 웹대시보드를 확인하면 unity_builder라는 Agent 가 문제 없이 추가되어 있음을 볼 수 있다.



여기서 한가지 귀찮은 점은 Jenkins Agent는 현재 로그인 계정으로 실행되고 있고 Git Repository에 접근할때도 현재 계정의 ssh key pair를 가지고 접근하게 된다. 따라서 현재 로그인 계정이 Git repository에 문제없이 접근할 수 있도록 key pair가 없다면 생성하여 등록하고 이미 key pair가 있다면 가지고 있는 key pair를 등록하도록 하자.

그리고 Job설정에서 Agent가 해당 빌드 작업을 수행하도록 지정을 해주어야 한다. Jenkins Job list page 로 돌아가보면 왼쪽 박스의 Build Executor Status 에 unity_builder agent가 Idle중임을 확인할 수 있다.


이전에 등록했던 job configuration을 수정하도록 하자. 아래 스크린샷과 같이 "Restrict where thie project can be run" 체크 박스를 클릭하고 Slave Agent의 이름을 입력하도록 하자.



그리고 이제 다시 Jenkins Job list page 로 돌아가서 설정된 Job의 빌드를 시작하도록 하면 대시보드 왼쪽 화면에서 unity_builder Slave에서 빌드 작업이 진행됨을 볼 수 있고, 문제 없이 빌드가 완료됨을 확인할 수 있다.

"unity_builder" doing build

Build succeded


이상으로 유니티 빌드가 문제 없이 Jenkins에서 자동화될 수 있도록 하는 방법을 알아 보았고 이 다음은 iOS 프로젝트 빌드와 동시에 디버그를 위한 심볼 파일을 생성하고 생성된 프로젝트 빌드 결과물이 Testflight으로 업로드 되는 작업을 자동화하는 방법을 알아보도록 하자.




6 comments:

  1. 안녕하세요. 블로그 많은 도움이 되고있습니다.
    블로그를 보던중 노드 셋팅 하는 부분의 스크린 샷을 참고 하라고 하는 부분 이 있는데 스샷이 없습니다. 수정 부탁 드려도 될까요?

    ReplyDelete
  2. /Library/LaunchDaemons/org.jenkins-ci.plist 를 변경하고, 기존 사용자계정 디렉토리를 사용자계정디렉토리로 옮겨보았으나 계정관련 디렉토리의 소유자가 jenkins로 남아서인지 제대로 작동하지는 않습니다. 혹시라도 해결방법이 생기면 다시 피드백드리겠습니다.

    ReplyDelete
  3. Slave의 문제는 master의 host를 localhost로 사용못하는게 문제네요.

    ReplyDelete
    Replies
    1. 혹시 어떤 식으로 해결하셨는지 알 수 있을까요? 같은 맥에서 마스터와 슬래이브 나눴는데 부적절한 내용이 있다고 해서 실행못하고 있네요.

      Delete
  4. 안녕하세요. mac에서 jenkins를 이용해서 설정중인데요. 올려주신 글을 참고해서 셋팅해보려고 했는데 Jenkins2.3대 UI가 바꿔서 정확한 이해가 안가더라고요. plist 수정해서 하는 것은 수정하면 젠킨스가 실행이 안되서 Slave 방식으로 하고싶은데 같은 맥에서 slave 를 돌리려면 어떤 방식으로 해야할 지 도움을 주실 수 있나요?

    ReplyDelete