Jenkins + Docker 로 자동배포하기

Content

Server Setting

1. 서버 생성

먼저 배포 서버를 생성해야 한다. Ncloud의 크레딧이 아직 많이 남아서 월 9만원 살짝 넘는 걸로 생성했다. 서버 생성 시에 ACG는 아래와 같이 설정한다.

서버 생성이 완료되면 공인 IP를 발급받자. (사이드 바의 Public IP 탭)

2. 사용자 추가

# Root로 접속
# 비밀번호는 서버 관리 및 설정 변경 > 관리자 비밀번호 확인 
ssh root@<Public_IP>
# 사용자 생성
# hyex로 생성함
adduser <username>
# 생성한 사용자 권한 부여 (아래 사진 참고)
sudo vi /etc/sudoers

3. 사용자 접속 시에 비밀번호 제거하기 (optional)

먼저 서버에서 빠져나와 로컬로 돌아와야 한다. logout으로 빠져나올 수 있다.

# ssh key 생성
# 명령어 입력 시, ~/.ssh 폴더와 키(공개키, 비밀키) 생성
ssh-keygen
cd ~/.ssh
# 공개키 서버로 복사
scp id_rsa.pub <username>@<Public_IP>:/home/<username>
# 사용자로 서버 접속 (아직 비밀번호 사용해야 접속 가능)
# /home/<username> 경로에 id_rsa.pub 있어야 함
ssh <username>@<Public_IP>
# 키 옮겨주기
mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
# 다시 접속해보기
logout
ssh <username>@<Public_IP>
# 제대로 됐으면 루트 경로에 있는 키 삭제
rm -rf id_rsa.pub 
  • 유용한 명령어
# 사용자 제거
userdel <username>
# 사용자 비밀번호 변경
passwd <username>

4. Locale 설정

위 과정 속에서 다음과 같은 경고가 떴을 수 있다.

사용자 생성밖에 안했는데 왜 경고가 발생했을까? 정확하게 알지는 못하지만, Ncloud에서 서버를 생성할 때 ZONE=KR2로 생성했었다.Locale이 이에 맞게 설정이 되어야 해서 발생한 오류같다. 지금 고치지 않으면 앞으로 계속 문제가 될테니 설정하고 가도록 하자.

sudo -i
apt-get update
apt-get upgrade
apt-get install language-pack-ko
locale-gen ko_KR.UTF-8
# 아래 네 줄이 하나의 명령어, enter로 구분
cat << 'EOF' > /etc/default/locale
LANG="ko_KR.UTF-8"
LANGUAGE="ko_KR:ko:en_US:en"
EOF

그리고 재부팅 한다. 재부팅 후 locale 명령어를 쳤을 때 아래와 같은 화면이 뜬다면

다음 명령어를 추가적으로 입력한다.

export LC_ALL="ko_KR.UTF-8"

Docker Setting

1. Docker 설치

Ncloud 서버에 도커를 먼저 설치한다.

curl -fsSL https://get.docker.com/ | sudo sh
# docker 는 root 권한이 필요하기 때문에 docker 그룹에 현재 사용자를 추가해줘야 한다.
# 로그아웃하고 다시 로그인해야 권한 적용
sudo usermod -aG docker <username>
# 정상적으로 설치되었는지 확인
docker version
  • 유용한 명령어
    # 컨테이너 생성
    docker run <imagename>
    # 이미지 목록 확인
    docker images
    # 컨테이너 목록 확인
    docker ps
  • ⚠️ sudo: unable to resolve host ...
    아래 두 파일에 같은 이름이 있지 않아서 발생하는 경고이다. 동일하게 수정해준다.
    sudo vi /etc/hostname
    sudo vi /etc/hosts

2. Docker로 Node.js 프로젝트 배포

실행할 app.js 가 있는 디렉토리에 Dockerfile 생성

Dockerfile

FROM node:14

WORKDIR ./

COPY ./package*.json ./

RUN npm install --production ## dev-dependencies 제외하고 설치

COPY . . # Docker 이미지 안에 앱 소스코드를 넣는다

EXPOSE 3000 # 포트 바인딩

CMD ["npm", "start"] # 실행 명령

.dockerignore

node_modules
npm-debug.log

Docker 이미지를 생성하고 푸시, 실행시키는 것은 젠킨스에서 해줄 것이다.

Jenkins Setting

1. Jenkins 설치

sudo apt install openjdk-8-jre # java 설치
sudo wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add - # repository key 추가
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins # jenkins 설치
sudo vi /etc/default/jenkins
# HTTP_PORT = 8080

