gitlab runner with testconatiner - g-market/b-shop-backend GitHub Wiki
- Gitlab-CI ๋ก ํ ์คํธ ์๋ํ ํ๊ฒฝ์ ๊ตฌ์ถ
- ํ ์คํธ ์ดํ CI
- CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
- Spring boot ํ๋ก์ ํธ docker image๋ก ๋ฐฐํฌ
- docker image gitlab container registry์ ์ ๋ก๋
- ์๋ฒ VM์์ ํด๋น ์ด๋ฏธ์ง ๋ด๋ ค๋ฐ๊ณ ์คํ
CI ํ์ดํ๋ผ์ธ์ ํด๋น ๊ณผ์ ์์ ๋น๋, ํ ์คํธ, ๊ทธ๋ฆฌ๊ณ ํ ์คํธ์ปค๋ฒ๋ฆฌ์ง์ ๋ํ ์๊ฐํ์์ (jacoco)๋ฅผ ์ํํ๋ค. ํ์ฌ ์ปค๋ฒ๋ฆฌ์ง์ ๋ํ ๋ช ํํ ์ ์๋ฅผ ๋ด๋ฆฌ์ง ์์ ๋น๋๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ปค๋ฒ๋ฆฌ์ง์ ๋ํ ์ค์ ์ ๋ง์๋์ ์ํ์ด๋ค.
- coverage๋ฅผ 5% ์ ๋๋ก ๋ฎ์ถ๊ณ ์คํํ์ ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ณด์ด๋์ง ํ์ธํ์ <- ์๋จ..
ํด๋น ํ์ดํ๋ผ์ธ์ ํ
์คํธ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ ํตํฉ, ๋จ์ ํ
์คํธ๋ฅผ develop, main ๋ธ๋์น๋ก Merge request๊ฐ ๋ฐ์ํ ๋ ์ํ์ด ๋๋ค.
ํ
์คํธ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด DinD(docker in dockder) ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ค. build๊ณผ test๋จ๊ณ์ ์๋ฌ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋น๋๋ฅผ ํ
์คํธ๋ฅผ ์ ์ธํ๊ณ ์ํํ๋๋ก ์ค์ ํ๋ค. -> (./gradlew build -x test
)
๋ค์์ gitlab-ci.yml ์คํฌ๋ฆฝํธ์ด๋ค.
build:
rules:
- if : '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
image: openjdk:17-alpine
stage: build
before_script:
- echo "$APPLICATION_YAML" > "src/main/resources/application.yml"
script:
- ./gradlew clean
- ./gradlew build -x test
artifacts:
paths:
- build/libs/*.jar
expire_in: 10 min
test:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
variables:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
# Instruct Testcontainers to use the daemon of DinD.
DOCKER_HOST: "tcp://docker:2375"
# Improve performance with overlayfs.
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
image: openjdk:17-alpine
stage: test
tags:
- gitlab-runner
services:
- name: docker:dind
script:
- ./gradlew test
coverage: '/ - Instruction Coverage: ([0-9.]+)%/'
artifacts:
paths:
- build/reports/jacoco/test/jacoco*.xml
reports:
junit: build/test-results/test/**/TEST-*.xml
๋ฐฐํฌ๋ฅผ ์ํ ์ ํ๋จ๊ณ๋ก dockerfile๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ๋ก ์ ๋ก๋ ํ๋ ์์ ์ด ํ์ํ๋ค. ํ์ฌ ํ๋ก์ ํธ ํ๊ฒฝ๋ณ์(application.yml)์ ํ์ํ ์ ๋ณด๋ค์ด ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋๋ก ์ค์ ๋์ด์์ด ํ๊ฒฝ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ ์ฉํด์ผํ๋์ง์๋ํ ๊ณ ๋ฏผ์ด ํ์ํ๋ค.
docker run -d \
--name b-shop-test \
-p 8080:8080 \
-e ACCESS-EXPIRED-TIME=3600000 \
-e ACCESSTOKEN-URL=https://api.hiworks.com/open/auth/accesstoken \
-e ACTIVE-PROFILE=local \
-e CART-EXPIRED-TIME=86400000 \
-e CLIENT-ID=g9weeb6q1rsgirhtgcxsmyj4wt7ktcer6045c8d8d357e7.34276869.open.apps \
-e CLIENT-SECRET=9a1n7i7p1qz8ih2knpy3jgrpcbcedbyf \
-e DB-PASSWORD=1234 \
-e DB-URL=โjdbc:mysql://b-shop-database:3306/bshop_dbโ \
-e DB-USERNAME=root \
-e DDL-AUTO=create \
-e FETCH-SIZE=100 \
-e LOCAL-DOMAIN=http://b-shop.com \
-e LOG-LEVEL=debug \
-e USER-URL=https://api.hiworks.com/user/v2/me \
-e TOKEN-SECRET=localSecretKey123456789876543210 \
-e SERVER-PORT=8080 \
-e PROD-DOMAIN=https://b-shop.com \
-e PROD-URL=https://139.150.73.182 \
-e REDIS-HOST=172.22.0.2 \
-e REDIS-PORT=6379 \
-e REFRESH-EXPIRED-TIME=1209600000 \
-e MINIO-ENDPOINT=http://localhost:9000 \
-e MINIO_BUCKET=images \
-e MINIO_PASSWORD=minio1234 \
-e MINIO_USER=minio \
-e MINIO_NO_IMAGE_URL=http://localhost:9000/images/No_Image.jpg \
--network test_net \
test
stages:
- build
- test
- visualization
- package
- deploy
build:
rules:
- if : '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
image: openjdk:17-alpine
stage: build
before_script:
- echo "$APPLICATION_YAML" > "src/main/resources/application.yml"
script:
- ./gradlew clean
- ./gradlew build -x test
artifacts:
paths:
- build/libs/*.jar
expire_in: 10 min
test:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
variables:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
# Instruct Testcontainers to use the daemon of DinD.
DOCKER_HOST: "tcp://docker:2375"
# Improve performance with overlayfs.
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
image: openjdk:17-alpine
stage: test
tags:
- gitlab-runner
services:
- name: docker:dind
script:
- ./gradlew test
coverage: '/ - Instruction Coverage: ([0-9.]+)%/'
artifacts:
paths:
- build/reports/jacoco/test/jacoco*.xml
reports:
junit: build/test-results/test/**/TEST-*.xml
#https://docs.gitlab.com/ee/ci/testing/test_coverage_visualization.html
visualization:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop"'
stage: visualization
image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
script:
- python /opt/cover2cover.py build/reports/jacoco/test/jacoco*.xml $CI_PROJECT_DIR/src/main/java/ > build/cobertura.xml
needs: ["test"]
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: build/cobertura.xml
package-and-push:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
stage: package
needs: ["test"]
image: docker:latest
services:
- name: docker:dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker pull $IMAGE_NAME:latest || true
- docker build --cache-from $IMAGE_NAME:latest --tag $IMAGE_NAME:$CI_COMMIT_SHA --tag $IMAGE_NAME:latest .
- docker push $IMAGE_NAME:$CI_COMMIT_SHA
- docker push $IMAGE_NAME:latest
after_script:
- docker logout
deploy:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"'
stage: deploy
needs: ["test"]
tags:
- deployer
before_script:
## Run ssh-agent (inside the build environment)
- eval $(ssh-agent -s)
## ADD ssh-key to ssh-agent
- chmod 400 "$SSH_KEY"
- ssh-add "$SSH_KEY"
## ADD ssh known hosts
- mkdir -p ~/.ssh touch /.ssh/known_hosts
- cp "$SSH_KNOWN_HOSTS" ~/.ssh/known_hosts
## change permission
- chmod 644 ~/.ssh/known_hosts
- chmod 700 ~/.ssh
script:
## SSH CONNECTION
- ssh root@IP_ADDRESS
- cd deploy
## PULL IMAGE
- docker pull $IMAGE_NAME:latest
- echo "$DEPLOY_ENV" >> .env
## BLUE_DEPLOY
- echo "$BLUE_DEPLOY_YAML" >> blue_deploy.yml
- docker-compose -f blue-deploy.yml down -v
- docker-compose -f blue-deploy.yml --env-file .env up -d
## GREEN_DEPLOY TODO
# - echo "$GREEN_DEPLOY_YAML" >> green_deploy.yml
# - docker-compose -f green_deploy.yml down -v
# - docker-compose -f green_deploy.yml --env-file .env up -d
after_script:
- exit
https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3251
https://cha-vi.tistory.com/entry/Docker-Docker-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%9E%90%EB%8F%99-%EB%B0%B0%ED%8F%ACFastAPI-%EC%99%80-Gitlab-CICD%EB%A5%BC-%EA%B3%81%EB%93%A4%EC%9D%B8 https://velog.io/@jsb100800/Spring-boot-Test
https://nearhome.tistory.com/141
https://velog.io/@jsb100800/Spring-boot-Test
https://aidanbae.github.io/code/docker/dinddood/