Image를 가상서버에서 띄우기(ssh, jenkins pipeline)

LeeKyoungChang·2023년 1월 24일
0
post-thumbnail

docker, jenkins 실행 목록

 

📚 1. plug in 추가 및 설정

✔️ SSH Agent 추가 (plugins에서 추가해주면 된다.)

스크린샷 2023-01-24 오후 9 35 18

 

✔️ Credentials에 ec2 추가

스크린샷 2023-01-24 오후 9 36 03

 

스크린샷 2023-01-24 오후 11 25 44
  • Kind : SSH Username with private key를 선택
  • ID : 하고 싶은 ID
  • Username : ubuntu
  • Private Key, Enter directly에서 add버튼 클릭 후, server 인스턴스의 pem 파일 내용을 넣어준다. (BEGIN ~ END)

 

스크린샷 2023-01-24 오후 11 25 51

 

 

✔️ 완성된 pipeline

pipeline {

    agent any
    
    environment {
        imagename = "lkc263/d208backend"
        registryCredential = 'DockerHub_IdPwd'
        dockerImage = ''
    }
    
    stages {
        stage('git clone') {
            steps {
                dir('study_docker') {
                    checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
                }
            }
        }
        
        stage('build') {
            steps {
                dir('study_docker/chuno') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean bootJar"
                }
            }
        }
        
         stage('docker-build'){
            steps {
                echo 'Build Docker'
                dir('study_docker/chuno'){
                    script {
                        sh "pwd"
                        dockerImage = docker.build imagename
                        
                    }
                }
            }
        }
        
        stage('docker-push'){
            steps{
                echo 'Push Docker'
                script {
                    docker.withRegistry('', registryCredential){
                        dockerImage.push("1.0")
                    }
                }
                
            }
        }
        
        stage('SSH-Server-EC2'){
            steps {
                echo 'SSH'
                
                sshagent(credentials: ['ECGumD208']) {
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "whoami"'
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker pull lkc263/d208backend:1.0"'
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker run lkc263/d208backend:1.0"'
                }
            }
        }
        
    }
}
  • -o StrictHostKeyChecking=no : ssh접속 시 host의 key를 확인하지 않는다.

 

 

📚 2. 사용자가 push 할 때마다 사이트 업데이트 및 배포

✔️ pipeline

clone -> build -> docker-build -> docker-push -> SSH-Server-EC2

pipeline {

    agent any
    
    environment {
        imagename = "lkc263/d208backend"
        registryCredential = 'DockerHub_IdPwd'
        dockerImage = ''
    }
    
    stages {
        stage('git clone') {
            steps {
                dir('study_docker') {
                    checkout scmGit(branches: [[name: '*/main']], extensions: [submodule(parentCredentials: true, reference: '', trackingSubmodules: true)], userRemoteConfigs: [[credentialsId: 'github-repo-user', url: 'https://github.com/ToDoStudy/study_docker']])
                }
            }
        }
        
        stage('build') {
            steps {
                dir('study_docker/chuno') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean bootJar"
                }
            }
        }
        
		stage('docker-build'){
            steps {
                echo 'Build Docker'
                dir('study_docker/chuno'){
                    script {
                        
                        sh """
                        if ! test docker; then
                    	curl -fsSL https://get.docker.com -o get-docker.sh
                    	sh get-docker.sh
                        fi
                        """

                        dockerImage = docker.build imagename
                        
                    }
                }
            }
        }
        
        stage('docker-push'){
            steps{
                echo 'Push Docker and delete image'
                
                sshagent(credentials: ['ECGumD208']) {
                    
                    sh '''
                    if test "`docker ps -aq --filter ancestor=lkc263/d208backend:1.0`"; then
                    
					ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker stop $(docker ps -aq --filter ancestor=lkc263/d208backend:1.0)"
                    ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker rm -f $(docker ps -aq --filter ancestor=lkc263/d208backend:1.0)"
                    ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker rmi lkc263/d208backend:1.0"

                    fi
                    '''
                }
                
                script {
                    docker.withRegistry('', registryCredential){
                        dockerImage.push("1.0")
                    }
                }
                
            }
        }
        
        stage('SSH-Server-EC2'){
            steps {
                echo 'SSH'
                
                sshagent(credentials: ['ECGumD208']) {
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker pull lkc263/d208backend:1.0"'
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker run -i -p 8080:9999 -d lkc263/d208backend:1.0"'
                }
            }
        }
        
    }
}

 

✔️ docker image 만들 때 만약 아직 docker가 설치되지 않았다면 설치

                        sh """
                        if ! test docker; then
                     	curl -fsSL https://get.docker.com -o get-docker.sh
                    	sh get-docker.sh
                        fi
                        """

 

✔️ push 할 때, ec2 가상서버가 실행되고 있다면 종료시키기

새로운 가상 서버를 open 하기 위해 이전 가상서버를 종료시킨다.

                sshagent(credentials: ['ECGumD208']) {
                    
                    sh '''
                    if test "`docker ps -aq --filter ancestor=lkc263/d208backend:1.0`"; then
                    
					ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker stop $(docker ps -aq --filter ancestor=lkc263/d208backend:1.0)"
                    ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker rm -f $(docker ps -aq --filter ancestor=lkc263/d208backend:1.0)"
                    ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker rmi lkc263/d208backend:1.0"

                    fi
                    '''
                }

 

✔ image를 pull 받고, port 8080에 9999번 포트를 뛰운다.

                sshagent(credentials: ['ECGumD208']) {
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker pull lkc263/d208backend:1.0"'
                    sh 'ssh -o StrictHostKeyChecking=no ubuntu@52.79.219.150 "docker run -i -p 8080:9999 -d lkc263/d208backend:1.0"'
                }
스크린샷 2023-01-25 오후 11 25 32

 

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글