[CI] Jenkins에서 AWS ECR 업로드하는 GitHub Webhook 세팅

우노·2024년 7월 29일
0

사전 준비사항

  • Dockerfile을 가진 GitHub 레포지토리
  • ECR 리포지토리

Minimum hardware requirements:

  • 256 MB of RAM
  • 1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a Docker container)

Recommended hardware configuration for a small team:

  • 4 GB+ of RAM
  • 50 GB+ of drive space

GitHub에서 호스팅 가상 머신을 제공하는 Github Actions와 달리 Jenkins는 빌드를 위한 자체 서버가 필요하기 때문에 공식 문서에서 요구하는 스펙을 가진 가상 머신이 필요합니다.
그래서 저는 ubuntu를 실행하는 t3.medium 인스턴스를 사용했습니다.

Jenkins 설치

Debian/Ubuntu Jenkins Installation를 따라서 Jenkins를 설치하셔도 되며 저는 아래 명령어를 활용하여 추가적으로 설치해주었습니다.
다음 명령어는 젠킨스 패키지를 가져와서 시스템에 추가하고 서비스로 등록과 설치를 마치는 과정입니다. ECR 업로드를 위해 docker 관련 추가 설치를 수행했습니다.

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins openjdk-11-jdk docker.io -y
sudo chown jenkins:jenkins /var/run/docker.sock

설치와 설정이 완료되었다면 jenkins 서비스를 실행하고 상태를 확인합니다.

sudo systemctl enable jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins

Unlock Jenkins

8080 인바운드 규칙이 허용되어있다는 가정 하에<ip>:8080으로 접근하여 Jenkins를 사용할 수 있습니다.

처음 실행한다면 Unlock Jenkins에서 안내하는대로 sudo cat /var/lib/jenkins/secrets/initialAdminPassword로 받은 초기 비밀번호를 입력하여 세팅할 수 있습니다.

이후에 플러그인 설치를 진행하는데 저는 Install suggested plugins로 설치했습니다.

이후에는 URL 설정을 제외하고 전부 skip 하여 Jenkins로 진입했습니다.
사용자 설정을 하지 않는다면 추후에 실행할 때는

admin / 전에 입력했던 초기 비밀번호

로 로그인 할 수 있습니다.

플러그인 설치

GitHub Webhook과의 연결, AWS 연결, ECR 업로드를 위해 다음 플러그인을 추가로 설치합니다.
Jenkins 관리 > Plugins > Available Plugins 에서

  • GitHub Integration
  • Docker Pipeline
  • Amazon ECR
  • AWS Credentials

를 설치합니다.

플러그인 설치 오류: Timed out

초기 실행에서 플러그인을 설치하는데 connection timed out 등의 오류가 지속적으로 발생하여 설치가 되지 않는다면 <ip>:8080/safeRestart로 접근하여 재실행하는 것도 괜찮습니다. 저는 몇번의 재실행과 설치로 해결하였습니다.

Github Webhook

먼저 레포지토리의 설정으로 이동해서 Webhook을 생성합니다.

  • Payload URL: http://<ip>:8080/github-webhook/
  • Content Type: application/json
  • Just push the event
  • Active - Checked

다음과 같이 설정하여 Webhook을 생성합니다

그리고 개발자 설정에서 repo, admin:repo_hook 권한을 가진 git token을 생성합니다.

해당 토큰을 들고 Jenkins로 이동하여 Jenkins 관리 > System 의 GitHub Server를 생성합니다.

  • Name: 레포지토리 이름
  • API URL: https://api.github.com
  • Credention 생성: Secret text
    • secret: 발급한은 key 값
    • ID: 식별자 (GitHub ID 활용)
  • Manage hooks - Checked

Test connection으로 동작 확인 후 저장합니다.

AWS Credential

우선 AWS IAM에서 권한을 가진 사용자를 만들고 Access Key와 Secret Access Key를 저장합니다. 저는 테스트 진행의 원활함을 위해 Administor 권한을 가진 사용자를 등록했고 추후에 최소 권한을 테스트할 예정입니다.
Jenkins 관리 > Credential > System > Global credentials (unrestricted)에서 ADD를 통해 식별자 역할을 할 ID와 키값을 작성하고 생성합니다. 저는 ecr_credential 로 생성하였습니다.

Jenkins Pipeline

New Item에서 pipeline을 생성합니다.
아래 스크립트는 github의 레포지토리를 빌드하고 ECR에 push하는 과정을 담았습니다.
GitHub 레포지토리에 변경사항이 생겼을 때 자동으로 빌드하고 싶다면 GitHub hook trigger for GITScm polling를 체크해야 합니다.

pipeline {
    agent any

    environment {
        REPO = '<레포지토리_사용자>/<레포지토리_이름>'
        ECR_REPO = '<ECR_리포지토리_URI>'
        ECR_CREDENTIALS_ID = 'ecr:ap-northeast-2:<AWS_Credential_이름>'
    }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: "https://github.com/${REPO}.git"
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    dockerImage = docker.build("${ECR_REPO}:latest")
                }
            }
        }

        stage('Push to ECR') {
            steps {
                script {
                    docker.withRegistry("https://${ECR_REPO}", "$ECR_CREDENTIALS_ID") {
                        dockerImage.push('latest')
                    }
                }
            }
        }
    }
}

확인

Jenkins에서 직접 빌드하여 ECR에 업로드 되는 것을 확인하거나 레포지토리에 변경사항을 만들어 재빌드를 확인할 수 있습니다.

이후에 Kubernetes Deployment에 해당 ECR의 latest 이미지를 활용하면 배포까지 확인할 수 있습니다.

profile
기록하는 감자

0개의 댓글