본문 바로가기

개발/Linux & DevOps

docker jenkins CD/CI ② - publish over ssh 와 pipeline sshTransfer

서론

이전 글에서 언급했다시피publish over ssh 에서 Exec command 창에 입력하는 bash 명령어는 무엇이든 가능하여,
pipeline 을 대체할 수 있을 정도이다.

많은 사람들이 각자 다른 방식으로 구축을 했다.

누군가는 project 빌드까지 jenkins server 에서 진행, conf 파일과 tar 압축하여 ssh 전송 후 배포 [링크]

누군가는 git pull 받은 소스를 pipeline 설정으로 전부 배포 서버로 ssh 전송 후 빌드, 배포 [링크]

누군가는 publish over ssh 는 아니지만, pipeline 에서 ssh 커맨드를 통해 배포 [링크]

 등등 다양한 방법이 있다.

 

개인적으로는 pipeline 의 역할이 분명하고, 그 바운더리 안에서 관리가 되야한다고 생각하기에,
exec 커맨드를 쓰기보단 pipeline 스크립트로 해결하고 싶다는 생각이 든다. (script 내부에서 sshTransfer 설정)

Publish Over SSH t설정으로 원격서버와 그 접속정보를 추가하는 방법과,
어떻게 pipeline 안에서 이 기능을 활용하는지 한번 살펴보자.

Publish Over SSH - SSH Servers 환경변수 설정

Dashboard > Jenkins 관리 > 시스템 설정

  • Name : 환경 변수명(Jenkins 환경 변수)
  • Hostname : 원격 서버 IP
  • Username : 원격 서버 user 이름
  • Remote Directory : 원격서버 작업 디렉토리

SSH 키 이용시

  • Passphrase : SSH 암호를 사용하는 경우 암호를 설정
  • Path to key : SSH 키를 사용하는 경우 개인키 파일의 경로 설정
  • Key : Path to key와 동일, text file로 존재하게 될 경우 이 부분에 입력


프로젝트에 빌드 후 조치 적용

Dashboard > 프로젝트 > 구성 > 빌드 후 조치 항목 추가 > Send build artifacts over SSH

SSH Publishers - SSH Server

Name : 이전에 설정한 SSH Server 환경 변수

Transfers : 원격 서버에 전송할 내용들

- 많은 Transfer Set 설정 가능

- Source files, Remove prefix, Remote directory 미입력 후 Exec command만 입력하여 원격 서버에 스크립트 실행만 할 수도 있음

Source files

- 원격 서버로 보낼 파일의 경로를 설정합니다.

- 프로젝트/작업공간 아래부터 경로를 입력

- ex) deploy-spring-test/target/deploy.war

Remove prefix

- Source files에서 지정한 경로의 하위 폴더를 지우는 기능입니다

- SSH 로 접속/파일 전송 시 source files 에서 제거할 prefix

- ex) deploy-spring-test/target

Remote directory

- Source files가 저장될 원격 서버 폴더 경로

- SSH Server로 지정한 서버의 원격지 폴더경로 이후부터 지정

Exec command

- 파일 전송이 끝난 이후에, 원격 서버에 실행될 스크립트

- ※유의점 : jenkins user로 스크립트를 실행하기 때문에 특정 명령어에 대한 권한 문제가 발생할 수 있음

 

Publish over SSH 를 활용한 Pipeline 작성

위와 같은 방법으로 ssh 서버를 설정 해놓는다.

그러면 pipeline script 에서 해당 서버를 불러와 필요한 작업을 진행한다.

공식문서에 따르면, build 하기 전의 소스코드를 전송하는 방법과 build 된 결과물을 전송하는 방법이 있다.

stage('SSH transfer') {
 script {
  sshPublisher(
   continueOnError: false, failOnError: true,
   publishers: [
    sshPublisherDesc(
     configName: "${env.SSH_CONFIG_NAME}",
     verbose: true,
     transfers: [
      sshTransfer(
       sourceFiles: "${path_to_file}/${file_name}, ${path_to_file}/${file_name}",
       removePrefix: "${path_to_file}",
       remoteDirectory: "${remote_dir_path}",
       execCommand: "run commands after copy?"
      )
     ])
   ])
 }
}

이 중에서 "transfers : [ sshTransfer " 부분은 여러번 쓰일 수 있다.
따라서 exec Command 를 따로 정리하면 보기 좋게 정리할 수 있다.

transfers:[
  sshTransfer(
    execCommand: "Run commands before copy?"
   ),
  sshTransfer(
    sourceFiles:"${path_to_file}/${file_name}, ${path_to_file}/${file_name}",
    removePrefix: "${path_to_file}",
    remoteDirectory: "${remote_dir_path}",
    execCommand: "run commands after copy?"
  )
])

출처 : https://dzone.com/articles/intro-to-jenkins-pipeline-and-using-publish-over-s

 

반응형