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
Author And Source
이 문제에 관하여(Jenkins + Docker 로 자동배포하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyex/Jenkins-Docker-배포하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)