Jenkins 빌드 서버 환경 만들기 – 4. SSH 로 파일 배포 및 PsExec 로 파일 실행하기

빌드 후 SSH 로 파일 배포하고 PsExec 로 배포한 파일 실행하기


Jenkins 로 빌드 요청까지 성공했으니 이제 빌드 된 파일을 배포하는 작업을 해야 한다. 빌드를 배포하는 부분은 SSH 를 사용 할 것이고, 프로그램을 시작 하는 것은 PsExec.exe 를 사용할 것이다.


SSH 서버 / 클라이언트 설정

  • SSH 서버가 되는 쪽은 프로그램이 실행 될 장비이고, SSH 클라이언 가 되는 쪽은 Jenkins 가 설치된 장비이다. SSH 서버 장비는 WIndows Server 2012 R 이고, SSH 클라이언트 장비는 Windows 10 이다.

  • 우선, 다운 받은 OpenSSH-Win64 를 압축을 풀어 C:\Program Files 에 넣는다.
  • PowerShell 을 열고 Install-sshd.ps1 를 실행한다.

  • 방화벽을 열기 위해 아래 명령어를 입력한다.

  • RSA 인증 방식을 사용하기 위해서 RSA 키를 생성하기 위해서, SSH 클라이언트에서 아래의 명령어를 입력하자. 입력을 받는 부분은 모두 엔터를 입력하자.
    • C:\Users\유저명\.ssh 에 rsa private / public key 가 생성된 것을 확인할 수 있다.
    • .pub 가 public key 이다.

  • 이제 C:\Users\유저명\.ssh\id_rsa.pub 파일을 SSH 서버 쪽의 C:\Users\유저명\.ssh 에 복사하자.
    • PowerShell 의 경우 아래 처럼 입력하면 된다.

  • 그리고, SSH 서버쪽 장비의 C:\ProgramData\ssh 폴더에 있는 sshd_config 파일중 아래의 목록을 찾아서 수정해야 한다.
    • 참고로, AuthorizedKeysFile 항목에 적혀 있는 .ssh/파일명 부분 중 파일명으로 위에서 복사한 id_rsa.pub 파일 이름을 변경해야 한다.

  • 이제 SSH 클라이언트 장비에서 cmd 창을 열어서 아래와 같이 접속을 시도해 보자. 비밀번호 입력 없이 접속에 성공할 것이다.


Jenkins 에 SSH 설정

  • 우선 Publish Over SSH 플러그인을 Jenkins에 설치하자.

  • 이제 환경설정에 들어가서 SSH Server 정보를 세팅하자. Publish over SSH 항목에서 SSH Server 정보를 입력하면 된다.
    • Name 에는 보여질 이름을 입력하자.
    • Hostname 에는 SSH Server IP 를 입력하자.
    • Username 에는 SSH Server 장비의 유저명을 입력하자.
    • Remote Directory 는 SSH Server 에 SSH 로그인 할 때, 기본 디렉토리를 어디로 할 것인지를 입력하자.

  • 이제 특정 프로젝트 빌드 후 SSH 배포를 위한 설정을 하자.
    • 원하는 프로젝트의 설정에 들어가서 가장 하단에 ‘빌드 후 조치 추가’ 버튼을 클릭해서 ‘Send build artifacts over SSH’ 를 추가 하자.

  • Send build artifacts over SSH 가 추가 되었다면, SSH 로그인 정보를 아래와 같이 입력을 하자.
    • Name 은 아까 환경설정에서 설정한 SSH Server 정보를 선택하면 된다.
    • Username 에는 SSH Server 장비의 유저명을 입력하면 된다.
    • Path to key 는 rsa private key 가 있는 경로를 파일명까지 같이 입력하면 된다.
    • Key 에는 private key 를 열어서 안에 있는 내용을 복사하면 된다.
    • 마지막으로, Test Configuration 버튼을 눌러보면 Success 가 뜨면 된다.

  • SSH 로그인 정보를 입력했으니, 배포를 위한 정보를 입력해보자.
    • Source files 에는 배포할 파일에 대한 정보를 입력하면 된다. 해당 경로는 ‘사용자 빌드 경로’ 를 기준으로 입력하면 된다.
    • Remove prefix 는 제거할 접두사 경로를 입력하면 된다. 예를 들어 Source files 의 경로가 A/B/C.exe 를 입력했고, A/B/C.exe 전체를 배포하는 것이 아니라 C.exe 파일만 배포하고 싶다면, Remove prefix 에는 A/B 를 입력하면 된다.
    • Remote direcotry 는 배포할 위치를 입력하면된다. 해당 경로는 환경설정에서 설정한 Remote Directory 를 기준으로 한다.

  • 여기까지 진행하고 빌드를 시도해보면 Jenkins Console Ouput 에 아래와 같이 나올 것이다.
    • 참고로 나는 빌드가 성공하면 파일 3개를 보낸다.


PsExec.exe 로 파일 실행

애초에 SSH 로 프로그램 시작까지 한 번에 처리하고 싶었으나 Jenkins 에서 지원하는 SSH 기능으로는 새로운 CMD 에 프로그램을 실행하는 방법을 도무지 찾을 수 없었다. 물론 기존 CMD 에서 프로그램을 실행할 수는 있었지만, Jenkins 에서 빌드 과정이 종료되는 것이 아니라 실행시킨 해당 프로그램이 종료 되거나 일정 시간이 될 때 까지 계속 물고 있는 상황이 발생했다. 혹시나 해서 윈도우 CMD 를 켜서 SSH 접속을 시도 한 후에, 새로운 CMD 창에서 프로그램 실행하는 명령어를 입력하면 잘 된다. 하지만, SSH 접속 시도와 새로운 CMD 창에서 프로그램 실행 명령를 한 라인으로 입력하게 되면 명령어 자체가 먹지 않았다. 실패하는 것이 아니라 명령어가 먹히지 않는 문제가 발생했다. 문제는 Jenkins 에서도 새로운 CMD 창에서 프로그램을 실행하는 명령어를 입력하면 에러가 발생하지는 않지만, 명령어도 먹히지 않았다.

그래서 혹시나 해서 동일한 명령어를 PsExec.exe 를 이용했더니 프로그램이 잘 실행되는 것을 확인했다. 그래서 PsExec.exe 를 사용한 것이다.

  • 아래의 사이트에서 PSTools.zip 을 다운 받아서, PsExec.exe 를 장비 환경에 따라서 System32 또는 SysWOW64 에 복사 하자.

  • 이제 Jenkins 에서 ‘PostBuildScript’ 플러그인을 설치하고 프로젝트 설정에서 정보를 세팅하자.

  • ‘빌드 후 조치’ 부분에서 ‘Execute Scripts’ 를 추가하고 아래와 같이 설정하자.
    • Generic script file path 는 bat 파일 경로를 입력하면 된다. 내 경우에는 여기서 입력한 bat 파일은 위에 있는 PsExec 명령어가 들어 있다.
    • if build was 는 하고 싶은거 선택하면 된다.
    • Execution is limited to 도 마찬가지로 상황에 맞게 선택하자.

  • 이제 빌드를 요청해보면 빌드 후에 아래와 같이 명령어가 잘 실행되는 것을 볼 수 있을 것이다.
    • PsExec 명령어를 통해서 접속을 시도하고, 접속한 장비의 bat 파일을 실행한 결과가 문제 없다는 로그가 적혀 있다.




Reply