Docker 기반 CI·CD 파이프라인 구축

CI/CD - CI/CD Pipeline 구성하기 / Makefile & make /

wy-family 2024. 12. 6. 21:33

파이프라인을 작성을 해봤고 어떻게 작동하는지도 확인해봤다.

 

이제는 test-app을 직접 CI/CD Pipeline 배포하는 것을 해봐야 한다.

실제 빌드를 할 수 있게 해야 한다.

 

현재 .gitlab-ci.yml 파일(pipeline)에는 stages가 만들어져있다.

- build / test / deploy

지금은 각각의 stages 에서 echo를 실행하고 있는데,

직접 build를 할 수 있도록,

docker image를 build 하고 push하고 test 하고 deploy 를 할 수 있도록 수정을 해야 한다.

 

여러가지 방법 중에 여기서 선택할 방법은, 소스 코드에 make build / make push / make test ... 스크립트를 함께 집어넣을 것이다. 그래서 make build 를 하게 되면, docker build를 만드는 작업을 하게 되고, make push를 하게 되면 push 하는 작업, make test를 하게 되면 test를 하는 작업을 수행하도록 할 것.

 

GitLab 같은 경우는, 각각의 스테이지

예를 들어서, build stage에서

script 에서

make build 가 실행되면

make build는 그 안에서 별도의 script를 실행할 수 있도록.

dockerbuild 같은게 들어갈 것이다. 

 

그래서 실질적으로 작동하는 어플리케이션 CI/CD를 구성해볼 것이다.

 

결과적으로 이렇게 하게 되면은 수동으로 했던 것들을 자동으로 하게 되어서 개발 프로세스의 혁신을 만들게 되는 파이프라인을 만들게 된다. (여기서 test는 echo로 할 것이고, deploy 는 다음 게시글(다음 단계)에서 할 것이다.)


Makefile & make

Makefile과 make는 주로 소프트웨어 빌드 및 자동화를 위한 도구로 사용됩니다. CI/CD 파이프라인에서도 반복 작업의 자동화를 돕는 중요한 구성 요소가 될 수 있습니다. 아래에서 각각을 설명합니다.


1. Makefile이란?

Makefile은 프로젝트에서 자동화 작업을 정의한 파일입니다. 이 파일에는 소프트웨어 컴파일, 테스트 실행, 배포 등 여러 작업을 **규칙(Rules)**로 정의할 수 있습니다.

  • 구조:
    • 타겟(Target): 작업의 이름입니다. 예: build, clean.
    • 종속성(Dependency): 해당 작업을 수행하기 전에 충족해야 할 조건입니다.
    • 명령어(Commands): 타겟을 처리하기 위해 실행할 명령입니다.

예시: Makefile

# 타겟: clean
clean:
	rm -rf build/

# 타겟: build
build: clean
	gcc main.c -o main

# 타겟: test
test:
	./main --test
  • 명령어 실행:
make build
make clean
 

2. make란?

make는 Makefile을 읽어서 작업을 실행하는 도구입니다.

  • 특정 타겟의 작업만 실행하거나, 모든 작업을 자동으로 처리할 수 있습니다.
  • make는 타겟의 종속성을 확인하고, 필요한 경우에만 작업을 실행해 효율적입니다.

동작 원리

  1. make는 Makefile을 읽습니다.
  2. 사용자가 요청한 타겟의 종속성을 확인합니다.
  3. 필요하다면 종속 타겟부터 먼저 실행합니다.
  4. 명령어를 순서대로 실행합니다.

3. CI/CD 파이프라인에서 Makefile과 make

CI/CD 파이프라인에서는 반복 작업을 자동화하기 위해 Makefile을 사용할 수 있습니다. 주요 활용 사례는 다음과 같습니다:

  1. 빌드 자동화: 소스 코드를 컴파일하고 패키징.
  2. 테스트 실행: 유닛 테스트, 통합 테스트 자동화.
  3. 배포 작업: 특정 환경에 애플리케이션 배포.

예시: CI/CD에서 Makefile

# Makefile
install-dependencies:
	npm install

build:
	npm run build

