먼저 배포 서버를 생성해야 한다. Ncloud의 크레딧이 아직 많이 남아서 월 9만원 살짝 넘는 걸로 생성했다. 서버 생성 시에 ACG는 아래와 같이 설정한다.
서버 생성이 완료되면 공인 IP를 발급받자. (사이드 바의 Public IP 탭)
# Root로 접속
# 비밀번호는 서버 관리 및 설정 변경 > 관리자 비밀번호 확인
ssh root@<Public_IP>
# 사용자 생성
# hyex로 생성함
adduser <username>
# 생성한 사용자 권한 부여 (아래 사진 참고)
sudo vi /etc/sudoers
먼저 서버에서 빠져나와 로컬로 돌아와야 한다. 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>
위 과정 속에서 다음과 같은 경고가 떴을 수 있다.
사용자 생성밖에 안했는데 왜 경고가 발생했을까? 정확하게 알지는 못하지만, 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"
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
실행할 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 이미지를 생성하고 푸시, 실행시키는 것은 젠킨스에서 해줄 것이다.
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
으로 접속이 안된다먼저 자동 배포를 하고자 하는 Github Repository > Settings > Webhooks 으로 들어가서 Add Webhook 버튼을 클릭하고 다음 사진과 동일하게 입력해준다.
다시 젠킨스 페이지 (<Public_IP>:8080
)로 돌아와서 새로운 Item 을 생성해준다. item name은 자유롭게 정하되, Freestyle project를 선택하고 OK 버튼을 누르면 아이템이 생성된다. 이제 이 아이템에 각종 구성을 설정해준다.
소스 코드 관리
Git을 체크하면 다음과 같은 화면이 뜬다. 위와 동일하게 Github Repository URL을 입력해주고 Credentials이 없을 것이니 Add 버튼을 클릭하여 추가한다.
Branches to build 섹션에는 변경을 감지하고 싶은 브랜치 이름을 적어준다.
빌드 유발
저장버튼을 누르고, 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
sudo -i
sudo chmod 666 /var/run/docker.sock
사이드 바의 Build Now 버튼을 클릭해서 빌드를 해보자. 빌드 히스토리에서 보고싶은 빌드의 시간을 누르면 사이드바에 Console Output이 보일 것이다. 빌드 실패 시 이 곳에서 실패의 원인을 찾으면 된다. 빌드 성공은 콘솔에서 Finished가 UNSTABLE 또는 SUCCESS 일 때이다. 코드가 제대로 작동하는 지는 <Public_IP>:<설정한 port>
경로를 확인하면 된다.
.env
파일 생성이 필요한 경우 # .env 파일을 생성해야 하는 경로까지 이동
cd /var/lib/jenkins/workspace
# 생성
sudo vi .env