단계
.java
➡ .class
➡ .jar
➡ docker Image ➡ GitLab Runner
실습 단계
1. SpringBoot하나 빌드
2. gitlab에 올린 후
3. Dockerfile올리고
4. ci스크립트 올리고
5. 빌드해서
6. Container Registry에 올리고
7. Container Registry에서 docker pull을 받아서
8. 띄워보기
9. crontab까지
배포스크립트(gitlab-ci.yml) 역할
1. git clone 또는 git pull을 통해 새 버전의 프로젝트 받기
2. gradle을 통해 프로젝트 테스트와 빌드
3. EC2 서버에서 해당 프로젝트 실행 및 재실행
.sh
리눅스에서 기본적으로 사용할 수 있는 script 파일의 한 종류이다.
vim
.sh 같은 파일을 편집하는 편집 도구이다.
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
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
.yml
내용에 따라 variable
추가 Dockerfile <-- 파일명 그대로 해줘야 한다. 약속이기 때문에
환경변수도 잘 설정해주기
환경변수로 깃랩 패스워드를 넣을 때, mask기능을 체크하고 넣게 되는데, 이때 !,~와 같은 특수문자는 마스크가 제대로 해석 되지 않아 오류가 난다. 해석되는 특수문자 (@ 등등)을 써서 비밀번호를 만들어야한다.
환경변수 설정시, username은 소문자로 적어준다. 예를들어, 내 원래 UserID가 SuJeong이라면, 환경변수 설정시에는 sujeong으로 입력한다.
➡️ container Registy에 Image가 만들어졌으면 pipeline 정상 작동 확인완료 ✔️
docker pull {docker_image_url}
// url은 gitlab registry메뉴에서 해당 image path를 복사할 수 있는 버튼이 있다.
docker run -p 8080:8080 --name {gitlab 프로젝트명 } -e SPRING_DATASOURCE_URL={} -e SPRING_DATASOURCE_PASSWORD={} -d {registry path}
ex) docker run -p 8080:8080 --name gitlab-exercise -e SPRING_DATASOURCE_URL=jdbc:mysql://ec2-3-36-64-158.ap-northeast-2.compute.amazonaws.com:3306/likelion_db2 -e SPRING_DATASOURCE_PASSWORD=passward -d registry.gitlab.com/s2ujeong1/gitlab-exercise
🔽 docker ps를 하면 띄어진 Image를 볼 수 있다.
🔽 log 보는 방법 : docker logs {containner id}
✔️ 도메인 주소와 get주소를 입력하면, 내가 만든 페이지가 띄어지는 것을 확인할 수 있다.
deploy.sh 파일을 이용하지 않는다면 프로젝트 수정 시 마다,
git commit/push ➡️ ( 바로 띄어져 있는 서버로 반영 x ) ➡️ run pipeline ➡️ shell 에서 docker pull -> docker run
이 과정을 다 해주어야 한다.
우리는 이 번거로운 과정을 deploy.sh 파일을 이용해서 한번에 처리한다.
🔽 deploy.sh 작성법
#!/bin/bash
set -ex
docker pull registry.gitlab.com/<사용자ID>/<프로젝트이름>: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 <컨테이너이름>
docker rm -f <컨테이너이름>
docker run -p 8080:8080 --name <컨테이너이름> \
-e SPRING_DATASOURCE_URL=<url/DB명> \
-e SPRING_DATASOURCE_PASSWORD=<password> \
-d registry.gitlab.com/<사용자ID>/<프로젝트이름>
docker image prune -f
fi
🔽 deploy.sh 예시
#project name
PROJECT_NAME=gitlab-exercise // 띄어쓰기 넣으면 인식못함 주의 NAME= gitlab (X)
#!/bin/bash
set -ex
docker pull registry.gitlab.com/s2ujeong1/$PROJECT_NAME: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 $PROJECT_NAME
docker rm -f $PROJECT_NAME
docker run -p 8080:8080 --name $PROJECT_NAME -e SPRING_DATASOURCE_URL=jdbc:mysql//ec2-3-36-64-158.ap-northeast-2.compute.amazonaws.com:3306/project-db -e SPRING_DATASOURCE_PASSWORD=0000 -d registry.gitlab.com/s2ujeong1/$PROJECT_NAME
docker image prune -f
fi
❌ db명에 _(언더바) 있으면 안됨
GitLab 로그인 불가 , deniend acssess
docker login registry.gitlab.com/{userName}/{projectName} -p {password}
crontab -e // crontab 설정 입력 파일
crontab -l // crontab 내용 확인
crontab -r // crontab 내용 삭제
xshell에서, crontab -e
입력하여 crontab을 실행한다.
🔽 실행되면, 파일의 입력모드에서 아래와 같이 입력해준다
* * * * * sh /home/ubuntu/deploy.sh >> /home/ubuntu/deploy.log
// ➡ 매분마다 /home/ubuntu/ 위치에 있는 deploy.sh 파일을 (위에서 작성한 배포스크립트) 실행하고,
/home/ubuntu/ 위치에 deploy.log 이름의 파일에 로그를 저장한다.
🚫 crontab이 실행되기 전, 프로젝트 내용을 바꾸고 push 한 뒤, 수동으로 sh deploy.sh
코드 진행하여 스크립트 파일이 제대로 돌아가는지 확인하자. 필자는 스크립트가 제대로 안 써져서 안 돌아가는걸 crontab 문젠지 알고 한참 헤맸다. 스크립트를 자동으로 돌려지게 설정하는것이 crontab의 역할이므로 스크립트 파일이 정상 작동 선행되어야 함을 명심하자