::: IT인터넷 :::

시놀로지 VMM의 윈도우 가상 환경을 Jenkins에 에이전트로 연결하기

곰탱이푸우 2021. 8. 9. 08:20

Jenkins 자체에 포함 된 빌드 기능을 이용하면 빌드 수행이 가능하다.

그러나 별도의 빌드 에이전트를 Jenkins에 빌드 에이전트로 등록해서 사용할 수 있다.

예전에 개발팀에 있을때 Bamboo에 빌드머신들을 에이전트로 등록해서 사용했는데 동일한 구조로 구성해보았다.

 

Docker로 생성한 Jenkins 컨테이너는 Master 노드로, 빌드만 진행하는 별도의 에이전트를 Slave 노드로 구성한다.

  • Jenkins 컨테이너 (Master Node) - 빌드 구성과 관리 기능 수행
  • Jenkins 에이전트 (Slave Node) - VMM의 윈도우10 가상 환경 (Visual Studio 빌드), 리눅스 Docker 컨테이너 (Anaconda 기반 Python 빌드)

 

이렇게 하면 빌드 구성 관리와 빌드 수행 기능을 분리할 수 있다.

  • 윈도우 환경의 Visual Studio 빌드에 필요한 환경과 리눅스 기반의 파이썬 빌드 환경을 별도로 구성하여 사용 가능하다.
  • 특정 빌드 환경을 늘려주고자 할 때에는 에이전트 개수를 늘려주면 된다.

 

이번 포스팅에서는 시놀로지 NAS의 VMM을 사용하여 구성한 윈도우10 가상 환경을 Jenkins의 에이전트로 등록하는 과정을 진행한다.

 

 

시놀로지 NAS에서 Docker를 이용한 Jenkins 구축 방법은 아래 포스팅을 참고한다.

 

시놀로지 NAS에 Jenkins 구축하기

현재 근무 중인 회사에서는 빌드 및 배포 시스템으로 Atlassian의 Bamboo를 사용 중이다. 기능도 익숙하고 사용하기 편리하지만 상용 제품이다 보니 개인이나 소규모로 사용하기에는 부담이 있다.

www.bearpooh.com

 

Jenkins 설치 후 초기 설정

시놀로지 NAS에서 Docker를 이용한 Jenkins 설치는 아래 포스팅을 참고한다. https://www.bearpooh.com/49 Jenkins 접속 및 비밀번호 설정 Docker를 이용하여 Jenkins 설치를 마치고 접속하면 아래와 같은 초기 설..

www.bearpooh.com

 

시놀로지 NAS에서 VMM을 사용하여 윈도우10 가상환경 생성하는 것은 아래 포스팅을 참고한다.

 

시놀로지 NAS에서 Virtual Machine Manager로 윈도우 사용하기

시놀로지 NAS는 리눅스 기반의 운영체제를 기반으로 한 DSM으로 동작한다. 시놀로지 NAS에 Docker를 기반으로 셋팅한 Jenkins 역시 리눅스 기반이다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회

www.bearpooh.com

 

 

시놀로지 VMM의 가상 윈도우에 빌드환경 구성하기

시놀로지 NAS에 VMM으로 설치한 윈도우 10 가상 컴퓨터에 기본적인 프로그램과 Visual Studio 빌드에 필요한 프로그램들을 설치한다. 시놀로지 NAS에 Virtual Machine Manager를 이용한 윈도우 운영체제 설치

www.bearpooh.com

 

 

Jenkins에 윈도우 에이전트 추가

좌측의 Jenkins 관리를 클릭하고 System Configuration의 노드 관리를 선택한다.

 

좌측의 신규 노드를 클릭한다.

 

윈도우 운영체제를 에이전트로 등록할 것이므로 노드명에는 windows-agent01를 입력하고, Permanent Agent에 체크한다.

 

 

상세 정보를 입력한다.

  • Number of executors - 1 유지 (VMM에 생성한 윈도우 가상 환경이 1 CPU, 4G 램이므로 최소한만 지정)
  • Remote root directory - C:\Users\jenkins\Project 지정 
  • Labels - 일단 windows-agent01 지정 (에이전트의 별칭을 의미하며, Windows01로 변경 예정)
  • Useage - Use this node as much as possible 유지

 

가상 환경으로 구성한 윈도우 빌드 에이전트의 Remote root directory를 설정하는 방법은 다음 포스팅을 참고한다.

 

시놀로지 VMM의 가상 윈도우에 빌드환경 구성하기

시놀로지 NAS에 VMM으로 설치한 윈도우 10 가상 컴퓨터에 기본적인 프로그램과 Visual Studio 빌드에 필요한 프로그램들을 설치한다. 시놀로지 NAS에 Virtual Machine Manager를 이용한 윈도우 운영체제 설치

www.bearpooh.com

 

옵션 항목이 많으므로 계속해서 설정한다.

  • Launch method - Launch agent by connecting it to the master 유지 (에이전트에서 Master 노드에 접속)
  • Use WebSocket에 체크
  • 그리고 Save 버튼 클릭

 

