파이프라인을 작성을 해봤고 어떻게 작동하는지도 확인해봤다.
이제는 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는 타겟의 종속성을 확인하고, 필요한 경우에만 작업을 실행해 효율적입니다.
동작 원리
- make는 Makefile을 읽습니다.
- 사용자가 요청한 타겟의 종속성을 확인합니다.
- 필요하다면 종속 타겟부터 먼저 실행합니다.
- 명령어를 순서대로 실행합니다.
3. CI/CD 파이프라인에서 Makefile과 make
CI/CD 파이프라인에서는 반복 작업을 자동화하기 위해 Makefile을 사용할 수 있습니다. 주요 활용 사례는 다음과 같습니다:
- 빌드 자동화: 소스 코드를 컴파일하고 패키징.
- 테스트 실행: 유닛 테스트, 통합 테스트 자동화.
- 배포 작업: 특정 환경에 애플리케이션 배포.
예시: 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 를 해보자.
성공!!