브라우저에서 <Public_IP>:8080으로 들어가보면 Jenkins 화면이 나타날 것이다.

sudo cat /var/lib/jenkins/secrets/initialAdminPassword 

위 명령어에서 반환해준 adminpassword를 입력하면 다음 페이지로 넘어간다.

Install Suggested Plugin을 선택한다. 플러그인이 모두 설치되면 Admin User 생성 페이지로 넘어가니 생성해주면 된다. 모두 완료되면 다음과 같은 화면이 나타난다.

  • ⚠️ 공개키 에러

    sudo -i 명령어로 root로 변경한 뒤, sudo wget ... 부터 다시 진행한다.
  • ⚠️ <Public_IP>:8080 으로 접속이 안된다
    Ncolud에서 ACG 파일에 8080을 열어줬는지 확인한다. (꼭 있어야 한다)

2. Jenkins, github webhook 연결

먼저 자동 배포를 하고자 하는 Github Repository > Settings > Webhooks 으로 들어가서 Add Webhook 버튼을 클릭하고 다음 사진과 동일하게 입력해준다.

다시 젠킨스 페이지 (<Public_IP>:8080)로 돌아와서 새로운 Item 을 생성해준다. item name은 자유롭게 정하되, Freestyle project를 선택하고 OK 버튼을 누르면 아이템이 생성된다. 이제 이 아이템에 각종 구성을 설정해준다.

  • Github project 를 체크
    해당 레포의 url을 입력한다. (git clone 시에 사용하는 url)

  • 소스 코드 관리
    Git을 체크하면 다음과 같은 화면이 뜬다. 위와 동일하게 Github Repository URL을 입력해주고 Credentials이 없을 것이니 Add 버튼을 클릭하여 추가한다.
    Branches to build 섹션에는 변경을 감지하고 싶은 브랜치 이름을 적어준다.

  • 빌드 유발

3. 빌드 설정 추가

저장버튼을 누르고, Publish Over SSH 플러그인을 설치하러 가보자.
시작 페이지 > Jenkins 관리 > 플러그인 관리 > 설치 가능 탭 클릭 > 서치바에 Publish Over SSH 검색 > 체크 후 재시작 없이 설치하기 버튼 클릭

설치가 완료되면 다시 시작 페이지에서 Jenkins 관리 > 시스템 설정 > 하단의 Publish over SSH > SSH Servers 를 다음과 같이 추가해준다.

추가 후, 아래 Test Configuration 버튼을 클릭하여 왼쪽에 "Success"가 떠야 성공이다.

다시 아이템 구성 화면으로 돌아오자. ( 시작 페이지 > <item_name> 클릭 > 사이드 바의 구성 클릭 ) 이어서 남은 구성을 완료한다.

  • 빌드 환경
    Send files or execute commands over SSH after the build runs 를 체크한 뒤에 방금 생성한 SSH server를 등록하고, 빌드 후 실행할 명령들을 입력한다. 실행 중이던 컨테이너를 제거하고 최신 도커 이미지를 가지고 와서 새로운 컨테이너를 작동시키는 명령이다.

  • Build
    빌드 시에 실행될 명령어를 입력한다.

    이 스크립트는 Ncloud 서버에서 Jenkins라는 유저가 실행하게 된다. 도커 허브에 이미지를 올리는 과정이 포함되어 있기 때문에 도커 로그인이 필요하다.

	sudo chmod 666 /var/run/docker.sock
	sudo -i
    su - jenkins
    # docker hub 의 username, password 입력
    docker login
  • ⚠️ Docker 접근 에러
    권한을 다 열어준다.
	sudo -i
    sudo chmod 666 /var/run/docker.sock

4. 빌드

사이드 바의 Build Now 버튼을 클릭해서 빌드를 해보자. 빌드 히스토리에서 보고싶은 빌드의 시간을 누르면 사이드바에 Console Output이 보일 것이다. 빌드 실패 시 이 곳에서 실패의 원인을 찾으면 된다. 빌드 성공은 콘솔에서 Finished가 UNSTABLE 또는 SUCCESS 일 때이다. 코드가 제대로 작동하는 지는 <Public_IP>:<설정한 port> 경로를 확인하면 된다.

  • ⚠️ .env 파일 생성이 필요한 경우
	# .env 파일을 생성해야 하는 경로까지 이동
    cd /var/lib/jenkins/workspace
    # 생성
    sudo vi .env

Reference

좋은 웹페이지 즐겨찾기