데이터과학 삼학년

젠킨스 remote ssh pipeline (feat. nested parallel, remote ssh, gcloud compute ssh) 본문

DevOps

젠킨스 remote ssh pipeline (feat. nested parallel, remote ssh, gcloud compute ssh)

Dan-k 2020. 8. 28. 23:10
반응형

젠킨스 파이프라인에서 다른 vm ssh에 접속해 데이터 전처리를 처리하는 것을 알아본다.

 

젠킨스는 1번 vm에 깔려 job을 관리하고 있고

젠킨스에서 내린 명령은 2번 vm에서 parallel로 돌기를 원한다

 

Pipeline

1. 젠킨스가 깔린 1번 vm에서 실행시키고자 하는 코드를 git으로 부터 받는다.

2. 1번 vm에 있는 코드를 2번 vm에 복사하여 넣는다 (gcloud compute scp)

3. 2번 vm에서 parallel로 돌도록 명령을 내린다 (gcloud compute ssh)

 

젠킨스 파이프라인 코드

def preprocessParallel(LANGUAGE, N_SPLIT, MODE) {
     sh """
        gcloud compute ssh anomaly-detection-pan --project='2번 vm 인스턴스 project_id' --zone='us-central1-f' \
        -- "sudo python /home/ubuntu/preprocess.py --job_date=${JOB_DATE} --project_id=${PROJECT_ID} --language=${LANGUAGE} --n_split=${N_SPLIT} --mode=${MODE}"
    """
}
def preprocessNestedParallel(MODE){
    parallel(
            'ko-kr': {
                LANGUAGE = 'ko-kr'
                N_SPLIT = 10
                preprocessParallel(LANGUAGE, N_SPLIT, MODE)
            },
            'en-us': {
                LANGUAGE = 'en-us'
                N_SPLIT = 10
                preprocessParallel(LANGUAGE, N_SPLIT, MODE)
            },
            'etc': {
                LANGUAGE = 'etc'
                N_SPLIT = 10
                preprocessParallel(LANGUAGE, N_SPLIT, MODE)
            }
        )
}
node {
    JOB_DATE   = sh(script: 'TZ=Asia/Seoul date "+%Y%m%d" -d "yesterday"', returnStdout: true).trim() #'20200827'
    PROJECT_ID='project_id'
    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:preprocess ./
                    else
                        git pull origin preprocess
                    fi
                """
            }
        }
    }
    stage('Copy files to Remote SSH') {
        sh """
            eval `ssh-agent`
            ssh-add ~/.ssh/google_compute_engine
            gcloud compute scp --project="2번 vm 인스턴스 project_id" --zone="us-central1-f" \
            --recurse /var/lib/jenkins/workspace/preprocess root@<2번 vm 인스턴스명>:/home/ubuntu
        """
        sh """
            echo Completed copy files from local to remote ssh
        """
    }
    // PARALLEL 은 데이터를 각 수행잡별로 BQ에 올리기 때문에 APPEND 형태로 되어 있음 
    // 따라서 먼저 기존에 데이터가 있다면 지워야 함
    timeout(time:30, unit:'MINUTES'){
        stage('Initialize preprocess data in BQ'){
            echo 'initialize BQ table'
            sh """
                bq rm --project_id=${PROJECT_ID} -f -t DATASET.preprocess_data_${JOB_DATE}
            """
        }
    }
    timeout(time:2, unit:'HOURS') {
      stage('Compute remote ssh & Nested Preprocess Parallel') {
          parallel(
              'train': {
                  MODE = 'train'
                  preprocessNestedParallel(MODE)
              },
              'predict': {
                  MODE = 'predict'
                  preprocessNestedParallel(MODE)
              }
          )
      }
	}
}
728x90
반응형
LIST
Comments