windows-agent01 에이전트가 생성되었다. 그러나 아직 연결이 되지 않아 아이콘에 x가 표시된다.

windows-agent01을 클릭한다.

 

 

VMM의 가상 윈도우에서 에이전트 파일 실행

우측에 에이전트 환경에서 Master 노드로 접속하기 위한 정보가 표시된다.

  • Launch 버튼을 클릭하여 jenkins-agent.jnlp 파일을 다운로드한다.
  • 아래의 명령어를 복사하여 메모장에 옮겨 놓는다. (향후 윈도우 가상 환경에서 자동 실행 설정에 사용한다.)
  • 명령어 내부의 agent.jar를 클릭하여 파일을 다운로드한다.

 

jnlp 파일과 jar 파일을 다운로드하면 아래와 같이 경고 메시지가 출력된다. 계속 버튼을 클릭하면 다운로드 된다.

 

다운로드한 파일을 시놀로지 NAS의 VMM에 생성한 가상 컴퓨터로 옮긴다.

노드 생성할 때 지정한 remote directory인 C:\Users\jenkins\Project로 복사했다.

 

 

jenkins-agent.jnlp 파일을 우클릭하고, 연결 프로그램을 선택한다.

'추가 앱↓' 을 클릭한다.

 

'이 PC에서 다른 앱 찾기'를 클릭한다.

 

Java Webstart 파일을 이용하여 실행할 것이므로 아래 경로로 이동하여 javaws.exe 파일을 선택한다.

경로는 C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.292-1\webstart\javaws.exe 이다.

 

 

해당 파일이 실행되면 보안 관련 안내 메시지가 출력된다. Run 버튼을 클릭한다.

 

실행 정보를 확인하고 Yes 버튼을 클릭한다. 해당 정보를 저장하고자 하는 경우 Remember this option을 체크한다.

 

Connected 메시지가 출력되면 정상적으로 연결 된 것이다.

 

연결에 성공하면 Jeknins의 노드 상세 정보 페이지에 연결되었다고 나타난다. 

 

 

IOException:Handshake Error가 발생하는 경우

시놀로지 NAS의  VMM으로 생성한 윈도우 가상 환경에서 Jenkins에 에이전트로 등록할때 IOException:Handshake Error 메시지가 발생할 수 있다.

원인을 찾느라 가장 많은 고생했던 오류 메시지이기도 하다.

 

결론부터 말하면 네트워크 구성과 Jenkins URL 지정 문제이다.

 

아래 포스팅에서 Jenkins URL을 지정할때, 공유기에 설정 된 DDNS 주소와 시놀로지 NAS에 Jenkins로 접속하기 위해 설정한 역방향 프록시 포트를 지정했다.

 

Jenkins 설치 후 초기 설정

시놀로지 NAS에서 Docker를 이용한 Jenkins 설치는 아래 포스팅을 참고한다. https://www.bearpooh.com/49 Jenkins 접속 및 비밀번호 설정 Docker를 이용하여 Jenkins 설치를 마치고 접속하면 아래와 같은 초기 설..

www.bearpooh.com

 

가상 윈도우는 시놀로지 NAS의 VMM으로 생성했고, Jenkins 컨테이너는 동일한 NAS 장비에서 Docker로 실행 중이다.

공유기에 가상 윈도우와 시놀로지 NAS의 IP가 할당되어 있다.

따라서 Jenkins URL에 DDNS 주소를 지정하면 공유기 외부의 DNS 서버를 거쳐서 다시 내부 들어오므로 공유기에서 포트포워딩이 되어야 한다.

포트포워딩을 위해 정확한 포트 번호를 알려면 패킷 캡쳐를 해야 하는데 귀찮아서 하지 않았다.

 

가상 윈도우의 hosts에  'NAS_IP_주소    DDNS_주소' 형태로  지정하면 문제가 해결되는데 포스팅 작성하면서 생각이 났다... OTL..

  • hosts 파일은 윈도우의 C:\Windows\system32\drivers\etc\hosts 경로에 위치한다.
  • DNS 서버를 거치지 않고 hosts를 이용하여 연결하므로 공유기의 포트포워딩을 하지 않아도 된다.

 

결국 Jenkins 설정에서 Jenkins URL을 변경해서 해결했다.

  • https 대신 http 지정
  • URL은 Jenkins 컨테이너가 실행 중인 NAS의 IP 입력
  • Port는 Jenkins 컨테이너 실행할때 8080 포트에 연결한 포트 입력

 

 

Jenkins URL을 수정하려면 Jenkins  관리 - 시스템 설정으로 이동한다.

 

스크롤을 아래로 내리면 Jenkins Location 항목에 Jenkins URL이 있다.

 

NAS의 IP가 192.168.0.123이고, 컨테이너 생성할때 8080 포트를 12345 포트에 연결했으면 http://192.168.0.123:12345가 된다.

