기본 환경
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
프로젝트와 러너 연동
프로젝트 러너 토큰 복사
연동할 프로젝트 로 들어가서 좌측 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를 실행 프로그램으로 선택한 경우 사용할 볼륨 |
2) 대화식 모드(interactive mode) 로 등록하기
gitlab-runner register
약 20초 후에 gitlab 웹페이지를 새로고침을 하면 다음과 같이 초록색 불이 들어오게 됩니다. 들어오지 않으면 러너를 삭제하고 다시 등록해주세요.
위와 같이 정상 등록 된것을 확인 할 수 있습니다.
프로젝트 내용 작성
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 의 이름을 클릭하게 되면 아래 와 같이 상세하게 확인하실 수 있습니다.
'기타' 카테고리의 다른 글
IPFS Tutorial: IPFS Cluster 로 Private IPFS Network 구성하기 (0) | 2020.12.03 |
---|---|
GitLab 과 Slack 연동 (0) | 2019.12.18 |
GitLab CE 설치하기 (0) | 2019.12.12 |
Docker Local Registry 구축 (0) | 2019.12.11 |
IPFS Tutorial: IPFS(InterPlanetary File System) 설치하기 (1) | 2019.02.27 |