[Gitlab] self host runner
이곳에서 확인 가능
저장소 추가
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
runner 설치
apt-get install gitlab-runner
project runner 생성
runner를 사용할 project에서 ( github로 치면 repository )
Settings
> CI/CD
> Runner
> Expand
> New Project runner
로 생성
만들 때 태그를 지정할 수도 있다.
runner 등록
gitlab-runner register
url
> https://gitlab.com
token
> 토큰값
name
> 이름 입력
executor
> shell
그럼 등록완료
등록이 완료됐다면 아까 project runner 생성한 곳에서 초록불이 들어올 것임.
test ci
stages:
- test
test:
stage: test
tags:
- linux
script:
- make test
이렇게 테스트 코드를 작성할 수 있었다.
tag시 ci하려면
stages:
- test
test:
stage: test
tags:
- linux
script:
- make test
rules:
- if: '$CI_COMMIT_TAG'
rules에서 if: '$CI_COMMIT_TAG'
를 넣어주면 된다.
...
rules:
- if: '$CI_COMMIT_TAG =~ /^V3/'
이렇게 하면 V3
이 앞에 붙은 태그가 push될 때만 ci 발동한다.
rules:
- if: '$CI_COMMIT_MESSAGE =~ /^\[test\]/'
커밋 메시지는 이런식으로 할 수 있다.
build
build:
stage: build
tags:
- linux
script:
- make build
rules:
- if: '$CI_COMMIT_TAG =~ /^V3/'
build도 같다.
make build에서 특이한 것이 있다.
test:
go test -v -cover ./...
build:
go build -o $(CI_COMMIT_TAG)_wadd
.PHONY: test build
build할 때 $(CI_COMMIT_TAG)
가 반영이 안될 줄 알았는데 반영이 된다. 신기하다.
$(CI_COMMIT_TAG)
는 gitlab에서 제공하는 변수라 안될 줄 알았다.
$CI_PROJECT_DIR
: 프로젝트 폴더 경로
지금 상황
기존에는 여러 repository당 각각 ci를 했다.
이제는 여러 repository를 한 project안에 두어서 각각 build 된다.
근데 문제점이 하나있는게 job 하나가 끝나면 그곳의 환경이 초기화된다.
그래서 build하고 좀 옮겨 놓을 필요성이 있다. (build할 때도 job별로 나누는 것이 아닌 build할 땐 하나의 job에 할당해야 한다.)
해결방법
artifacts
라는 것을 사용하면 된다.
artifacts:
paths:
- $CI_PROJECT_DIR
이렇게 사용하면 Gitlab의 Build
> Pipelines
> 해당 파이프라인에서 다운로드 받을 수 있다.
artifacts:
paths:
- $CI_PROJECT_DIR
expire_in: 1 week
만료 시간 제한도 걸 수 있음
해결
variables:
REPO_DIR: /tmp/deploy
DEPLOY_APP: CAL_$CI_COMMIT_TAG.tar
DEPLOY_DIR: /opt/deploy
stages:
- test
- build
- deploy
🔥 Test for mr-add:
stage: test
tags:
- linux
script:
- make test-add
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
🔥 Test for mr-sub:
stage: test
tags:
- linux
script:
- make test-sub
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
🔥 Test-add:
stage: test
tags:
- linux
script:
- make test-add
rules:
- if: '$CI_COMMIT_TAG =~ /^V3/'
🔥 Test-sub:
stage: test
tags:
- linux
script:
- make test-sub
rules:
- if: '$CI_COMMIT_TAG =~ /^V3/'
🛠️ Build:
stage: build
tags:
- linux
script:
- make build-add
- make build-sub
- tar -cvf $DEPLOY_APP $CI_COMMIT_TAG*
- echo $DEPLOY_APP
after_script:
- find . ! -name $DEPLOY_APP -mindepth 1 -delete
artifacts:
paths:
- $CI_PROJECT_DIR
rules:
- if: '$CI_COMMIT_TAG =~ /^V3/'
🚀 Deploy:
stage: deploy
tags:
- linux
before_script:
- chmod 400 $SSH_KEY
script:
- scp -i $SSH_KEY $DEPLOY_APP root@아이피:$REPO_DIR
- ssh -i $SSH_KEY root@아이피 "
cd $REPO_DIR &&
mkdir -p $DEPLOY_DIR &&
tar xvf $DEPLOY_APP -C $DEPLOY_DIR &&
cd $DEPLOY_DIR &&
ls -al"
dependencies:
- 🛠️ Build
rules:
- if: '$CI_COMMIT_TAG =~ /^V3/'
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
이건 mr할 때만 발동한다는 뜻