아래 포스팅에서 리버스 프록시를 설정했으므로, 외부에서는 https://DDNS주소:리버스프록시포트 형태로 접근 가능하다.

 

시놀로지 NAS에 Jenkins 구축하기

현재 근무 중인 회사에서는 빌드 및 배포 시스템으로 Atlassian의 Bamboo를 사용 중이다. 기능도 익숙하고 사용하기 편리하지만 상용 제품이다 보니 개인이나 소규모로 사용하기에는 부담이 있다.

www.bearpooh.com

 

혹시 Handshake 오류를 접했을 경우 아래 순서대로 진행하기를 권장한다.

  1. 가상 윈도우의 hosts 파일에 정보를 추가한다. ('NAS_IP_주소    DDNS_주소' 형태)
  2. 1.의 방법으로 안되면 Jenkins URL 수정

 

Jenkins에 빌드 에이전트로 추가할땐 SSH 또는 JNLP를 이용한 방법을 사용한다.

  • SSH를 이용한 방법은 윈도우에서 폴더 권한을 변경하는게 복잡하여 권장하지 않는다.
  • 윈도우 환경에서는 JNLP를 이용한 방법이 많이 사용된다.

 

처음에 오류 해결이 되지 않아 SSH를 이용한 방법도 시도해봤는데, 윈도우 환경에서 폴더 권한 수정이 되지 않아 포기했다.

SSH 이용한 방법은 리눅스 기반의 파이썬 빌드 에이전트 연결에서 다룰 예정이다.

 

 

작업 스케줄러 등록

PC를 재부팅한 경우에도 자동 실행이 되려면 서비스나 작업 스케줄러에 등록해야 한다.

  • 가상 환경에서 구축했으므로 연결 성공 상태에서 스냅샷을 생성하는 것도 방법이다.
  • 시작 프로그램에 등록하는 건 사용자가 로그인할때마다 실행되므로 권장하지 않는다.
  • 다른 포스팅에서는 javaws.exe로 실행하고 File - Install as Windows Service를 하면 된다고 하는데....
    해당 메뉴가 없다...

 

결국 작업 스케줄러에 등록해서 재부팅할 때마다 자동 실행되도록 구성한 상태에서 스냅샷을 생성했다.

 

시작 버튼을 누르고 Windows 관리 도구 - 작업 스케줄러를 실행한다.

 

메뉴의 동작 - 기본 작업 만들기를 선택한다.

 

 

작업 이름을 입력한다. JenkinsAgent로 입력했다.

 

실행 조건인 트리거를 설정한다. '컴퓨터 시작 시'에 체크했다.

 

작업은 '프로그램 시작'을 선택한다.

 

 

실행할 파일과 인수 (Argument)를 지정한다. jnlp와 jar 파일을 다운로드할 때 복사했던 명령어를 사용한다.

  • 프로그램/스크립트 - java.exe 파일 경로이다. (C:\Program Files\ojdkbuild\java-1.8.0-openjdk-1.8.0.292-1\bin\java.exe)
  • 인수 추가(옵션) - 명령어에서 java.exe 이후 부분을 복사하여 붙여 넣는다.

 

java.exe 이후 부분 입력시 주의사항

  • agent.jar 부분은 해당 파일의 전체 경로를 입력한다. (C:\Users\jenkins\Project\agent.jar)
  • secret 부분의 값은 Jenkins에서 Agent를 생성할때마다 바뀌므로 일치하는지 꼼꼼하게 확인한다.

 

입력 된 정보를 확인하고 마침 버튼을 클릭한다. 아래 체크 박스는 체크 된 상태를 유지한다.

 

 

JenkinsAgent 속성의 일반 탭에서 보안 옵션의 사용자 계정이 맞는지 확인한다.

'사용자의 로그온 여부 관계없이 실행' 을 체크한다.

 

설정 탭을 선택한다.

  • 요청 시 작업이 실행되도록 허용 - 체크
  • 예약된 시작 시간을 놓친 경우 가능한 대로 빨리 작업 시작 - 체크
  • 작업이 실패하는 경우 다시 시작 간격 - 10분으로 변경
  • 다음 횟수까지 다시 시작 시도 - 3번
  • 다음 시간 이상 작업이 실행되면 중지 - 체크 해제
  • 요청할 때 실행 중인 작업이 끝나지 않으면 강제로 작업 중지 - 체크
  • 작업이 다시 실행되도록 예약되어 있지 않으면 다음 이후에 작업 삭제 - 체크 해제

 

설정 옵션까지 변경하고 확인 버튼을 누르면 사용자 계정 정보를 입력해야 한다.

 

 

설정이 완료되면 작업 스케줄러 창으로 복귀하면 재부팅을 수행한다.

 

시스템을 재시작하고 Agent가 정상적으로 연결되는지 확인한다.

연결되는데 오래 걸리므로 여유를 가지고 확인한다. (5분 이상 소요)

다음과 같이 연결되어야 한다.