용로그
article thumbnail

준비물 : ec2(ubuntu), jdk 11, docker, jenkins, github

들어만 보고 실제로 사용은 못해본 녀석들.. 오늘은 진짜 해봅시다!!

작고 소중한 EC2 프리티어


프리티어 인스턴스의 메모리는 너무나 작고 소중합니다. 따라서 스왑메모리를 적용해서 조금이나마 숨통을 트이게 해줄텐데요.

만약 본인이 프리티어를 사용하는데 스왑 메모리를 사용하지 않는다면, 젠킨스 빌드할 때 서버가 죽습니다.

 

$ 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

 

맨 끝에 추가해줍니다.

 

/swapfile swap swap defaults 0 0

Install JDK 11


jdk를 다운받기 위해서 우선 apt를 업데이트 해줍니다.

패키지 정보 업데이트

$ sudo apt-get update && sudo apt-get upgrade

Install Open JDK 11

java 11 설치

$ sudo apt-get install openjdk-11-jdk

자바 설치 확인

자바가 제대로 설치 되었는지 확인

$ java -version
$ javac -version

환경변수 설정

 

들어가서

 

$ vim ~/.bashrc

 

맨 아래 추가 후 :wq

 

# ~/.bashrc
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME/bin

 

변경사항 저장

 

$ source ~/.bashrc

 

잘 설정 되었는지 확인

 

$ echo $JAVA_HOME

 

🐳 Docker 설치하기


패키지 정보 업데이트

$ sudo apt-get update

Repository 설정

HTTPS를 통해 리포지토리를 사용할 수 있도록 패키지 인덱스를 업데이트하고 apt패키지를 설치합니다.

 

$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 

Docker Official GPG Key 등록

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

Stable Repository 등록

$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

🐳  Install Docker Engine

 

최신버전으로 설치가 됩니다.

 

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

사용자 도커 그룹에 추가하기

$ sudo usermod -aG docker $USER

Docker Version 확인

$ docker --version

 

 

네 이렇게 뜨면 성공입니다 글 쓰는 시점 최신 버전은 20.10.18 버전이네용

Docker에 Jenkins 설치하기


자 우분투에 도커를 설치하는 것 까지 끝냈습니다. 이젠 젠킨스를 사용해볼까요?

Jenkins Image 가져오기


원래는 sudo를 안붙여도 되는데.. 어쩐 일인지 권한이 없어서 안되더라구요 일단 sudo를 붙여서 해볼게요. + (터미널을 종료한 후 재시작하니 권한이 정상적으로 부여되었습니다.)

 

$ sudo docker pull jenkins/jenkins:lts

 

잘 가져와졌는지 확인하기

 

ubuntu@ip-172-31-43-38:~$ sudo docker images
REPOSITORY        TAG       IMAGE ID       CREATED        SIZE
jenkins/jenkins   lts       3728f8fc7302   44 hours ago   463MB

Jenkins 컨테이너 실행

 

포트는 9090으로 묶어줄게요.

 

$ sudo docker run -d -p 9090:8080 --name jenkins -u root jenkins/jenkins:lts-jdk11

 

-d 명령어는 백그라운드 실행, -p 명령어는 컨테이너와 호스트 PC 간 연결을 위해 내부 포트와 외부 포트를 묶은 것 입니다.

 

위 명령어 수행 시 /home 디렉터리에 jenkins라는 폴더가 생긴 것을 확인할 수 있습니다.

 

 

이렇게요. 포트도 잘 열렸는지 확인해봅시다.

net-tools 설치


$ sudo apt-get install net-tools

포트 정보 확인

$ sudo netstat -antp

