기존에 계획한 파이프라인
: 이 프로젝트의 구성은 개발용 PC와 깃허브, 서버용 PC로 이루어져있고 서버용 PC에 컨테이너를 통해 서비스를 제공하는 방식이었다. 일단 CI/CD 파이프라인을 설계하기 위해서 다른 사람들의 파이프라인을 참조 했었는데 젠킨스를 어떤 PC에 설치를 해야하는지 도무지 감이 잡히지 않았었다. 위에 내가 작성한 파이프라인 초안처럼 젠킨스가 중간에 있고 배포 서버에 빌드 결과물을 전송하는 그림이여서 깃허브 처럼 젠킨스가 따로 클라우드 형식으로 제공되는 서비스인줄 알았다. 그래서 일단 대략적으로 파이프라인을 그려보고 flow를 짠 다음 구글링을 통해 젠킨스 환경을 빌드하는 것과 젠킨스의 기능에 대한 내용 등등을 공부해보았다.
CI/CD 환경 조성 이후 완성한 파이프라인
: 기존에 설계했던 파이프라인과 비슷하지만 명확하게 어떤 환경에 젠킨스가 설치되는지 표현했다. 초반에는 젠킨스 컨테이너를 따로 만들어서 Publish over SSH를 통해 띄워져 있던 컨테이너에 SSH로 빌드 결과물을 전송하고 컨테이너에서 실행중인 서버를 종료하고 다시 실행시키는 방법을 시도해보았으나, 이는 도커의 특징을 완전히 무시한 방법이었다. 컨테이너가 단순히 가상환경이 아닌 명령을 실행하는 환경이라는 것을 깨닫고 여기저기 물어보면서 도움을 구한 결과 젠킨스를 통해 컨테이너를 새로 만들어야 한다는 것이었다. 사실 파이프라인 초안에도 컨테이너를 종료하고 새로 실행시키는 flow가 적혀있었으나 젠킨스에 또 다른 플러그인을 설치해야되고 복잡해질 것 같아서 SSH로 전송하는 방법을 시도해 봤다.
: 하지만 여러 글을 찾아보니 많은 사람들이 shell 파일을 따로 만들어서 컨테이너를 종료시키고 실행시킨다는 것을 알게 되었고 쉘 파일을 이용하면 기존에 사용하던 docker swarm 까지 쉽게 가능하기 때문에 생각보다 수월하게 CI/CD 환경을 구축할 수 있었다
ㆍ과한 빌드 시간
: 처음으로 젠킨스를 통해 CI/CD를 구축했을 때 빌드시간이 무려 6분 40초였다... 원인을 분석해보니 도커 이미지 빌드와 도커허브로의 push를 빌드 할때마다 수행하니 느릴수 밖에 없었다... 그래서 도커 책을 통해 컨테이너에 대해서 더 공부하여 총 빌드 시간 46초 라는 경이로운 기록을 만들어냈다..
도커파일
: 기존에 빌드하고 도커 허브에 올린 이미지들을 기반으로 단순히 빌드 결과물만 추가하고 필요 라이브러리 업데이트만 수행하도록 간단하게 작성하였다.
메인 서버의 도커 파일
# Main Container
FROM 2mukee/mh_main_image:latest AS mh-main-server
COPY . /usr/local/mohaemookji
WORKDIR /usr/local/mohaemookji
RUN npm install -g npm && npm -y install && ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
EXPOSE 17260
ENTRYPOINT ["node", "/usr/local/mohaemookji/main_server.js"]
API 서버의 도커 파일
# API Container
FROM 2mukee/mh_api_image:latest AS mh-api-image
COPY . /usr/local/mohaemookji
WORKDIR /usr/local/mohaemookji
RUN npm install -g npm && npm -y install && ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
ENTRYPOINT ["node", "/usr/local/mohaemookji/youtube/index.js"]
데이터베이스 서버의 도커 파일
# Database Container
FROM 2mukee/mh_db_image:latest AS mh-db-server
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
VOLUME /home/mh-dev/data:/data/db
도커 컴포즈 파일
version: '3.8'
services:
main:
image: 2mukee/mh_main_deploy
ports:
- 443:17260
depends_on:
- db
environment:
- TZ=Asia/Seoul
db:
image: 2mukee/mh_db_deploy
volumes:
- /home/mh-dev/data:/data/db
environment:
- TZ=Asia/Seoul
api:
image: 2mukee/mh_api_deploy
depends_on:
- main
environment:
- TZ=Asia/Seoul
env_file:
- ./api/mh.env
쉘 파일
#!/bin/bash
sudo cp -r /var/lib/jenkins/workspace/mh-ssl /var/lib/jenkins/workspace/mohaemookji/main
docker build --tag 2mukee/mh_main_deploy /var/lib/jenkins/workspace/mohaemookji/main
docker build --tag 2mukee/mh_api_deploy /var/lib/jenkins/workspace/mohaemookji/api
docker build --tag 2mukee/mh_db_deploy /var/lib/jenkins/workspace/mohaemookji
docker stack rm mh-stack
sleep 15s
docker stack deploy -c /var/lib/jenkins/workspace/mohaemookji/mh-compose.yml mh-stack
: 도커 스웜을 이용하기 위해 도커 스택을 생성할 경우 default라는 네트워크가 생성되는데 이게 삭제되는데 시간이 좀 걸린다... 그래서 자꾸 default의 중복으로 인해 스택이 생성되지 않아 sleep으로 잠깐 텀을 주었다..
환경 세팅
ㆍsudo 없이 Jenkins 실행
: sudo usermod -aG jenkins $USER
ㆍExecute Shell
: git update-index --chmod=+x setup.sh
: 깃허브에 올라가는 쉘 파일에 대해서 권한을 이렇게 추가해주어야함 (개발PC에서 수행)
ㆍ재부팅 이후 docker sock permission denied 문제 해결
: vi /etc/rc.d/rc.local
: chmod 666 /var/run/docker.sock
오류 해결
※ dial unix /var/run/docker.sock: connect: permission denied
: sudo chmod 666 /var/run/docker.sock
※ SSH 관련 참조
: https://mingzz1.github.io/development/basic/2021/04/19/jenkins_with_private_repo.html/
※ We trust you have received the usual lecture from the local System
: vi /etc/sudoers
jenkins ALL=(ALL) NOPASSWD:ALL
※ denied: requested access to the resource is denied
: export docker_id / pw = ~~~
※ Cannot perform an interactive login from a non TTY device
: winpty docker login -u $docker_id -p $docker_pw
: cat ~/my_password.txt | docker login --username 젠킨스아이디 --password-stdin
=> 모두 실패
=> 해결방법
: 도커허브에서 토큰 생성 > 쉘 파일에 다음 명령어 추가
docker login -u 젠킨스아이디 -p 토큰번호
'CICD > Jenkins' 카테고리의 다른 글
Jenkins에 pull request 이벤트 트리거 설정 (0) | 2021.11.17 |
---|---|
Docker와 Jenkins를 이용한 nodejs 서버 CI/CD 구축 (0) | 2021.10.21 |
젠킨스 Work Space 설정 (0) | 2021.10.03 |
젠킨스 서버 시간대 변경하기 (0) | 2021.10.03 |
Jenkins 컨테이너에서 다른 컨테이너로 SSH를 통해 배포하기 [publish over SSH] (0) | 2021.10.02 |