Gitlab CI/CD 설정과 .gitlab-ci.yml 작성 step 2

지난 글에 이어 Gitlab CI/CD 활용 방법을 포스팅 하겠습니다.

지난 글에서는 Gitlab에 구성된 gitlab-runner를 이용해서 간단한 script 동작을 수행해보았습니다. 여러 stage에 걸쳐 파이프라인이 동작하는 걸 확인했는데요. 이번 포스트에서는 개발하면서 주로 많이 사용하게 되는 Docker build를 이용하는 CI 예제를 보이겠습니다.

CI는 내가 작성한 Application이 문제 없이 빌드 되고 실행되는지 확인한은 자동화 작업입니다. 그리고 최종적으로 Deploy 전단계까지를 수행하는 작업인데요. 일반적으로 App을 Docker로 build하고 registry에 업로드 함으로써 배포 준비를 하게 됩니다.

이번 포스트에서는 간단한 Flask 프로젝트를 생성해서 Gitlab CI가 docker build를 하고 빌드된 이미지를 registry에 업로드하는 작업, 그리고 업로드 된 docker image를 Pull 하여 동작해보는 과정을 해보겠습니다.

프로젝트 구조

ci_test 디렉토리에 아래와 같은 파일들을 생성합니다. README.md는 특별히 중요하지 않으므로 아무 내용이나 입력하면 됩니다.

➜  ci_test 
├── Dockerfile
├── README.md
└── app.py

app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello Flask World'
    
if __name__ == '__main__':
    app.run()

Dockerfile

FROM python:3.8-slim

COPY . /app

RUN pip3 install flask 

WORKDIR /app

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0", "--port=3000"]

여기 까지가 Flask App을 생성하기 위한 일반적인 코드입니다. Docker build를 하게 되면 해당 디렉토리의 flask app 파일들을 복사하고 필요한 패키지를 설치, 그리고 실행하는 명령어를 포함하게 됩니다.

.gitlab-ci.yml

이제 Gitlab 파이프라인에서 docker image를 자동으로 빌드하고 registry에 업로드 하도록 스크립트를 작성합니다.

stages:
  - build

before_script:
  - echo "Login Docker Registry..."
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY    # docker registry 로그인

build-job:
  stage: build
  script:
    - echo "Build docker image..."
    - docker build -t $CI_REGISTRY/$CI_PROJECT_PATH:latest .     # docker build
    - docker push $CI_REGISTRY/$CI_PROJECT_PATH:latest           # docker image push

스크립트를 살펴보면 before_script 단계에서 registry에 push 작업을 하기 위해 미리 docker login을 합니다. runner에서는 기본적으로 선언된 변수들이 있습니다. 이 변수들을 사용해서 하드코딩 없이 참조 변수로 스크립트를 만드는 것이 가능합니다. 미리 정의된 변수들은 다음 링크에서 확인 가능합니다.(https://docs.gitlab.com/ee/ci/variables/)

이어서 build-job에서는 docker build와 docker push를 수행합니다. 마찬가지로 CI variable을 사용했습니다. registry 주소와 업로드 될 path 정보를 넣었습니다.

이렇게 코드를 작성하고 git push로 커밋하게 되면 Gitlab pipeline에서 스크립트가 동작합니다.

대략 아래와 같은 작업이 수행되었음을 확인할 수 있습니다.

Running with gitlab-runner 14.10.0 (c6bb62f6)
  on 
Preparing the "shell" executor
00:00
Using Shell executor...
Preparing environment
00:00
Running on ...
Getting source from Git repository
00:00
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /home/gitlab-runner/builds/eYDCcKSv/0/warnus/ci_test/.git/
Checking out 0335efc0 as main...
Skipping Git submodules setup
Executing "step_script" stage of the job script
00:19
$ echo "Login Docker Registry..."
Login Docker Registry...
$ docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/gitlab-runner/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

Gitlab 페이지에서 보면 아래처럼 이미지가 등록된걸 확인할 수 있습니다.

생성된 docker image로 실행해보기

이제 gitlab registry에 등록된 docker image를 로컬PC로 가져와서 실행해보겠습니다.

docker login registry.example.com
docker pull registry.example.com/user/ci_test

위와 같은 명령으로 gitlab registry에 로그인, 이미지 내려받기를 할 수 있습니다. 이미지 다운로드가 완료 된 후 다음 실행 명령으로 실행합니다.

docker run -p 3000:3000 -it registry.example.com/user/ci_test

이렇게 실행하면 대략 아래와 같은 메시지 출력됩니다.

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses (0.0.0.0)
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://127.0.0.1:3000
 * Running on http://172.17.0.2:3000 (Press CTRL+C to quit)

그리고 http://127.0.0.1:3000 주소로 접속한 결과 입니다.

앞서 작성했던 Flask Code가 잘 실행되었음을 확인할 수 있습니다.

참고

  • https://docs.gitlab.com/ee/ci/variables/

Leave a Reply