DevOps
Development + Operations의 합성어로 개발과 운영을 합친 개발방법론입니다.
개발과 조직을 융합하게 된 이유는
개발 조직은 새로운 기술과 기능을 도입하고 싶어하고, 운영 조직은 안전성을 중요시하게 되면서
이를 잘 해낼 수 있는 두 조직을 융합한 방법론이 DevOps입니다.
DevOps 특징
- CI/CD(Continuous Integration, Continuous Deploy)
- CI(지속적인 통합) : 빌드 및 테스트 자동화 / 테스트를 완료 및 통과한 소스만 중앙 저장소에서 통합
- Jenkins, TravisCI
- CD(지속적인 제공) : 배포 자동화 / 통합 된 소스를 서비스 원격지로 배포
- CI(지속적인 통합) : 빌드 및 테스트 자동화 / 테스트를 완료 및 통과한 소스만 중앙 저장소에서 통합
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 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을 선택하면 실행 된 과정을 확인할 수 있습니다.
원격지에 간단한 노드 서버가 배포되었습니다.
'개발(합니다) > OS&Dev&Infra&AWS' 카테고리의 다른 글
[CMD] windows에서 java background로 실행 한 프로세스 종료하는 방법 (0) | 2021.07.10 |
---|---|
[Gitlab-CI/CD] .gitlab-ci.yml 사용 방법 (1) | 2021.07.08 |
[docker] docker 내 서비스간(컨테이너간) docker host로 통신하기 (0) | 2021.06.13 |
[gradle] 간단하게 spring boot 프로젝트 gradle을 이용해서 docker로 올리기 (0) | 2021.06.12 |
[aws] 프리티어 인스턴스에서 docker와 Mysql구축하기 (0) | 2021.06.08 |