목차
1. Intro
2. AWS EC2 인스턴스 생성
3. AWS EC2에 설치 및 환경 설정
4. Jenkins 설정하기
5. Jenkins 빌드 시 다운되는 현상
6. 결과
Intro
어제까지 VirtualBox의 Linux 환경에서 Docker를 사용하여 Jenkins를 설치했다. 오늘은 AWS EC2에서 Docker를 사용하여 Jenkins를 설치해본 후, GitHub Webhook을 설정하여 이벤트가 발생하면 자동으로 빌드가 되게 했다.
AWS EC2 인스턴스 생성
AWS I AM 계정을 받은 후 EC2 서비스에서 키 페어를 생성해줬다.
서비스 > EC2 > 키 페어 생성에서 해준다.
키 페어는 탈취 당하면 안 되기 때문에 온라인 상에 올리지 않도록 주의한다.
이제 EC2 인스턴스를 시작해보자.
EC2 대시보드 > 인스턴스 시작 버튼을 클릭한다.
필요한 소프트웨어 구성은 Ubuntu로 해줬다.
추후 권한 설정 관련 편의를 위해 보안 그룹 생성 시 규칙을 모두 선택하고, 위치 무관한 곳에서도 접근 가능하도록 설정했다. 보안에 민감한 부분일 수 있으니 옵션을 사용자에 맞게 선택한다.
AWS EC2에 설치 및 환경 설정
인스턴스 시작을 한 후 AWS EC2 인스턴스를 MobaXterm에서 세션으로 연다.
Session settings > SSH
Basic SSH setting에서 Remote host에 인스턴스의 public ip를 입력한다.
인스턴스의 public ip는 AWS 대시보드에서
EC2 > 인스턴스 > [인스턴스 ID]
퍼블릭 IPv4 주소에서 확인할 수 있다.
Advanced SSH settings에서 Use private key 체크 박스를 선택하고 파란색 파일 아이콘을 눌러 아까 로컬에 다운로드 받았던 키 페어 파일을 선택한 후 OK 버튼을 누른다.
MobaXterm의 세션으로 연결한 화면이다.
login as : ubuntu
를 입력하면 된다.
cat /etc/os-release
sudo apt update
sudo apt install openjdk-17-jre-headless
sudo snap install docker
sudo docker run --name myjenkins --privileged -d -p 8080:8080 jenkins/jenkins:lts-jdk17
cat /etc/os-release
명령어로 현재 시스템의 운영 체제 정보를 확인해보았다.
sudo apt update
명령어로 시스템 패키지 목록을 최신으로 업데이트했다.
sudo apt install openjdk-17-jre-headless
명령어로 OpenJDK 17 버전의 JRE(Java Runtime Environment)를 설치했다.
Jenkins는 Java 기반 어플리케이션이므로 Java 실행 환경이 필요하다.
sudo snap install docker
명령어로 docker를 설치했다.
sudo docker run --name myjenkins --privileged -d -p 8080:8080 jenkins/jenkins:lts-jdk17
명령어로 docker를 사용하여 Jenkins 컨테이너를 실행했다.
컨테이너 이름은 myjenkins로 설정하고, 호스트의 8080 포트와 컨테이너의 8080 포트를 매핑해주었다.
이렇게 해서 Docker 컨테이너로 Jenkins를 실행하고, 웹 브라우저를 통해 http://{사용자의 AWS EC2 인스턴스 ip 주소}:8080으로 접속하여 Jenkins를 설정할 수 있다.
참고) 현재 실행 중인 컨테이너를 확인해보면 다음과 같이 나온다.
ubuntu@ip-172-31-34-137:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
------------ jenkins/jenkins:lts-jdk17 "/usr/bin/tini -- /u…" 20 seconds ago Up 15 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp myjenkins
Jenkins 설정하기
Jenkins를 웹 브라우저에서 열기 위해서는 AWS EC2에서 인바운드 규칙 편집을 해줘야 한다.
EC2 > 보안 그룹 > {AWS EC2 인스턴스 ID} > 인바운드 규칙 편집
에서 규칙 추가 버튼을 누른다.
유형 : 사용자 지정 TCP
포트 범위 : 8080
소스 : 0.0.0.0/0
입력 후 규칙 저장 버튼을 누른다.
{AWS EC2 instance public ip}:8080
으로 접속해보면 웹 브라우저가 열린다.
만일 Jenkins의 Administrator password를 확인하고 싶다면
sudo docker exec myjenkins sh -c 'cat /var/jenkins_home/secrets/initialAdminPassword'
이 명령어로 찾을 수 있다.
Instance Configuration의 Jenkins URL을
{AWS EC2 인스턴스의 public ip 주소}:8080/
라고 입력한다. 포트는 sudo docker run --name myjenkins --privileged -d -p 8080:8080 jenkins/jenkins:lts-jdk17
여기서 매핑한 포트이다.
GitHub에서 Webhook을 설정해서 push할 때마다 Jenkins에서 자동으로 빌드되도록 해보자.
여기서 Webhook이란 이벤트 기반으로 작동하는 HTTP 콜백이다. 여러 서비스 간에 실시간으로 데이터를 전달하거나 특정 이벤트가 발생할 때 자동으로 작업을 수행하기 위해 사용된다.
Jenkins에서 GitHub과의 Webhook을 설정하면 GitHub 저장소에 변경 사항이 발생할 때마다 Jenkins는 Webhook을 통해 해당 이벤트를 감지하고 자동으로 빌드 및 배포 작업을 수행할 수 있다. Webhook을 설정하면 소스 코드 변경 및 이벤트에 빠르게 대응할 수 있으며, 개발 워크플로우를 자동화하여 개발 및 배포 프로세스를 효율적으로 관리할 수 있다.
GitHub의 Repository > Settings > Webhooks > Payload URL에
{AWS EC2 인스턴스의 public ip}:{포트}/github-webhook/
라고 입력해준다. (*webhook 뒤에 꼭 슬래시를 써줘야 한다.)
다시 Jenkins로 돌아와서
Dashboard > Jenkins 관리 > Credentials > System > Global credentails
Kind : Username with password 선택
Username : GitHub id
password : GitHub password
Dashboard > Jenkins 관리 > Tools
Gradle을 다음과 같이 설정해준다.
Dashboard > {jenkins item id} > Pipleline Syntax에서
Sample Step : git: Git 선택
Repository URL : 나의 GitHub Repository url
Branch : main
Credentials : 위에서 설정해준 Credentials 선택
체크 박스 둘 다 선택 후 Generate Pipeline Script 클릭
으로 설정해준다. GitHub의 브랜치는 사용자에 맞게 쓰면 된다.
클릭해서 나온 밑의 결과를 복사해둔다.
Dashboard > {jenkins item id} > Configuration
Pipeline script를 다음과 같이 적어주었다.
pipeline {
agent any
stages {
stage('git clone') {
steps {
echo 'clone start'
git branch: 'main', credentialsId: '-------------', url: 'https://github.com/-----.git'
echo 'clone end'
}
}
stage('list view') {
steps {
echo '리스트 보기'
sh ''' ls '''
}
}
stage('Build') {
steps {
echo 'Building Gradle project'
sh ''' ./gradlew build '''
}
}
}
}
여기서, Jenkins 빌드 시 다운되는 현상이 발생할 수 있다.
Jenkins 빌드 시 다운되는 현상
AWS EC2는 보통 프리티어 사용 가능한 micro.t2를 많이 사용한다. 1GB RAM이므로 다운되는 현상을 겪을 수 있다.
이런 경우에는 Ubuntu 서버에서 Swap 파일을 통해 해결할 수 있다. Swap은 시스템이 메모리 부족 상태에서 추가 메모리를 제공하며, 서버의 안정성과 성능을 향상시킬 수 있다.
free -h
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
sudo vi /etc/fstab
/* vi 편집기로 열어서 밑의 내용을 맨 밑에 추가한다. */
/swapfile swap swap defaults 0 0
free -h 명령어
- free -h
- 현재 메모리 및 스왑 상태를 표시한다. 여기서 **Mem**은 물리적인 메모리(RAM)를 나타내며, **Swap**은 스왑 파일 또는 스왑 파티션의 크기를 나타낸다.
- sudo dd if=/dev/zero of=/swapfile bs=128M count=16
- 2GB 크기의 스왑 파일을 생성한다. **/swapfile**은 스왑 파일의 경로이며, **bs=128M**은 블록 크기를 나타냅니다.
- sudo chmod 600 /swapfile
- 스왑 파일에 대한 보안을 강화하기 위해 파일의 권한을 변경한다. 이 명령어는 오너에게 읽기와 쓰기 권한만 부여한다.
- sudo mkswap /swapfile
- 스왑 파일을 초기화하고 스왑 시스템을 설정한다.
- sudo swapon /swapfile
- 스왑 파일을 활성화한다.
- sudo swapon -s
- 현재 활성화된 스왑의 상태를 표시한다. 여기서는 **/swapfile**이라는 스왑 파일이 활성화되어 있음을 보여준다.
- sudo vi /etc/fstab
- vi 편집기를 사용하여 /etc/fstab 파일을 열어 스왑 파일이 부팅 시 자동으로 활성화되도록 설정한다. 파일의 맨 아래에
- /swapfile swap swap defaults 0 0
- 라는 내용을 추가한다.
- free -h
- 최종적으로 스왑이 제대로 설정되었는지 확인한다. **Swap**의 값이 변경되어 있어야 한다.
전체 코드는 다음과 같다.
login as: ubuntu
Authenticating with public key "-----"
┌──────────────────────────────────────────────────────────────────────┐
│ • MobaXterm Personal Edition v23.4 • │
│ (SSH client, X server and network tools) │
│ │
│ ⮞ SSH session to ubuntu@----------- │
│ • Direct SSH : ✓ │
│ • SSH compression : ✓ │
│ • SSH-browser : ✓ │
│ • X11-forwarding : ✓ (remote display is forwarded through SSH) │
│ │
│ ⮞ For more info, ctrl+click on help or visit our website. │
└──────────────────────────────────────────────────────────────────────┘
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 6.2.0-1017-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Feb 21 00:55:14 UTC 2024
System load: 0.0 Processes: 100
Usage of /: 20.6% of 7.57GB Users logged in: 0
Memory usage: 23% IPv4 address for eth0: --------------
Swap usage: 0%
Expanded Security Maintenance for Applications is not enabled.
78 updates can be applied immediately.
43 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
Last login: Wed Feb 21 03:13:42 2024 from -----------
ubuntu@ip-------:~$ free -h
total used free shared buff/cache available
Mem: 949Mi 216Mi 121Mi 0.0Ki 611Mi 575Mi
Swap: 0B 0B 0B
ubuntu@ip------:~$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
16+0 records in
16+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 31.2297 s, 68.8 MB/s
ubuntu@ip- -------------------:~$ sudo chmod 600 /swapfile
ubuntu@ip- -------------------:~$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=-----------------
ubuntu@ip- -------------------:~$ sudo swapon /swapfile
ubuntu@ip- -------------------:~$ sudo swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
ubuntu@ip- -------------------:~$ sudo vi /etc/fstab
/* vi 편집기에서 맨 밑 줄에 다음 내용을 추가한다. */
/swapfile swap swap defaults 0 0
ubuntu@ip- -------------------:~$ sudo vi /etc/fstab
ubuntu@ip- -------------------:~$ free -h
total used free shared buff/cache available
Mem: 949Mi 213Mi 144Mi 0.0Ki 591Mi 573Mi
Swap: 2.0Gi 0B 2.0Gi
ubuntu@ip- -------------------:~$
이렇게 swap을 추가한 후 AWS EC2 인스턴스 중지 후 다시 시작해주면 된다.
다시 시작한 인스턴스의 public ip는 변경되어 있으니 유념하자.
ubuntu@ip- -------------------:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e24e45937993 jenkins/jenkins:lts-jdk17 "/usr/bin/tini -- /u…" 2 hours ago Exited (255) 5 minutes ago 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp myjenkins
ubuntu@ip- -------------------:~$ sudo docker start myjenkins
myjenkins
ubuntu@ip- -------------------:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e24e45937993 jenkins/jenkins:lts-jdk17 "/usr/bin/tini -- /u…" 2 hours ago Up 5 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp myjenkins
ubuntu@ip- -------------------:~$
도커도 꺼져 있어서 docker start 명령어로 다시 켜줬다.
결과
#7이 swap 설정 전이고, #8이 swap 설정 후이다. 추가 메모리 설정 후에는 무한 로딩되지 않고 정상적으로 빌드된 것을 확인할 수 있다.
'Infra' 카테고리의 다른 글
[AWS] CloudWatch, S3를 활용한 실습 (0) | 2024.02.28 |
---|---|
[AWS] DynamoDB 테이블 생성 및 데이터 조회 (0) | 2024.02.26 |
[Trouble Shooting] Windows와 Linux의 파일 권한 차이 (0) | 2024.02.20 |
[Docker] 리눅스 환경에서 컨테이너 관리하고 실행하기 (1) | 2024.02.16 |
Ubuntu에 있는 MySQL을 로컬 Windows JDBC와 연결하기(Eclipse) (0) | 2023.12.12 |