(1) 편 - https://whiporithm.tistory.com/103
(2) 편 - https://whiporithm.tistory.com/104
젠킨스 스크립트 작성 및 배포 프로젝트 생성
현재 push 이벤트에 ci를 수행하는 젠킨스 프로젝트를 만들었는데, cd (배포) 프로젝트도 만들어서 ci가 이루어진 후에 cd 가 이루어지도록 설정하려고 한다.
ci project -> 테스트, 도커 빌드, 도커헙에 push
cd project -> 도커헙에서 pull, 도커 이미지 컨테이너화
(도커헙에 올리기 위해서 계정이 필요하니 없으면 만들자.)
https://www.docker.com/products/docker-hub/
The World’s Largest Container Registry | Docker
Docker Hub is a container registry built for developers and open source contributors to find, use, and share their container images and access verified content.
www.docker.com
CI 프로젝트 스크립트 작성
우선 기존에 만들어둔 ci 프로젝트에 스크립트를 작성해보자.
PROJECT_VERSION="원하는 태그값"
DOCKER_IMAGE_NAME="사용자명/이미지명"
DOCKER_IMAGE_TAG="${DOCKER_IMAGE_NAME}:${PROJECT_VERSION}"
# Docker Hub 사용자명과 비밀번호 설정
DOCKER_USERNAME="사용자명"
DOCKER_PASSWORD="비밀번호"
# 도커 이미지 있으면 삭제
docker image rm -f "${DOCKER_IMAGE_TAG}"
# 도커 이미지 빌드
docker build -t "${DOCKER_IMAGE_TAG}" .
if [ $? -eq 0 ]; then
echo "docker build 성공"
# Docker 로그인 실행
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
# 로그인 결과 확인
if [ $? -eq 0 ]; then
echo "Docker Hub에 성공적으로 로그인했습니다."
# 도커 이미지 push
docker push "${DOCKER_IMAGE_TAG}"
else
echo "Docker Hub 로그인에 실패했습니다."
fi
else
echo "docker build 실패"
fi
나는 위와같이 작성했다. (스크립트 부분은 아직 어려워서 chat gpt를 활용했으며, 많이 부실할 수 있다. 또한 테스트 부분은 우선 패스하고 작성했다.)
특별한 부분은 docker 이미지에 사용자명을 앞에 붙여준것인데, 이렇게 올리지 않으면 docker hub에서 사용자명이 일치하지 않다고 하는 오류가 발생해서 위와같이 설정해주었다.
그리고 중요한 점은, 위의 스크립트는 ec2 내부의 jenkins 계정에서 이루어진다. 그런데 docker는 기본적으로 root 권한이 필요하기에 sudo를 항상 사용한다. 따라서 jenkins 계정에 sudo 권한을 줄 필요가 있다.
# 권한 주기
sudo usermod -aG docker jenkins
# 젠킨스 도커 재시작
sudo service jenkins restart
sudo service docker restart
권한을 주고 젠킨스와 도커를 재시작하여 적용시켜주면 스크립트가 정상 작동된다.
CD 프로젝트 생성 및 스크립트 작성
젠킨스에서 프로젝트를 하나 더 생성시켜주자. 따로 설정할 건 없고 스크립트만 작성해주면 된다.
cd에서는 배포서버로 ssh로 접속한다음 docker hub에 올려놓은 이미지를 땡겨와서 실행만 해주면 된다.
PROJECT_VERSION="원하는 태그값"
DOCKER_IMAGE_NAME="사용자명/이미지명"
DOCKER_IMAGE_TAG="${DOCKER_IMAGE_NAME}:${PROJECT_VERSION}"
CONTAINER_NAME="원하는 컨테이너 네임"
ssh -tt 배포서버계정@배포서버ip << EOF
if docker image inspect "$DOCKER_IMAGE_TAG" &>/dev/null; then
echo "이미지 '$DOCKER_IMAGE_TAG'를 찾았습니다. 삭제 중..."
docker rmi -f "$DOCKER_IMAGE_TAG"
fi
ehco "이미지 '$DOCKER_IMAGE_TAG'를 pull 중..."
docker pull "$DOCKER_IMAGE_TAG"
# 컨테이너가 이미 실행 중인지 확인
if [ "$(docker ps -q -f name="$CONTAINER_NAME")" ]; then
echo "컨테이너 '$CONTAINER_NAME'를 종료 중..."
docker stop "$CONTAINER_NAME"
docker rm "$CONTAINER_NAME"
echo "컨테이너 '$CONTAINER_NAME'를 종료하고 삭제했습니다."
fi
# 새로운 컨테이너를 실행
docker run -d -p 3000:3000 --name "$CONTAINER_NAME" "$DOCKER_IMAGE_TAG"
echo "컨테이너 '$CONTAINER_NAME'를 시작했습니다."
exit
EOF
여기서 중요한건 jenkins 계정으로 배포서버로 접속하는것인데, 기본적으로는 액세스가 거부되어있다. 따라서 이를 허용하도록 설정이 필요하다.
젠킨스에서 SSH 접속
젠킨스가 실행되고 있는 서버에서 아래 명령어들을 수행하자.
sudo su jenkins # jenkins 계정으로 전환
ssh-keygen -t rsa # 키 생성
젠킨스 계정으로 변경한 다음, 키를 생성해주면 된다.
키를 생성하면 입력하라는 창이 나오는데, 모두 그냥 엔터를 쳐서 넘겨주면 된다.
cd ~/.ssh # 키가 생성된 디렉토리 이동
cat id_rsa.pub # 생성된 키 값 확인
키를 생성한 후에 cat 명령어로 키 값을 확인하고, 복사해두자.
그리고 다시 배포 서버로 돌아가자.
여기서 방금 jenkins 계정에서 발급한 ssh를 등록해주면 되는 것이다.
cd ~/.ssh
vim authorized_keys
ssh 디렉토리로 이동하고, authorized_keys 파일을 vim 으로 열어준다. 그리고 위에서 복사해둔 값을 붙여넣어 주면 된다. (기존 값이 아마 있을텐데 대체하는게 아니라, 추가로 작성해주면 된다.)
* 원하는 위치로 커서를 이동한 다음 i나 a로 편집모드에 들어가서 붙여넣어주자. 그리고 esc를 누르고 :wq 를 입력하면 저장 및 나가기가 완료된다. (잘 모르겠으면 vim 단축키를 찾아보자.)
이렇게 하면 jenkins 계정에서 ssh로 특정 계정으로의 접속이 가능하다.
CI -> CD 플로우 설정
젠킨스의 ci 프로젝트에 들어가서 정상적으로 빌드가 수행되면 cd 프로젝트를 수행하도록 설정해주어야 한다. 이는 ci 프로젝트의 '빌드 후 조치' 에서 설정할 수 있다.
빌드가 정상적으로 완료되면 cd project를 수행하도록 설정해주면 완료이다.
이 모든게 끝이 났다면 push 이벤트가 수행될 경우, ci 프로젝트에서 빌드와 push가 일어나고 , cd 프로젝트에서 배포가 이루어지는 자동화 과정이 끝이난다.
참고 자료
도커 일반사용자에게 권한 부여하기
도커는 항상 Root로 실행되기 때문에 sudo를 사용하여 명령어를 입력해야 합니다. sudo usermod -aG docker [username] 해당 사용자를 docker 그룹에 추가함으로써 sudo 명령어를 사용하지 않고 도커 명령어를
cokes.tistory.com
'개발' 카테고리의 다른 글
[Oracle / Tibero ] Synonym 이슈 / Synonym이란? (0) | 2024.09.21 |
---|---|
OAuth 회원가입, 로그인 유지를 어떻게 해야할까? (0) | 2023.11.06 |
Termius 로 ec2 ssh 접속하기 (0) | 2023.11.02 |
Nest JS 프로젝트 배포 자동화 하기 (2) - docker 설치 (0) | 2023.10.30 |
Nest JS 프로젝트 배포 자동화 하기 (1) - jenkins, webhook (0) | 2023.10.29 |