Streamlining DevOps: Setting Up CI/CD with Jenkins, GitLab, and Docker
상황
개발 환경인 윈도우 컴퓨터에서는 자바와 스프링 부트를 설치하고 애플리케이션을 개발하고 디버깅할 수 있습니다. 그리고 개발한 애플리케이션 코드를 버전 관리 시스템(Git 등)을 통해 깃랩에 푸시하면, 깃랩에서는 이 코드를 트리거로 CI/CD 파이프라인을 실행하여 미니 컴퓨터의 우분투에 있는 젠킨스에서 테스트, 빌드, 배포 등의 작업을 수행할 수 있습니다. 즉 개발 서버와 CI/CD의 서버를 분리해서 셋업했다는 뜻입니다. 여기서는 CI/CD 서버에서 작업한 내용만 소개하도록 하겠습니다.
작업할 내용
도커 컴포즈 설치
nginx 설치
도커로 깃랩, 깃, 젠킨스 이미지 다운받기
깃랩과 젠킨스에 가서 설정
설치
도커 컴포즈 설치
- 도커 컴포즈는 여러 도커 컨테이너를 단일 애플리케이션으로 그룹화하고, 하나의 명령을 사용하여 이를 시작, 중지 또는 재구성하게 해준다
sudo apt install jq
apt install docker-compose
docker-compose --version
- 혹시 이런 화면이 나온다면, OK를 누르면 라이브러리 업데이트를 하고 도커 컴포즈를 설치해준다
공홈: https://docs.gitlab.com/ee/install/docker.html
블로그: https://www.lesstif.com/gitlab/install-gitlab-using-docker-100205406.html
nginx 설치
- https에 접근하려면 필요하다
sudo apt install nginx
sudo systemctl enable nginx
sudo systemctl restart nginx
docker volume 으로 사용할 폴더 경로를 정의
- docker volume: 도커 컨테이너에서 데이터를 보존하고 공유하기 위한 메커니즘
sudo mkdir -p /srv/gitlab/{data,logs,config}
data | 애플리케이션 데이터 저장용 |
logs | 로그 저장용 |
config | GitLab 구성 파일 저장용 |
Local location | Container location | Usage |
$GITLAB_HOME/data | /var/opt/gitlab | For storing application data. |
$GITLAB_HOME/logs | /var/log/gitlab | For storing logs. |
$GITLAB_HOME/config | /etc/gitlab | For storing the GitLab configuration files. |
- 디렉토리 설정
vi /root/.bash_profile
export GITLAB_HOME=/srv/gitlab
- 깃랩 도커 이미지 받기
docker search [찾고자 하는 이미지 이름]
docker pull gitlab/gitlab-ce:latest
도커런 - 이거 딱히 할 필요없고 그냥 도커 컴포즈 파일 수정해서 도커 컴포즈 업하면
~~sudo docker run --detach \\
--hostname 'wvalley' \\
--env GITLAB_OMNIBUS_CONFIG="external_url '<https://gitlab.com/wvalley/wvalley>'" \\
--publish 1980:80 --publish 1922:22 --publish 19443:443 \\
--name gitlab \\
--restart always \\
--volume $GITLAB_HOME/config:/etc/gitlab \\
--volume $GITLAB_HOME/logs:/var/log/gitlab \\
--volume $GITLAB_HOME/data:/var/opt/gitlab \\
--shm-size 256m \\
gitlab/gitlab-ce:latest~~
- 외부주소
깃랩 가입 후 레포 생성
<https://gitlab.com/사용자명/프로젝트명.git>
- 도커 컴포즈 파일 수정
vi docker-compose.yml
version: '3.9'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab
restart: always
hostname: 'project'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url '<http://10.10.10.10>'
gitlab_rails['gitlab_shell_ssh_port'] = 1122
# Add any other gitlab.rb configuration here, each on its own line
TZ: 'Asia/Seoul'
ports:
- "1180:80"
- "11443:443"
- "1122:22"
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
- 포트번호 마다 11 을 붙이는 이유는 젠킨스도 띄울 건데 충돌 안 나게 하려고. 아무거나 해도 상관은 없지만 충돌만은 피해주자. gitlab_rails['gitlab_shell_ssh_port'] 와 ssh 포트번호를 동일하게 설정해준다.
docker-compose up -d
docker ps
- 도커 접속
docker exec -it gitlab bash
- 깃 설치
sudo apt install git
https://junuuu.tistory.com/443
- http://10.10.10.10:1180/ 접속해본다
- 초기 패스워드
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
패스워드를 변경
- Edit profile > Password
토큰
- Add new token 클릭 후 모든 권한 주기
생성 후 토큰 값이 나올텐데 기록해두기
User Settings > SSH Keys
- 터미널에서 ssh key 생성
# 키 생성
ssh-keygen
# 키 확인
cat ~/.ssh/id_rsa.pub
- Create a project
- Create blank project
Pick a group or namespace: root
GitLab은 사내 서버에 repository를 생성해서 형상관리를 하므로 GitHub와 다르게 Private를 해도 무료이다.
Code → Clone with SSH
이 주소를 복사해서 젠킨스에 넣어주게 된다
멤버 생성
root의 역할은 보통 다른 계정 생성해주기
Jenkins 계정을 하나 만들어서 젠킨스에서 git 유저 정보를 가져갈 수 있게 하기
로그아웃 후 계정 생성
로그인 후 계정 확인 : Project > Manage > Members
도커에 젠킨스 설치
- 젠킨스 이미지 다운로드
# Java8 사용시:
docker pull jenkins/jenkins:lts
# Java11 사용시:
docker pull jenkins/jenkins:jdk11
# 이미지 확인
docker images
- 젠킨스 컨테이너 실행:
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins -u root jenkins/jenkins:jdk11
- 비밀번호 찾는 법
docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
Install suggested plugins 선택하면 아래처럼 설치가 된다
관리자 계정을 생성 계정명에는 로그인 시 사용하는 ID를 입력
root
- URL은 호스트 IP + 포트번호로 이미 적혀져있기 때문에 Save and Finish 버튼만 눌러준다
- 설치를 완료하면 대쉬보드가 보인다
Jenkins 관리 → Credentials → System → Global credentials (unrestricted)
kind : Username with password
Scope : Global (Jenkins, nodes, items, all child items, etc)
Username : GitLab 계정 아이디⭐️ (여기선 아까 만들어준 Jenkins)
Password : GitLab 계정 비밀번호 (여기선 아까 만들어준 Jenkins의 비밀번호)
ID : 아무거나 이름짓기 (안 적어도됨)
create 하면 credential 생성 완료
- Jenkins 관리 → Plugins
- 체크박스 선택 후 Install
- 메인으로 나가서 Create a job
- 생성할 프로젝트의 이름을 정하고, Freestyle project 를 선택
- 소스코드 관리에서 git을 선택
Repository URL - GitLab에서 Http 클론 주소에서 맨 마지막 .git 뺀 것
Credentials - 좀 전에 등록한 credential
Repository URL 부분에 빨간색 글씨가 나오지 않고
https://tytydev.tistory.com/48
- 로그아웃 하고 Jenkins 와 개인 계정을 생성한다
빌드 설정
깃 설정 후 조금 내리면 나오는 빌드 설정
고급 선택 후 secret token 옆의 Generate 버튼을 눌러 토큰 발급
GitLab webhooks에 등록하면 된다 - 깃랩은 root로 로그인해야됨
깃랩 웹훅
root로 로그인
프로젝트 → Settings → Webhooks → Add new webhook
웹훅 생성 후 Url is blocked: Requests to the local network are not allowed 라는 에러 발생
root로그인 되어있는 상태(좌측 하단 Admin Area가 보이는 상태)에서
Settings > Network > Outbound requests > Allow requests to the local network from webhooks and integrations 체크 > Save changes