본문 바로가기

기타

GitLab Runner 를 사용하여 GitLab CI 구성하기

기본 환경

Host
  VMware® Workstation 14 Player 14.0.0 build-6661328
OS

  Ubuntu 16.04.6 LTS
Application 
  - Docker : 19.03.5, build 633a0ea838
  - docker-compose : 1.11.2, build dfed245
  - git : 2.7.4

GitLab Runner

GitLab Runner는 작업을 실행하고 결과를 다시 GitLab에 보내는 데 사용되는 오픈 소스 프로젝트입니다. 작업을 조정하는 GitLab에 포함된 오픈 소스 연속 통합 서비스 인 GitLab CI 와 함께 사용됩니다. GitLab Runner 버전은 GitLab 버전과 동기화되어 있어야합니다. 구형 러너는 최신 GitLab 버전에서 계속 작동 할 수 있지만 그 반대의 경우 버전 차이가있는 경우 기능을 사용할 수 없거나 제대로 작동하지 않을 수 있습니다. 이전 버전과의 비 호환성은 주요 버전 업데이트에만 허용됩니다.

설치하기(Docker)

설치하는 방법을 1) docker command 로 설치하는 방법 과 2) docker-compose 파일로 설치하는 방법이 있습니다.

1) docker command 설치

docker run --detach \
--name gitlab-runner \
--restart always \
--volume /srv/gitlab-runner/config:/etc/gitlab-runner: \
--volume /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latestdocker run --detach \
--name gitlab-runner \
--restart always \
--volume /srv/gitlab-runner/config:/etc/gitlab-runner: \
--volume /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

2) docker-compose 파일 작성

#docker-compose.gitlab 파일 작성
sudo vi /opt/gopath/src/gitlab/docker-compose.gitlab.runner.yml

 

gitlab-runner:
 container_name: gitlab-runner
 image: 'gitlab/gitlab-runner:latest'
 restart: always
 volumes:
  - '/srv/gitlab-runner/config:/etc/gitlab-runner'
  - '/var/run/docker.sock:/var/run/docker.sock'

 

#docker-compose로 컨테이너 실행
docker-compose -f /opt/gopath/src/gitlab/docker-compose.gitlab.runner.yml up -d

 

(gitlab-runner)01. 깃랩 러너 실행

프로젝트와 러너 연동

프로젝트 러너 토큰 복사

연동할 프로젝트 로 들어가서 좌측 Settings > CI/CD 클릭 합니다.

 

 

Runners 의 expand 클릭해줍니다.

 

 

Specific Runners 의 3번 항목이 Sample Project 의 token 을 복사 해줍니다. 이 토큰은 Gitlab runner 설치 및 설정시 사용됩니다.

 

러너에 프로젝트 등록하기(register)

다시 터미널로 들어와서 gitlab-runner 컨테이너 안으로 접근합니다.

docker container exec -it gitlab-runner bash

방법은 두가지입니다. 1)비대화식 모드(non-interactive mode) 로 등록하기 와 2)대화식 모드(interactive mode) 로 등록하기 입니다.

 

1) 비대화식 모드(non-interactive mode) 로 등록하기

gitlab-runner register -n \
--url http://<IP> \
--registration-token EBLy_mzmz98M9rfN9e1W \
--description gitlab-runner \
--executor docker \
--docker-image docker:latest \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock

 

옵션

설명

--url

GitLab 인스턴스 URL

--registration-token

Project 의 token

--description

설명

--executor

빌드를 실행하는 데 사용할 수 있는 여러 실행 프로그램

--docker-image

Docker를 실행 프로그램으로 선택한 경우 사용할 이미지

--docker-volumes

Docker를 실행 프로그램으로 선택한 경우 사용할 볼륨

(gitlab-runner)02. 깃랩 러너에 프로젝트 등록

 

2) 대화식 모드(interactive mode) 로 등록하기

gitlab-runner register

 

(gitlab-runner)02. 깃랩 러너에 터미널로 프로젝트 등록

 

