Gitlab CI CD - ASPNET Core 배포 및 DB Migration - Refactoring

2023. 10. 9. 00:00DevOps/GitLab CI CD

반응형

자 이제 gitlab ci cd 에서 aspnet core 를 배포하고 db 를 migration 하는 것을 확인 하였다. 

이제 이 내용을 조금 더 발전 시켜보자

 

1. ASPNET Core 배포

현재 Dockerfile 에서 dotnet sdk 7.0 와 aspnet runtime 7.0 을 사용하고 있다. 

image 가 생각보다 클것이다. 

이것을 수정해서 image 를 줄여보자 

linux 에서는 alpine 이라는 최소사양만 가지고 있는 linux 배포판이 있다. 

주로 이러한 container app 을 배포할 때 사용된다. 

우리는 이 dotnet 관련 alpine image 들을 이용하여 publish 를 다시 실행 시킬 것이다. 

 

Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build
WORKDIR /source
COPY . .

WORKDIR /source/ApiServer
RUN dotnet publish -r linux-musl-x64 -c release --no-self-contained -p:PublishReadyToRun=true -o /publish

FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS runtime
WORKDIR /publish
COPY --from=build /publish ./
RUN mkdir ~/.aws &&\
    mkdir /usr/local/bin/aws  
ENTRYPOINT ["dotnet", "ApiServer.dll"]

위에서 sdk 와 aspnet runtime image 가 -alpine 이 붙어 있다. 

이렇게 되어 있으면 linux-musl-x64 로 -r 을 지정해서 publish 가 가능하다. 

그럼 image 이 크기가 상당히 줄어드는 것을 볼 수 있다. 

 

 

2. efbundle.exe 를 이용한 bundle 배포

db migration 을 위해 bundle 배포를 활용하고 있다. 

docker run 시에 실행되도록 하여 gitlab ci / cd 에서 dependency 를 삭제하겠다. 

 

efbundle.exe 에 오른쪽 버튼을 눌러 속성을 다음과 같이 변경한다. 

 

Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build
WORKDIR /source
COPY . .

WORKDIR /source/ApiServer
RUN dotnet publish -r linux-musl-x64 -c release --no-self-contained -p:PublishReadyToRun=true -o /publish

FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS runtime
WORKDIR /publish
COPY --from=build /publish ./
RUN chmod +x entrypoint.sh &&\
    mkdir ~/.aws &&\
    mkdir /usr/local/bin/aws  
ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh

#!/bin/sh
chmod +x efbundle.exe
./efbundle.exe --connection ${CONNECTION_FROM_ENV}
dotnet ApiServer.dll

 

Gitlab CI/CD

variables:
  CONTAINER_NAME: $CONTAINER_NAME
  IMAGE_NAME: $IMAGE_NAME
  DB_CONNECTION_STRING: $DB_CONNECTION_STRING
  DB_CONNECTION: $DB_CONNECTION
  
before_script:
  - |
    echo "Stopping and removing container:" $CONTAINER_NAME 
    docker stop $CONTAINER_NAME 2> /dev/null || true
    docker rm $CONTAINER_NAME 2> /dev/null || true
    docker rmi $IMAGE_NAME 2> /dev/null || true

stages:          # List of stages for jobs, and their order of execution
  - build


docker_build:
  stage: build
  script:
    - echo "docker building the code..."
    - docker buildx build 
      -t $IMAGE_NAME 
      -f Dockerfile .
    #  --build-arg ARG_CONNECTION_STRING=$DB_CONNECTION_STRING 
      
    - docker run 
      -e ConnectionStrings__Server=$DB_CONNECTION 
      -e Logging__LogLevel__Default="Warning" 
      -e CONNECTION_FROM_ENV=$DB_CONNECTION_STRING 
      -v ~/.aws:/root/.aws 
      -v /usr/local/bin:/usr/local/bin
      --name $CONTAINER_NAME -d --restart unless-stopped -p 5006:80 
      --network my_network $IMAGE_NAME
      --add-host host.docker.internal:host-gateway
    - echo "docker build complete."

$DB_CONNECTION_STRING  (Gitlab ci/cd variable)

Server=host.docker.internal;Port=3306;Database=api-server;user=root;password=1234

위와 같이 하면 container 에서 host 로 접근이 가능하다. (127.0.0.1 과 같다.)

 

** HasData 를 이용해서 ef core 에서 seed data 를 넣게 되면.. efbundle.exe 의 크기가 비정상적으로 커진다.

버그 같은데... **

 

https://youtu.be/6AIpmvVZqq8

 

 

관련영상

 

반응형