ubuntu@ip-172-31-43-38:/home$ sudo netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      391/systemd-resolve
tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      5295/docker-proxy
tcp        0      0 0.0.0.0:50000           0.0.0.0:*               LISTEN      5277/docker-proxy
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      836/sshd: /usr/sbin
tcp        0    304 172.31.43.38:22         39.123.225.233:50601    ESTABLISHED 1250/sshd: ubuntu [
tcp        0      0 172.31.43.38:39804      52.79.128.16:80         TIME_WAIT   -
tcp6       0      0 :::9090                 :::*                    LISTEN      5300/docker-proxy
tcp6       0      0 :::50000                :::*                    LISTEN      5282/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      836/sshd: /usr/sbin

docker-proxy에 9090 포트가 잘 열린걸 확인할 수 있습니다.

🔒 Jenkins 로그인

ec2에 연결한 Elastic IP(탄력적 IP)로 접근해보면(탄력적 IP:9090)

 

이렇게 젠킨스가 잘 뜨는 모습이죠. 근데 패스워드를 요구합니다? 분명 그런건 설정한 적이 없는 것 같은데 말이죠.

 

$ sudo docker logs (젠킨스 컨테이너 이름)

 

저같은 경우는 아래와 같이 명령어를 작성하면 패스워드를 볼 수 있습니다.

 

$ sudo docker logs jenkins

 

잘 실행된다면 코드들이 막 길게 나옵니다. 저희가 볼 건 패스워드 밖에 없으니 아래와 같은 화면까지 내립니다.

 

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

7260c28911c9475db6b1cd59a73bdef4 <- 이렇게 나오는게 Jenkins 패스워드임

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

저 패스워드를 복사한 후 위의 젠킨스 로그인 창에서 로그인하면 됩니다.

 

 

Install suggested plugins 눌러주면 됩니다. 눌러주면 뭐 이것저것 다운받게 되는데 완료되면 이렇게 관리자 계정을 생성하게 됩니다. 이렇게 정보 넣어주면 됩니다.

 

 

자신의 IP + 젠킨스 포트로 설정해주고 넘어갑니다.

자 그럼 저희가 고대했던 젠킨스 대시보드를 볼 수 있습니다.

Jenkins Pipeline 구축하기


CI 구축하기

대시보드의 Item 생성하기를 클릭 -> 파이프라인 클릭 -> 확인

우선 윗 부분은 무시하고 밑에 스크립트 쪽을 봅시다.

스크립트 작성하기

젠킨스의 파이프라인은 스크립트를 설정하는 2가지 방법을 제공하고 있습니다.

  • 젠킨스 웹 내에서 스크립트를 작성하여 관리 → Pipeline Script(default)
  • 프로젝트 내에서 Jenkinsfile에 스크립트를 작성하여 관리 → Pipeline Script from SCM

일단 첫번째 방법을 이용해서 구축해보도록 할게요.

스크립트 문법 종류

Pipeline Script는 2가지 타입으로 작성이 가능합니다. 두 방법 모두 Groovy문법 기반이며 둘의 차이는 아래와 같습니다.

  • Declarative Pipeline : 쉽게 작성이 가능하며 Groovy 문법 기반이지만 해당 문법을 몰라도 작성 가능하다고 합니다.
  • Scripted Pipeline : Groovy 문법 기반이며 Declarative 보다 효과적이고 많은 기능으로 포함해서 작성 가능한데 어렵습니다.

두 문법을 혼합해서 사용할 수는 없습니다.

스크립트 작성하기

 

여기 파이프라인에서 스크립트를 작성해주시면 됩니다.

 

파이프라인 스크립트

pipeline {
    agent any
    tools {
        gradle 'gradle'
    }
    stages {
        stage('Git Clone') {
            steps {
                git branch: 'master', url: 'https://github.com/wonyongChoi05/CI-CD.git'
            }
        }
        stage('BE-Build') {
            steps {
                sh "./gradlew clean build"
            }
        }
    }
}

 

위의 스크립트에서는 Git Clone 단계에서 Git에 올라가있는 프로젝트의 master 브랜치를 클론을 하도록 했습니다. 그 후 BE-Build 단계를 통해 클론한 프로젝트 빌드를 통한 CI 작업을 진행하도록 했습니다.

 

이와 같은 설정을 하면 CI 구축은 완료한 것인데요. 그럼 이때까지 설정한 파이프라인을 실행해보죠.

생성한 파이프라인으로 들어가 좌측에 있는 메뉴바에서 지금 빌드를 하게된다면 아래와 같이 Git Clone으로부터 Build까지 CI 과정이 정상적으로 동작하는 것을 확인할 수 있습니다.

아 그리고 깜빡한게 있습니다!

Jenkins에 Gradle 설치하기


저는 백엔드를 스프링 부트를 이용해서 만들었기 때문에 gradle이 필수적인데요. 따라서 jenkins에서도 gradle을 가지고 있어야합니다. (안그러면 에러남..)

📌 대시보드 -> Global Tools Configuration -> gradle에 add 해주기

빌드 해보기

사이드 바에 있는 지금 빌드 항목을 눌러서 여태까지 설정한 것들을 토대로 빌드를 해봅시다!!

 

 

네 이렇게까지 뜬다면 CI는 완료된 상태라고 볼 수 있습니다.

언제 작성할지는 모르겠지만 다음 Infrastructure 카테고리의 포스팅은 CD가 되겠네요! 긴 글 읽어주셔서 감사합니다.

profile

용로그

@용로그

벨덩보단 용덩 github.com/wonyongChoi05