Github 레포지토리를 만들고 Gitlab과 연동을 한다.
(gradle/wrapper는 나중에 제외시켰다)

프로젝트에 도커파일을 만든다.
FROM gradle:7.4-jdk11-alpine as builder
WORKDIR /build
# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true
# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel
# APP
FROM openjdk:11.0-slim
WORKDIR /app
# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/*-SNAPSHOT.jar ./app.jar
EXPOSE 8080
# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [ \
"java", \
"-jar", \
"-Djava.security.egd=file:/dev/./urandom", \
"-Dsun.net.inetaddr.ttl=0", \
"app.jar" \
]
stages:
- dockerbuild-push
package:
image: docker:latest
stage: dockerbuild-push
only:
- main
services:
- docker:dind
before_script:
- docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PASSWORD
script:
- docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME .
- docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
after_script:
- docker logout

deploy.sh 파일 생성
#!/bin/bash
set -ex
docker pull registry.gitlab.com/solkim/finalproject_kimsolbae:latest | grep "Image is up to date" && pull_status="already_pulled" || pull_status="newly_pulled"
echo $pull_status
if [ "$pull_status" = "newly_pulled" ]; then
docker stop finalproject_kimsolbae
docker rm -f finalproject_kimsolbae
docker rmi $(docker images -f "dangling=true" -q)
docker run -p 8082:8080 --name {프로젝트명} -e SPRING_DATASOURCE_URL=jdbc:mysql://{주소} -e SPRING_DATASOURCE_PASSWORD={비밀번호} -e JWT_SECRET={시크릿키} -d registry.gitlab.com/solkim/finalproject_kimsolbae
fi
1분에 한번씩 업데이트가 되게 설정
crontab -e 명령어로 Crontab을 설정한다.
* * * * * sh /home/ubuntu/deploy.sh >> /home/ubuntu/deploy.log

이제 CI/CD 구축을 완료하였다!