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 인스턴스를 사용했습니다.
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
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 에서
를 설치합니다.
초기 실행에서 플러그인을 설치하는데 connection timed out 등의 오류가 지속적으로 발생하여 설치가 되지 않는다면 <ip>:8080/safeRestart
로 접근하여 재실행하는 것도 괜찮습니다. 저는 몇번의 재실행과 설치로 해결하였습니다.
먼저 레포지토리의 설정으로 이동해서 Webhook을 생성합니다.
http://<ip>:8080/github-webhook/
다음과 같이 설정하여 Webhook을 생성합니다
그리고 개발자 설정에서 repo
, admin:repo_hook
권한을 가진 git token을 생성합니다.
해당 토큰을 들고 Jenkins로 이동하여 Jenkins 관리 > System 의 GitHub Server를 생성합니다.
Test connection으로 동작 확인 후 저장합니다.
우선 AWS IAM에서 권한을 가진 사용자를 만들고 Access Key와 Secret Access Key를 저장합니다. 저는 테스트 진행의 원활함을 위해 Administor 권한을 가진 사용자를 등록했고 추후에 최소 권한을 테스트할 예정입니다.
Jenkins 관리 > Credential > System > Global credentials (unrestricted)에서 ADD를 통해 식별자 역할을 할 ID와 키값을 작성하고 생성합니다. 저는 ecr_credential
로 생성하였습니다.
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 이미지를 활용하면 배포까지 확인할 수 있습니다.