.gitlab-ci.yml
생성.gitlab-ci.yml
의 경로를 바꾸고 싶다면 적용하려는 Project > Settings > CI/CD > General pipelines에서 경로를 바꾸면 된다Spring Boot를 사용하고 있다면 jar 파일로 빌드 하는 과정이 필요하다. 이번 프로젝트는 maven을 사용하기 때문에 maven으로 빌드하는 내용만 다룬다. gragle을 사용하는 경우 그에 맞게 image와 script를 수정해서 사용하면 된다.
.gitlab-ci.yml
에 다음과 같이 코드를 추가한다.
stages:
- package
package:
image: adoptopenjdk/maven-openjdk11
stage: package
script:
- 'mvn -B package --file pom.xml'
artifacts:
paths:
- target/*.jar
only:
variables:
- $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
package 단계에서 빌드한 jar 파일을 실행하는 Docker Image를 빌드한 후 Docker Container Registry에 푸시한다. 이 글에서는 ECR에 연동하는 내용만 다룬다.
만약 기본 도커 레포지토리를 사용한다면 공식문서를 참고해서 docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
방법을 사용하면 된다.
(예시)
FROM adoptopenjdk:11-jre-openj9
ADD /target/[파일명].jar [파일명].jar
ADD [설정파일경로].yml application.yml
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","/[파일명].jar", "--spring.profiles.active=default"]
EXPOSE 8281
AWS에서 Access Token 생성하기
IAM > Access Management > Users > Security Credentials 페이지로 이동해서 Access Key를 생성한다.
Variable에 다음과 같이 AWS CLI 로그인을 위한 정보를 저장해놔야한다.
AWS에서 만든 Access Key를 Gitlab에 등록한다.
Settings > CI/CD > Variables에 가서 AWS_ACCESS_KEY_ID
와 AWS_SECRET_ACCESS_KEY
를 등록한다.
options는 콘솔에 민감정보가 뜨지 않도록 Masked
는 활성화하되, proted branch 외에 다른 브랜치(feature 브랜치 등)에서도 CI/CD 테스트를 해야해서 Protected
는 비활성화 했다.
variables:
DOCKER_REGISTRY: 000000000000.dkr.ecr.ap-northeast-2.amazonaws.com
AWS_DEFAULT_REGION: ap-northeast-2
APP_NAME: [app-name]
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
stages:
- package
- build
package:
image: adoptopenjdk/maven-openjdk11
stage: package
script:
- 'mvn -B package --file pom.xml'
artifacts:
paths:
- target/*.jar
only:
variables:
- $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
docker_build:
image: docker:latest
stage: build
services:
- docker:19-dind
before_script:
- apk add --no-cache curl jq python3 py3-pip
- pip install awscli
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $DOCKER_REGISTRY
script:
- docker build -t $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID -t $DOCKER_REGISTRY/$APP_NAME:latest .
- docker push $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID
- docker push $DOCKER_REGISTRY/$APP_NAME:latest
only:
variables:
- $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Docker in Docker
)를 사용할 수 있도록 하는 기본 설정. (여기선 Default 설정을 사용)Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
에러가 뜬다. EKS(Elastic Kubernetes Service)에 Pod로 배포하는 단계. Gitlab에서 EKS Cluster와 연동하려면 Gitlab Agent를 설치해야한다. 예전에는 Authentication Token등으로 인증하기도 했던것 같은데, deprecated 되어서 Agent를 설치하는 방법을 선택했다.
참고 자료: gitlab 공식문서
EKS와 EKS에 연동된 aws-cli가 있어야 한다. 생성방법은 AWS 공식문서 참고
## 사전 조건 summary
1. gitlab repository에 gitlab agent configuration 파일 생성
2. gitlab에 Kubernetes Cluster 등록
3. kubernetes cluster에 gitlab agent 설치 (helm 설치 필수)
config.yaml
을 생성한다.(yml 파일이 아니라 yaml이어야한다).gitlab/agents/<agent-name>
config.yaml 작성
gitops:
manifest_projects:
- id: [조직명]/[그룹명]/[프로젝트명]
default_namespace: aiden-vas #eks에서 사용하는 기본 namespace(optional)
Connect Cluster
를 누른 후 위에서 작성한 agent-name을 작성하고 create agent를 누른 후 Register를 누르면 생성된다.kubectl get po -n gitlab-agent
했을 때 아래와 같이 잘 실행되고 있다면 성공이다.variables:
DOCKER_REGISTRY: 000000000000.dkr.ecr.ap-northeast-2.amazonaws.com
AWS_DEFAULT_REGION: ap-northeast-2
APP_NAME: [app-name]
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
EKS_CONTEXT_PATH: [조직]/[그룹]/[프로젝트명]:[agnet명]
EKS_DEFAULT_NAMESPACE: aiden-vas
EKS_DEPLOYMENT_YAML_PATH: [deploy yaml 파일 경로]
cache:
paths:
- .m2/repository
stages:
- package
- build
- deploy
package:
image: adoptopenjdk/maven-openjdk11
stage: package
script:
- 'mvn -B package --file pom.xml'
artifacts:
paths:
- target/*.jar
only:
variables:
- $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
docker_build:
image: docker:latest
stage: build
services:
- docker:19-dind
before_script:
- apk add --no-cache curl jq python3 py3-pip
- pip install awscli
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $DOCKER_REGISTRY
script:
- docker build -t $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID -t $DOCKER_REGISTRY/$APP_NAME:latest .
- docker push $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID
- docker push $DOCKER_REGISTRY/$APP_NAME:latest
only:
variables:
- $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy:
image:
name: bitnami/kubectl:latest
entrypoint: ['']
stage: deploy
script:
- kubectl config get-contexts
- kubectl config use-context $EKS_CONTEXT_PATH
- kubectl get pods -n $EKS_DEFAULT_NAMESPACE
- kubectl delete -f $EKS_DEPLOYMENT_YAML_PATH
- kubectl apply -f $EKS_DEPLOYMENT_YAML_PATH
# - kubectl rollout restart deployment -n $EKS_DEFAULT_NAMESPACE admin-mgmt-deploy
only:
variables:
- $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy에 필요한 yaml 파일에 대한 내용은 생략.
$DOCKER_REGISTRY/$APP_NAME:latest
이런식으로 최신의 도커 이미지를 가져오도록 pod를 설정해놓으면 yaml 파일 없어도 rollout restart 로 업데이트가 가능하다
이렇게 모든 stage를 완료하면 성공!