프로젝트/SNS를 통한 운동팀 매칭 서비스

배포환경 구축(4) : CI/CD 환경 구축

Mev01 2021. 8. 27. 02:09

이번 포스트에는 사진에서 표시한 부분을 구현하겠습니다.

 

먼저 docker 설치, docker에 jenkins 설치를 진행합니다.

진행 중 docker permission error가 생길 경우 이 블로그를 참고하시면 됩니다.

 

 

Jenkins 설정 관리


먼저 필요한 플러그인을 설치해 보겠습니다.

 

Jenkins 관리 - 플러그인 관리를 통해 플러그인 목록에 들어갑니다.

 

 

 

설치 가능 탭에 들어가 Git, Gitlab 관련 플러그인, Blue Ocean 관련 플러그인을 다운로드합니다.

 

 

 

그다음 Global Tool을 설정해 보겠습니다.

 

 

 

Maven과 NodeJS를 생성해 놓습니다.

 

 

 

Jenkins pipeline build 설정


Jenkins 왼쪽 메뉴바 - 새로운 Item - Pipeline을 통해서 새로운 Pipeline을 만듭니다.

그리고 해당 Pipeline의 왼쪽 메뉴바 - 구성에서 설정을 수정합니다.

 

먼저 Build Trigger를 활성화하고 build를 수행할 상황을 체크해줍니다.

 

 

 

Gitlab, Jenkins 연동


위의 이미지대로 deploy token을 생성한 뒤 토큰의 username, password를 따로 저장해놓습니다.

 

다시 Jenkins pipeline의 구성에서 Pipeline Syntax를 이용해서 pipeline script를 생성해보겠습니다.

 

Pipeline Syntax를 들어가면 위와 같은 화면이 나오는데

여기서 Sample Step은 git: Git을 선택하고 

Repository URL은 gitlab 주소를 적고

Branch는 빌드할 branch 이름을 적습니다.

 

Credentials는 Add 버튼을 누르면

위와 같은 화면이 나오는데 여기서 username, password에 생성했었던 gitlab deploy token 값을 적습니다.

그리고 Add 합니다.

생성한 이후 Credentials를 보면 작성했던 Credential이 있는 것을 알 수 있습니다.

해당 Credential을 클릭하고 Generate Pipeline Script를 생성합니다.

 

git branch: 'develop', credentialsId: '*****', url: '***.git'

script를 생성했을 때 위와 같은 script가 생성된다면 잘 된 것입니다.

 

 

EC2 Server와 Jenkins 연결


Jenkins는 EC2 Server에 들어있는 것처럼 보이지만

Jenkins는 docker에 들어있기 때문에 서로 간에 바로 접근할 수 없습니다.

 

그래서 Jenkins의 공개키를 EC2 Server에 넣어서 Jenkins에서 EC2 Server를 원격 접속할 수 있도록 만들겠습니다.

# jenkins 접속
docker exec -it jenkins /bin/bash

# ssh key 생성
ssh-keygen
cd ~/.ssh
cat id_rsa.pub
# 나온 공개키 전부를 복사

exit
# ubuntu의 ssh 로 접속
cd ~/.ssh
vi authorized_keys
# 원래 내용 제일 마지막에 a추가하고 엔터
# 복사한 공개키 붙여넣기

 

ifconfig를 통해 ip를 얻습니다

 

이제 Jenkins에서 원격 접속할 수 있는지 테스트해보겠습니다.

docker exec -it jenkins /bin/bash
ssh ubuntu@[ip]

얻었던 ip를 주소를 이용해 Jenkins에서 EC2 Server로 접속할 수 있었습니다.

 

 

 

Pipeline script 작성


이제 다시 Jenkins pipeline의 구성에서 Pipeline script를 작성해줍니다.

[ ]에 있는 것은 자신의 프로젝트에 맞춰 채워줍니다.

pipeline {
    agent any
    tools {
    	// 작성했었던 global tool
        nodejs 'node14'
        maven 'maven'
    }
    stages {
        stage('prepare') {
            steps {
                gitlab, jenkins 연동때 얻었던 script
            }
        }
        
        stage('back build'){
            steps {
                sh('cd backend && mvn package')
            }
        }
        
        stage('back deploy'){
            steps {
                sh('scp -r ./backend/target/[build이후 만들어진 jar 파일 이름] ubuntu@[EC2 Server ip]:~/[Git 프로젝트 이름]/backend/target/[build이후 만들어진 jar 파일 이름]')
                sh("ssh ubuntu@[EC2 Server ip] 'cd [Git 프로젝트 이름]/backend/target' && ssh ubuntu@[EC2 Server ip] './restart_backend1.sh'")
            }
        }
        
        stage('front build') {
            steps {
                sh('cd frontend && yarn install && yarn build')
            }
        }
        
        stage('front deploy'){
            steps{
                sh("ssh ubuntu@[EC2 Server ip] 'rm -rf ~/[Git 프로젝트 이름]/frontend/dist'")
                sh('scp -r frontend/dist ubuntu@[EC2 Server ip]:/home/ubuntu/[Git 프로젝트 이름]/frontbase')
            }
        }
    }
}

 

 

Jenkins Test


Jenkins Pipeline의 왼쪽 메뉴 - Build Now를 눌러 성공적으로 빌드, 배포가 되는지 확인합니다.

저희 팀에서 build 중 에러가 생긴 내용을 기록해 두겠습니다.

 

# 파이썬 설치(에러 : 프론트 yarn 설치할 떄)
apt install python

# 에러 발생 not found make
apt-get install build-essential

# stack Error: make failed with exit code: 2(노드 버전이 안맞아서?)
# global tool management에서 노드 버전 낮추고 다시 빌드