test: build
	npm run test

deploy: test
	scp dist/ user@server:/var/www/

GitLab CI/CD와의 통합

.gitlab-ci.yml에서 Makefile의 타겟을 호출하여 CI/CD 파이프라인에 포함할 수 있습니다.

# .gitlab-ci.yml
stages:
  - install
  - build
  - test
  - deploy

install:
  stage: install
  script:
    - make install-dependencies

build:
  stage: build
  script:
    - make build

test:
  stage: test
  script:
    - make test

deploy:
  stage: deploy
  script:
    - make deploy

4. 장점

  • 효율성: 종속성 관리로 필요한 작업만 수행.
  • 유연성: 다양한 작업 정의 가능.
  • 자동화: 반복적인 작업을 간편하게 실행 가능.

CI/CD 파이프라인에서 Makefile은 자동화를 통해 빌드 및 테스트를 간소화하고, 효율적인 배포 프로세스를 설정하는 데 매우 유용합니다.


코드 작업 디렉토리로 이동해서, git pull을 이용해서 현재 메인 브렌치에 있는 값들을 받아올 것이다.

- 코드 작업 디렉토리 :

 

현재 메인 브렌치에는 gitlab ci에서 작업했던 gitlab ci yml 파일이 있을 것.

받아온 걸 확인까지 했다.

 

그리고 Makefile 까지 받아서 왔고, 수정해야 할 정보까지 입력했다.

 

좋다! 이제 make build 를 해보자!

저 뒤에 97a17f8 은, Makefile 안에서 3번째 줄에 보면,

Version:= ~~~ 하는 부분에서,

git rev-parse --short HEAD 라는 명령어를 터미널에 입력해보면 나오는 값이다.

docker images 를 확인해보면, 잘 생성된 걸 확인 가능하다.

 

make build 를 했으니, 이제 make push 를 하면 된다.


make push를 하니까 에러가 있었고, 그 에러를 고치기 위해 다른 작업들을 추가로 했어야 했고, 이제 돌고 돌아

아무튼 다시 make build 를 하고 make push 를 하니까 성공했다.

 

ECR에 들어가서 확인을 해보면, 제대로 된 걸 확인할 수 있다

 

이미지 태그가 2개가 붙어있다. 그 중 latest가 함께 붙어있는데, 굳이 나중에 배포를 할 때, 이미지 태그를 명시하지 않더라도 latest 태그가 붙은 가장 최근 이미지를 pull 해서 배포할 수 있도록 하기 위해서 latest 태그를 함께 붙여준 것.

 

자, 여기까지 Makefile 을 이용해서 어떻게 관리하는지 확인을 했다.

그러면 이거를 이제 make script를 gitlab 에서 호출하면 된다. 그 과정을 진행해보자.

 

gitlab에서 pipeline editor로 가보자.

수정을 해보자.

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

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  script:
    - echo "Docker build start"
    - make build
    - echo "Docker build complete."

push-job:       # This job runs in the build stage, which runs first.
  stage: build 
  script:
    - echo "Docker push start"
    - make push
    - echo "Docker push complete."

unit-test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  script:
    - echo "Running unit tests."
    - sleep 5 
    - echo "Unit tests complete."

lint-test-job:   # This job also runs in the test stage.
  stage: test    # It can run at the same time as unit-test-job (in parallel).
  script:
    - echo "Linting code... This will take about 10 seconds."
    - sleep 5 
    - echo "No lint issues found."

deploy-job:      # This job runs in the deploy stage.
  stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
  environment: production
  script:
    - echo "Deploying application..."
    - make deploy
    - echo "Application successfully deployed."

이거를 실행하기 전에, 일단 손 봐야 할 게, 아직 make deploy 는 만들어놓은게 없으니까 저거는 빼야 한다.

그리고 gitlab 에 아직 makefile 등이 올라가 있지 않다. 그러니까 올려놓고나서 pipeline을 실행해야 한다.

git push 까지 끝냈다. gitlab 확인해보자.

gitlab 에서, make deploy 부분은 빼고나서, pipeline commit changes 를 해보자.

성공!!