소스 코드 저장소 준비
먼저 GitLab 프로젝트를 생성하고 샘플 애플리케이션 코드를 업로드합니다. 예시 프로젝트 주소는 다음과 같습니다:
https://gitee.com/SunHarvey/helloworld_java.git
로컬 환경에서 다음 명령어를 실행하여 코드를 가져오고 원격 저장소에 푸시합니다:
git clone https://gitee.com/SunHarvey/helloworld_java.git
cd helloworld_java
git remote set-url origin https://gitee.com/SunHarvey/helloworld_java.git
git push origin master
Kubernetes 클러스터에 GitLab Runner 설치
1. GitLab Runner 등록 정보 확보
- GitLab에 로그인 후 대상 프로젝트로 이동합니다.
- 좌측 메뉴에서 Settings > CI / CD 선택 후 Runners 섹션의 Expand 버튼 클릭
- 표시되는 URL과 Registration token을 기록해 둡니다.
2. Helm Chart 설정
공식 GitLab Runner Helm 차트를 복제하거나 커스텀 차트를 사용할 수 있습니다:
git clone https://github.com/haoshuwei/gitlab-runner.git
cd gitlab-runner
values.yaml 파일 내 다음 필드를 수정합니다:
gitlabUrl: "http://your-gitlab-instance/"
runnerRegistrationToken: "YOUR_REGISTRATION_TOKEN"
전역 Runner로 설정하려면 GitLab 관리자 계정으로 Admin Area > Overview > Runners에서 토큰을 확인하세요.
3. Helm을 통한 설치
Helm 패키지를 생성하고 설치합니다:
helm package .
helm install gitlab-runner . --namespace gitlab --create-namespace
설치 완료 후 Pod 상태를 확인하고, GitLab UI에서 Runner가 활성화되었는지 검증합니다.
CI/CD 환경 변수 설정
프로젝트의 Settings > CI / CD > Variables에서 다음 변수를 추가합니다:
REGISTRY_USERNAME: 컨테이너 레지스트리 사용자명REGISTRY_PASSWORD: 컨테이너 레지스트리 비밀번호kube_config: Base64 인코딩된 kubeconfig 내용
kubeconfig 인코딩 명령어:
cat ~/.kube/config | base64 -w 0
.gitlab-ci.yml 구성
다음은 Java 애플리케이션을 빌드하고 Kubernetes에 배포하는 CI/CD 파이프라인 예시입니다:
image: docker:stable
stages:
- build
- build-image
- deploy
variables:
KUBECONFIG: /etc/deploy/config
JAR_PATH: /opt/artifacts/app.jar
build-app:
image: maven:3.8-jdk-17
stage: build
tags:
- k8s-runner
script:
- mvn clean package -DskipTests
- mkdir -p /opt/artifacts
- cp target/*.jar $JAR_PATH
artifacts:
paths:
- /opt/artifacts/
build-and-push-image:
image: docker:latest
stage: build-image
tags:
- k8s-runner
services:
- docker:dind
variables:
DOCKER_HOST: tcp://localhost:2375
DOCKER_TLS_CERTDIR: ""
script:
- docker login -u "$REGISTRY_USERNAME" -p "$REGISTRY_PASSWORD" registry-vpc.cn-hongkong.aliyuncs.com
- docker build -t registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_COMMIT_SHORT_SHA .
- docker push registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_COMMIT_SHORT_SHA
deploy-to-k8s:
image: bitnami/kubectl:1.27
stage: deploy
tags:
- k8s-runner
script:
- mkdir -p /etc/deploy
- echo "$kube_config" | base64 -d > $KUBECONFIG
- sed -i "s|IMAGE_TAG_PLACEHOLDER|registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_COMMIT_SHORT_SHA|g" k8s/deployment.yaml
- kubectl apply -f k8s/deployment.yaml -n gitlab
파이프라인 단계 설명
- build: Maven으로 JAR 파일 생성 및 아티팩트 보존
- build-image: Docker 이미지 빌드 및 프라이빗 레지스트리에 푸시 (이미지 태그는 커밋 해시 사용)
- deploy: kubeconfig 복원 후 deployment 매니페스트의 이미지 경로 치환 및 적용
배포 확인
애플리케이션이 gitlab 네임스페이스에 배포되었다면 다음 명령어로 서비스 상태를 확인할 수 있습니다:
kubectl get svc -n gitlab
주의사항
- GitLab 프로젝트에서 Auto DevOps 기능이 활성화되어 있다면 충돌을 방지하기 위해 비활성화해야 합니다.
- Docker-in-Docker(dind) 서비스를 사용할 경우 보안 설정을 적절히 구성해야 합니다.