Jenkins CI/CD Pipeline 구축

진성·2023년 2월 3일
0

Jekins 파이프파인 구축

데이터 플로우

  1. 로컬에서 소스코드 깃허브로 푸시
  2. 깃허브 웹훅으로 젠킨스 빌드 트리거 설정
  3. 젠킨스 파이프라인 스크립트 실행
    • 깃 클론 또는 풀
    • 도커파일 이미지 빌드
    • 도커파일 도커허브 레포지토리 푸시
    • 서버 ec2 ssh 접속
    • 기존 실행되던 컨테이너 중지 및 삭제
    • 기존 이미지 파일 삭제
    • 도커허브에서 이미지 받고 실행

Jenkins 세팅

세팅하기 전에 먼저 도커허브에 레퍼지토리가 하나 있어야한다.
도커허브에 들어가서 회원가입하고 레퍼지토리를 하나 생성해주면 된다.

Jenkins 설치 및 실행

젠킨스 설치는 독스에 아주 자세히 나와있다.
아래 주소로 들어가 자기의 운영체제에 맞게 보고 따라만 하면 된다.
👉 https://www.jenkins.io/doc/book/installing/docker/
나는 도커로 하는게 편했기에 도커로 진행했다.

설치를 하고 독스보고 따라 실행하게 되면 위와 같은 메인페이지가 나오게 된다.
나는 현재 프로젝트가 하나 만들어져 있기때문에 위와 같이 나오지만 처음 시작하면 프로젝트가 없을것이다.

Jenkins Credentials 세팅

프로젝트를 만들기 전에 먼저 Credentials 설정을 해주어야 한다.
해줘야할 Credentials 설정은 github, dockerhub, ec2-ssh-pem 을 설정해주어야 한다.

먼저 왼쪽 메뉴에 Manage Jenkins(젠킨스 관리)에 들어간다.

그리고 Mange Credentials에 들어간다.

System을 들어간다.

Global credentials를 들어가고 우측 상단에 크리덴셜 추가를 해준다.

가장 먼저 도커허브 credentials이다.
1. 먼저 종류는 Username with password를 지정한다.
2. Username은 도커허브 아이디를 넣어준다. 메일이 주소가 아닌 아이디를 넣어주어야한다.
3. 실제 도커허브 패스워드를 넣어주어야 한다.
4. ID는 개인이 식별할 수 있게 넣어준다. ex) dockerhub-accesstoken

create 버튼을 눌러 만들게 되면 위와 같이 만들어진다.

다음은 깃허브 credentials이다.
1. 종류는 Secret text를 선택해준다.
2. Secret에 깃허브 Personal access tokens을 발급받아 넣어준다. 발급 받을때 권한 체크를 정확히 해주어야 한다. 발급받는 방법은 아래 블로그를 참고하면 된다.
👉 https://bskyvision.com/entry/git-access-token-%EB%B0%9C%EA%B8%89-%EB%B0%9B%EB%8A%94-%EB%B0%A9%EB%B2%95
3. ID는 개인이 식별할 수 있게 넣어준다.

ssh credentials 설정이다.
1. 종류는 SSH Username with private key로 해준다.
2. ID는 개인이 식별하기 위한 ID를 넣어준다. ex) project-ssh-key
3. Username에는 ec2 접속할때 필요한 Username을 넣어준다. ex) ubuntu, root, ec2-user
4. 아래와 같이 Enter directily를 체크해주면 ADD 버튼이 나오고 버튼을 누르면 입력창이 나온다. 거기에 pem 키 내용을 복사하여 넣어준다.

모두 만들게 되면 이제 secret이 3개가 된다.
이제 credentials 세팅은 끝이다.

Jenkins 파이프라인 세팅

처음 화면으로 넘어와서 왼쪽 메뉴바에 뉴 아이템을 누른다.

프로젝트 이름을 적고 파이프라인을 선택해준다.

선택하고 넘어가면 위에는 신경쓰지 말고 아래로 쭉내려온다.

그럼 이와 같이 파이프라인 스크립트를 입력할 수 있는 입력창이 나온다.

pipeline {
    environment { 
        dockerImage = ''
    }
    
    agent any 
    
    stages {
        stage('GitHub Repository Clone') { 
            steps {
              
                git credentialsId: '위에서 만들었던 깃허브 credentials ID', url: 'https://깃허브 레퍼지토리 URL'
              
            }
        }
        
        stage('Build image') {
            steps {
                script {
                    dockerimage = docker.build("도커허브 레퍼지토리:태그이름")
                }
            }
        }
        
        stage('Push image') {
            steps {
                script {
                    withDockerRegistry(credentialsId: '위에서 만들었던 도커허브 credentials ID') {
                        dockerimage.push()
                    }
                }
            }
        }

        stage('EC2 connect') {
            steps {
                sshagent(['위에서 만들었던 ssh credentials ID']) {
                    sh """
                        ssh -o StrictHostKeyChecking=no username@서버 IP '
                        docker stop 도커컨테이너 이름
                        docker rm 도커컨테이너 이름
                        docker rmi 도커레포지토리:태그
                        docker login -u 도커아이디 -p 도커비밀번호
                        docker pull 도커레포지토리:태그
                        docker run -d --name 컨테이너이름 도커레포지토리:태그
                        '
                    """
                }
            }
        }
    }
}

위와 같이 스크립트를 짜주고 저장한다.

실행시키기 전에 필요한 플러그인을 하나 설치해준다.
credentials 세팅을 위해 들어갔던 Mange Jenkins(젠킨스 관리)로 들어간다.

Mange Plugins로 들어간다.

왼쪽 메뉴에 Available plugins로 들어가서 ssh agent를 검색한다.
나는 이미 설치를 해서 안보이지만 처음 젠킨스를 설치할때 추천 플러그인으로 시작한 사람들은 나올것이다.
선택하고 아래 쪽에 설치 후 다시시작을 눌러준다.

그리고 다시 로그인하고 들어가면 프로젝트가 하나 있을 것이다.
프로젝트를 클릭해서 들어간다.

그리고 왼쪽 메뉴바에 Build Now를 누르게 되면 짜놓은 스크립트가 실행이 된다.

그럼 위와 같이 정상적으로 작동이 되는것을 확인할 수 있다.

Git webhook 세팅

이제 Git webhook을 이용해 jenkins 트리거를 설정해 줄것이다.
먼저 깃허브 레퍼지토리를 들어간다.

레퍼지토리에 들어가면 settings로 들어가준다.
왼쪽 메뉴에 보면 Webhooks가 있는데 들어가준다.
우측 상단에 add webhooks를 누르면 아래와 같은 페이지가 나온다.

페이로드 주소에 젠킨스가 돌아가고 있는 ip 주소를 넣어주고 콘텐츠 타입을 application/json으로 변경해주고 저장한다.

다시 젠킨스로 들어와 프로젝트로 들어가준다.

왼쪽 상단에 Configure를 들어간다.

위와 같이 GITScm polling을 체크해주고 저장한다.

이제 로컬에서 소스코드를 master로 푸쉬하면 자동으로 빌드 푸시가 되고 서버에서 실행이 된다.

profile
풀스택 진행중...

0개의 댓글