데이터과학 삼학년

[Jenkins] remote ssh 연결하여 jenkins에서 다른 ssh에 명령 날리기 (feat. gcloud compute ssh, gcloud compute scp, jenkins) 본문

DevOps

[Jenkins] remote ssh 연결하여 jenkins에서 다른 ssh에 명령 날리기 (feat. gcloud compute ssh, gcloud compute scp, jenkins)

Dan-k 2020. 8. 27. 18:21
반응형

jenkins를 이용해 job을 관리한다.

 

이때 내가 구성한 pipeline의 stage 마다 실행될 환경이 local이 아닌 remote ssh일 경우가 있다.

 

이때 어떻게 연결해야 할까?

 

만약 GCP를 쓰고 있고 GCP의 compute engine에 연결하고 싶다면

gcloud compute ssh 커맨드를 참고하면 된다.

## example-instance에 접속
gcloud compute ssh example-instance --zone=us-central1-a
gcloud compute ssh [USER@]INSTANCE [--command=COMMAND] [--container=CONTAINER] [--dry-run] [--force-key-file-overwrite] [--plain] [--ssh-flag=SSH_FLAG] [--ssh-key-file=SSH_KEY_FILE] [--strict-host-key-checking=STRICT_HOST_KEY_CHECKING] [--zone=ZONE] [--internal-ip     | --tunnel-through-iap] [--ssh-key-expiration=SSH_KEY_EXPIRATION     | --ssh-key-expire-after=SSH_KEY_EXPIRE_AFTER] [GCLOUD_WIDE_FLAG …] [-- SSH_ARGS …]

자세한 사항은 아래 링크 참고

https://cloud.google.com/sdk/gcloud/reference/compute/ssh

 

gcloud compute ssh  |  Cloud SDK 문서  |  Google Cloud

 

cloud.google.com

 

이뿐만 아니라 local의 파일을 remote ssh에 붙이고 싶다면

gcloud compute scp 커맨드를 참고하자

gcloud compute scp --recurse example-instance:~/narnia ~/wardrobe

 

파이프라인을 아래와 같이 만들면

코드를 git에서 읽어온 다음 local에 저장된 code를 다시 remote ssh로 copy한다.

그 이후 remote ssh에서 특정 명령을 실행하는 코드다

node {
    timeout(time:30, unit:'MINUTES') {
        stage('Code_Sync') {
            retry(3) {
                sh script:"""
                    if [ ! -d ".git" ]; then
                        rm -rf ./*
                        git clone -b preprocess --single-branch git@00.000.0.0:code/preprocess ./
                    else
                        git pull origin preprocess
                    fi
                """
            }
        }
    }
    stage('Copy file to Remote SSH') {
        sh """
            eval `ssh-agent`
            ssh-add ~/.ssh/google_compute_engine
            gcloud compute scp --project="project" --zone="us-central1-a" \
            --recurse /var/lib/jenkins/workspace/preprocess root@example-instance:/home/ubuntu
        """
        sh """
            echo Completed copy files from local to remote ssh
        """
    }
    stage('Compute remote ssh') {
        sh """
            gcloud compute ssh example-instance --project='project'
        """
        
    }
}

여기서 주의할 것은 연결하고자하는 ssh 에서 permission error가 나올 수 있다.

이때는 root@<instance명> 으로 입력해주면 된다!!!

 

https://cloud.google.com/sdk/gcloud/reference/compute/scp

 

gcloud compute scp  |  Cloud SDK 문서  |  Google Cloud

 

cloud.google.com

 

 

만약 연결하는 ssh이 GCE 가 아니라면

젠킨스에서 직접 제공해주는

SSH Pipeline Steps 을 이용해서 파이프라인을 구성해 주면 된다

 

예제

def remote = [:]
remote.name = 'test'
remote.host = 'test.domain.com'
remote.user = 'root'
remote.password = 'password'
remote.allowAnyHosts = true

stage('Remote SSH') {
  sshCommand remote: remote, command: "ls -lrt"
  sshCommand remote: remote, command: "for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done"
}

https://www.jenkins.io/doc/pipeline/steps/ssh-steps/

 

SSH Pipeline Steps

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

 

728x90
반응형
LIST
Comments