(gitlab-runner)03. 깃랩 러너에 프로젝트 등록된 화면

약 20초 후에 gitlab 웹페이지를 새로고침을 하면 다음과 같이 초록색 불이 들어오게 됩니다. 들어오지 않으면 러너를 삭제하고 다시 등록해주세요.

(gitlab-runner)04. 깃랩 러너에 프로젝트 등록된 화면2

위와 같이 정상 등록 된것을 확인 할 수 있습니다.

프로젝트 내용 작성

sample 이라는 프로젝트는 nodejs로 간단한 서버를 구성한 프로젝트입니다.터미널로 다시 돌아가 다음 경로에 sample 이라는 폴더 생성합니다.

cd /opt/gopath/src/gitlab
mkdir sample

폴더 안에 Dockerfile, index.js, package.json 세 가지 파일을 만듭니다. 

 

Dockerfile

# This file is a template, and might need editing before it works on your project.
FROM node

WORKDIR /usr/src/app

ARG NODE_ENV
ENV NODE_ENV $NODE_ENV

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

# replace this with your application's default port
EXPOSE 8080
CMD [ "npm", "start" ]

 

index.js

const express = require('express')
const app = express()

app.get('/', function(req, res) {
    res.send('Hello Gitlab!!!!!!안녕하세요!!!!!!!')
})

app.listen(8900, function() {
    console.log('Example app listening on port 8900!')
})

 

package.json

{
  "name": "sample",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}

로컬 스트리지와 리모트 스토리지를 연동시켜줍니다.

# 연동할 로컬 스토리지
cd /opt/gopath/src/gitlab/sample

# 연동할 리모트 스토리지
git init
git remote add origin http://172.27.42.92/dev/sample.git
git add .
git commit -m "Initial commit"
git push -u origin master

.gitlab-ci.yml 파일 작성

Gitlab이 Continuous Integration을 실행하려면 .gitlab-ci.yml이라는 구성 파일을 생성해야 하며 작업이 실행될 머신이 필요합니다 (우리는 이것을 사용할 것입니다). 이 파일에서는 러너(CI가 실행되는 머신)가 수행해야하는 명령을 작성합니다. Gitlab CI/CD에 대한 자세한 내용은이 페이지를 방문하십시오.

먼저 프로젝트 루트에 작은 .gitlab-ci.yml을 생성하여 수행 할 여러 작업을 시뮬레이트합니다.

.gitlab-ci.yml 파일을 예를 들어보면

stages:
  - test
  - build
  - deploy
unit-test:
  stage: test
  script: echo 'Testing...'
unity-build:
  stage: build
  script: echo 'Building...'
playstore:
  stage: deploy
  script: echo 'Deploying...'

- Pipeline : 모든 작업과 단계를 연결합니다.

- Stages: 파이프 라인의 범주, 다른 단계와 같습니다.

- Job: 특정작업입니다.

 

위의 .gitlab-ci.yml 에는 3단계 (테스트, 빌드 및 배포)가 있으며, 각각 특정 단계에 속하는 3가지 작업이 있으며, 현재 해당 작업은 에코를 수행하는 것입니다.

방금 변경 한 내용을 저장소에 업로드합니다.

 

1) 로컬 스토리지에서 .gitlab-ci.yml 파일 생성하여 리모트 스토리지로 코드 push 하기

 

stages:
  - test
  - build
  - deploy

variables:
  IMAGE_NAME: <IP>:5000/nodejs-server-test:$IMAGE_VERSION

cache:
  paths:
    - node_modules/
    
test:
  stage: test
  image: node:latest
  script:
    - env
    - npm install

build:
  stage: package
  image: docker:latest
  services:
    - docker:dind
  stage: build
  script:
    - ls -al
    - docker container ls -a
    - docker build . -t $IMAGE_NAME
    - docker push $IMAGE_NAME
    - docker images | grep '<IP>'

deploy:
  stage: deploy
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker container ls -a
    - docker container rm -f nodejs-server 
    - docker run -d -p 8090:8090 --name nodejs-server --restart always $IMAGE_NAME
    - docker container ls -a

 

