Streamlining DevOps: Setting Up CI/CD with Jenkins, GitLab, and Docker

상황

개발 환경인 윈도우 컴퓨터에서는 자바와 스프링 부트를 설치하고 애플리케이션을 개발하고 디버깅할 수 있습니다. 그리고 개발한 애플리케이션 코드를 버전 관리 시스템(Git 등)을 통해 깃랩에 푸시하면, 깃랩에서는 이 코드를 트리거로 CI/CD 파이프라인을 실행하여 미니 컴퓨터의 우분투에 있는 젠킨스에서 테스트, 빌드, 배포 등의 작업을 수행할 수 있습니다. 즉 개발 서버와 CI/CD의 서버를 분리해서 셋업했다는 뜻입니다. 여기서는 CI/CD 서버에서 작업한 내용만 소개하도록 하겠습니다.


작업할 내용

  1. 도커 컴포즈 설치

  2. nginx 설치

  3. 도커로 깃랩, 깃, 젠킨스 이미지 다운받기

  4. 깃랩과 젠킨스에 가서 설정


설치

  • 도커 컴포즈 설치

    • 도커 컴포즈는 여러 도커 컨테이너를 단일 애플리케이션으로 그룹화하고, 하나의 명령을 사용하여 이를 시작, 중지 또는 재구성하게 해준다
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로그 저장용
configGitLab 구성 파일 저장용
Local locationContainer locationUsage
$GITLAB_HOME/data/var/opt/gitlabFor storing application data.
$GITLAB_HOME/logs/var/log/gitlabFor storing logs.
$GITLAB_HOME/config/etc/gitlabFor 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

  • 초기 패스워드
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로 로그인해야됨

  • 참고: https://ojm1484.tistory.com/58


깃랩 웹훅

  • root로 로그인

  • 프로젝트 → Settings → Webhooks → Add new webhook

  • root로그인 되어있는 상태(좌측 하단 Admin Area가 보이는 상태)에서

  • Settings > Network > Outbound requests > Allow requests to the local network from webhooks and integrations 체크 > Save changes

Did you find this article valuable?

Support Fullstack Developer at Your Service by becoming a sponsor. Any amount is appreciated!