개발/DevOps

Jenkins Maven Build 후 SCP를 통한 WAS 파일 전송

유르디 2022. 6. 14. 16:31

저의 근무지에서는 원래 Jenkins에서 sshpass + scp를 통해서 운영 WAS에 빌드된 war 파일을 복사하고, 보안솔루션을 통해(HIWARE) 해당 WAS에 배포담당자가 접근해 스크립트를 실행하여 배포를 진행하고 있었습니다.

하지만 작년에 ISMS-P 인증 획득을 위해 여러가지 보안성 개선 작업을 진행하였고, 그 와중에 비보안 파일 전송 프로토콜 사용 지양이라는 항목에 걸려 Jenkins와 운영기 WAS 간 포트가 막히게 되었습니다..!

그래서 배포시 프로세스가 엄청 늘어나게 되었는데,, 그림으로 표현해보자면 아래와 같습니다.

이렇게 과정이 복잡하고 수동작업이 많다보니 지난번엔 배포담당자가 파일 이름을 헷갈려서(!) 과거 버전을 운영서버에 배포해버리는 일이 발생했고,, 어쩌다보니 신규 CI/CD 환경 구축을 맡고있는 제가 해당 내용을 진행하고 있는데.. 시작하기전엔 이정도야 간단하지! 라고 생각했던게 두달째 삽질중이라 지금이라도 이 아까운 내용을 기록으로 남겨야지.. 하고 글을 써보고 있습니다.

일단 희망하는 To-Be 프로세스는 다음과 같고, 현재 작성하고 있는 글은 그 중 운영 Jenkins <-> 운영 WAS 간 scp 전송에 대한 글 입니다.

 



일단 기존의 개발기 Jenkins <-> 운영 WAS간 scp는 sshpass를 통해 패스워드가 젠킨스 설정에 평문으로 노출되어 있었습니다. 이 방법은 아무래도 보안에 취약해보여서 (배포담당자가 계정 돌려쓰는 경우도 많음) 공개키/개인키를 이용한 방식으로 진행해보려고 했습니다.

그래서 첫번째로 진행한것은 Jenkins 서버의 공개키를 운영 WAS에 등록하고 인증을 받는것이었는데,, 리눅스에 무지한 저는 ~/.ssh 명령어가 (계정)/.ssh 폴더를 의미하는건지도 모르고.. 삽질을 많이 했습니다.

그리고 근무지 개발 / 운영 WAS에는 모두 ssh가 이미 생성되어 있었습니다. 그래서 좀 더 헷갈렸던것같긴 하네요.. 기본적으로 보안솔루션을 통해 WAS에 붙었을때는 keygen 이런 명령어도 모두 막혀있었구요

뭐 암튼 루트 폴더에 .ssh 폴더를 생성해서 authorized_keys를 생성해놓고 클라이언트에서 왜 안붙지.. 이러고있었고

서버에의 계정 .ssh폴더에 authorized_keys 잘 생성해놓고 -i 옵션을 빼먹고 왜 안되지 이러고 있었고..

저처럼 고생하실분들을 위해 정리해보자면
접속하는 곳을 클라이언트, 접속할 곳을 서버라고 했을 때, 클라이언트에서 발행한 공개키({이름}.pub 파일) 의 내용을 서버의 접속할 계정의 루트 폴더 /.ssh 폴더 안의 authorized_keys 파일 안에다가 입력해 두어야 합니다..!

그리고 클라이언트에서 서버로 ssh 접근을 시도할 때 발행된 공개키가 기본 폴더 안에 없을 경우 -i {경로} 옵션을 통해서 어떤 공개키를 사용해서 접근할건지 여부 또한 정해줘야합니다(근무지 WAS에는 4개정도가 발행되어있었음) 알아서 찾아보려고 노력은 하던데 잘 못찾더라구요..!

하루종일 삽질을 반복하다 드디어 공개키/개인키를 통한 ssh 인증에 성공했는데..! 결국 passphrase를 입력해야 인증이 가능하더라구요.. 흑흑

결국 현재는 jenkins에 publish over ssh 플러그인을 설치해서 원하던 프로세스를 구축하는데 성공했습니다. Passphrase 없이 아래와 같이 path to key에 클라이언트의 개인키(.pub 아닌파일) 경로를 입력하고

 

SSH Servers에 서버명, 호스트, 사용자명과 원격 경로를 알맞게 입력하면 설정이 완료됩니다.

 

 

그리고 구성된 item의 설정에 들어가서 빌드 후 조치의 추가버튼을 눌러보면 Send build artifacts over SSH라는 내용이 있습니다. 해당 설정을 추가하고 위에서 설정한 SSH Server를 선택, 빌드 후 전송할 파일과 원격지 주소를 설정하면 Jenkins에서 빌드 후 자동으로 해당 파일을 원격지 서버로 전송하게 됩니다! (해당 서버 내 커맨드도 실행 가능합니다.)