본문 바로가기

개발(합니다)/OS&Dev&Infra&AWS

[Gitlab-CI/CD] window에서 Gitlab CI/CD를 docker로 배포하는 방법

반응형

DevOps

Development + Operations의 합성어로 개발과 운영을 합친 개발방법론입니다.
개발과 조직을 융합하게 된 이유는
개발 조직은 새로운 기술과 기능을 도입하고 싶어하고, 운영 조직은 안전성을 중요시하게 되면서
이를 잘 해낼 수 있는 두 조직을 융합한 방법론이 DevOps입니다.

DevOps 특징

  • CI/CD(Continuous Integration, Continuous Deploy)
    • CI(지속적인 통합) : 빌드 및 테스트 자동화 / 테스트를 완료 및 통과한 소스만 중앙 저장소에서 통합
      • Jenkins, TravisCI
    • CD(지속적인 제공) : 배포 자동화 / 통합 된 소스를 서비스 원격지로 배포

Gitlab

Gitlab은 GIt의 원격 저장소 기능, 이슈 트래커, CI/CD 등 다양한 기능을 제공합니다.
설치형(on-promises) Git으로 유명해진 소프트웨어이기도 합니다.
서비스형 원격저장소를 운영하면서 비용이 부담되거나, 보안이 중요한 프로젝트에 적합합니다.
public과 private에 대한 무료 지원과 자체 CI와 사용자 인터페이스를 제공합니다.

GItlab 특징

  • 10명 이하 프로젝트 무료 사용
  • issue tracker
  • 설치형 버전 관리
  • API 제공

Gitlab CI/CD

Gitlab CI/CD 특징

Gitlab CI/CD는 도커에서 구동되며 .gitlab-ci.yml에 작성된 스크립트에 따라
순차적으로 파이프라인(Job)이 실행됩니다.

개발자의 선택에 따라 달라지지만 Jobs은 기본적으로 아래와 같이 구성합니다.

 

소스가 커밋될 때마다 CI/CD를 진행하여 테스트, 린트, 빌드, 배로를 순차적으로 실행합니다.

  • 테스트 : 유닛 테스트, 통합 테스트, E2E 테스트, 테스트 커버리지 측정
  • 린트 : 코드 퀄리티 측정, 코드 컨벤션 점검
  • 빌드 : 빌드, 번들링, Dockerfile 빌드 및 컨테이너 레지스트리 푸시/풀
  • 배포 : 원격지 배포, Helm Chart, 컨테이너 배포

gitlab docs

GItlab CI/CD 구성 방법

편의성을 위해 구성은 docker로 진행합니다.

1. GitLab-Runner 등록

1-1. 원격지 Gitlab-Runner 설치

.gitlab-ci.yml을 실행할 원격지(배포하는 원격지)에 gitlab-runner를 등록합니다.

원격지에서 docker를 설치하고 docker에서 아래 명령어를 실행합니다.

docker run -d --name gitlab-runner --restart always --network gitlab-runner-net -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

1-2. Gitlab - 설정 - CI/CD - Runner 설정

설치한 Gitlab-Runner에서 등록해야하는 URL과 토큰 정보를 확인할 수 있습니다.

1-3. docker에서 gitlab-runner 등록

아래 명령어를 치면 docker에서 gitlab-runner로 들어갈 수 있고 gitlab-runner의 명령어를 볼 수 있습니다.

\> docker exec -it \[컨테이너ID\] bash

\> gitlab-runner 

  • 대화형
> gitlab-runner register
  • 실행형
> gitlab-runner register -n --url https://gitlab.com/ --registration-token [부여된 토큰] --description gitlab-cicd-test --tag-list gitlab-cicd-tag --executor docker --docker-image docker:latest 

주의해야 하는 부분은 tag를 통해서 runner를 구분하는 방식입니다.

아래 사진에서도 gitlab-cicd-tag로 해당 러너를 구분합니다.

나중에 .docker-cicd.yml에서 실행할 원격지를 선택할 때 사용하니 필히 주의해서 입력해야 합니다.

2. Docker:dind 추가

dind(docker in docker)로 도커 안에 도커로 컨테이너 내부의 격리된 Docker 데몬을 실행하는 작업을 위해 사용합니다.

> docker run -d --name gitlab-dind --privileged --restart always -p 2375:2375 --network gitlab-runner-net -v /var/lib/docker docker:dind

추가로 환경설정에서 Expose daemon on tcp://localhost:2375 without TLS를 활성화 합니다.

3. Gitlab - Variables 설정

.docker-ci.yml에서 사용할 변수를 지정할 수 있습니다.

도커 이미지 저장소 아이디와 비밀번호나 저장소명을 등록합니다.

글쓴이는 개인 도커 허브를 이용했고 개인 도커 허브 아이디와 비밀번호를 넣어두었습니다.

 

도커 허브를 이용해서 docker.io를 사용함

docker.io: docker.io

CI_REGISTRY_PASSWORD : 비밀번호

CI_REGISTRY_USER : 아이디

 

4. 배포할 간단한 node 서버와 dockerfile 만들기

package.json

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

dockerfile


FROM node

WORKDIR /usr/src/app

ARG NODE_ENV
ENV NOD_ENV $NODE_EVN

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

COPY . /usr/src/app

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('exaple app listening on prot 8900!')
})

5. .docker-ci.yml 작성

실행할 원격 저장소의 tag를 참조하는걸 확인할 수 있습니다.

tag없이 실행했더니 gitlab 내부에 있는 원격지에서 실행되어서 생성 된 docker 이미지를 못찾고 헤맸었네요.

stages:
  - test
  - build
  - deploy

variables:
  IMAGE_NAME: [저장소명]/nodejs-server-test
  DOCKER_HOST: tcp://host.docker.internal:2375
  # DOCKER_DRIVER: overlay2
  # DOCKER_TLS_CERTDIR: "/certs"
  # DOCKER_TLS_CERTDIR: ""

cache:
  paths:
    - node_modules/

# test:
#   stage: test
#   tags:
#     - gitlab-cicd-tag
#   image: node:latest
#   script:
#     - env
#     - npm install

build:
  stage: build
  # stage: package
  tags:
    - gitlab-cicd-tag
  image: docker:latest
  services:
    - docker:dind
  script:
    - "docker login -u \"${CI_REGISTRY_USER}\" -p \"${CI_REGISTRY_PASSWORD}\" \"${CI_REGISTRY}\""
    - ls -al
    - docker container ls -a
    - docker build . -t $IMAGE_NAME
    - docker push $IMAGE_NAME
    - docker images | grep '[저장소명]'

deploy:
  stage: deploy
  tags:
    -  gitlab-cicd-tag
  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

6. 파이프라인 실행 및 테스트

CI/CD 파이프라인을 선택하면 실행했었던 결과들을 확인할 수 있습니ㅏ다.

파이프라인을 선택해서 들어가보면 아래처럼 구성된 Job들이 있고 성공/실패를 확인할 수 있습니다.

Job을 선택하면 실행 된 과정을 확인할 수 있습니다.

원격지에 간단한 노드 서버가 배포되었습니다.

반응형