프로젝트 푸쉬하기

# 연동할 로컬 스토리지
cd /opt/gopath/src/gitlab/sample

# 연동할 리모트 스토리지
git add .
git commit -m "커밋할 메세지"
git push -u origin master

 

2) 리모트 스토리지에서 .gitlab-ci.yml 파일 생성하여 코드 pull 하기

프로젝트 페이지에서 + > New file

 

 

Select a template type 에서 .gitlab-ci.yml 파일을 선택합니다.

 

 

Apply a template > Docker

 

 

기본적인 example 코드가 생성됩니다.

 

 

안에 내용을 아래와 같이 채웁니다.

 

stages:
  - test
  - build
  - deploy

variables:
  IMAGE_NAME: <IP>:5000/nodejs-server-test:$IMAGE_VERSION

cache:
  paths:
    - node_modules/
    
test:
  stage: test
  image: node:latest
  script:
    - env
    - npm install

build:
  stage: package
  image: docker:latest
  services:
    - docker:dind
  stage: build
  script:
    - ls -al
    - docker container ls -a
    - docker build . -t $IMAGE_NAME
    - docker push $IMAGE_NAME
    - docker images | grep '<IP>'

deploy:
  stage: deploy
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker container ls -a
    - docker container rm -f nodejs-server 
    - docker run -d -p 8080:8080 --name nodejs-server --restart always $IMAGE_NAME
    - docker container ls -a

구성요소

설명

stages

스테이지 별로 작업이 실행된다.각 스테이지의 작업 중 하나라도 실패하면 pipeline의 표시가 failed로 뜬다. 스테이지 명을 따로 정의하지 않으면 build, test, deploy로 기본 값이 배정된다.

variables

.gitlab-ci.yml파일에서 사용 될 변수 와 값의 정의

cache

후속 실행 사이에 캐시되어야하는 파일 목록 (cache:paths, cache:key, cache:untracked, cache:policy)

test

Job 이름

stage

해당 Job이 실행되는 스테이지의 이름. 같은 스테이지에 해당하는 것들은 Job이 달라도 병행 실행된다(parallel). Job에 스테이지를 따로 지정하지 않으면 그 Job은 test 스테이지다.

image

CI를 위해 Docker가 실제로 사용하는 image의 이름이다. 이미지는 Docker Hub에 올라와 있는 것만 사용 가능하지만 gitlab-runner/config.toml 설정을 바꿈으로써 로컬 이미지도 사용 가능 하다.

script

gitlab-runner exeucutor가 실행할 명령들. script는 모든 Job에 항상 포함되어야 한다.

services

job 실행 중 실행되는 Docker 이미지, 이 이미지로 생성되는 컨테이너는 line 1의 이미지와 연결된다. docker:dind 는 도커 컨테이너 안에서 또 다시 컨테이너를 사용 할 수 있게 해 준다(Docker in Docker의 약자).docker로 gitlab-runner CI를 구성했기 때문에 이 서비스를 사용한다.

artifacts

성공시 작업에 첨부할 파일 및 디렉토리 목록 (artifacts:paths, artifacts:name, artifacts:untracked, artifacts:when, artifacts:expire_in, artifacts:reports, artifacts:junit 사용 가능)

# 연동된 로컬 스토리지
cd /opt/gopath/src/gitlab/sample

git pull

CI/CD > Pipelines 확인 하기

러너와 연결된 프로젝트 화면으로 들어가 사이드 바에 CI/CD > Pipelines 탭을 클릭해줍니다.

 

 

클릭을 하게 되면 파이프라인의 목록을 확인 할 수 있습니다. 그 중에 가장 최근 목록의 status 를 클릭해 주면 파이프라인의 상태를 보실 수 있습니다.

 

 

다음과 같이 파이프라인이 상세하게 보이게 됩니다.

 

 

파이프라인 중에 Build 부분의 로그를 확인하고 싶으면 해당 job 의 이름을 클릭하게 되면 아래 와 같이 상세하게 확인하실 수 있습니다.