네이버 이웃 추가 / GitHub Profile / 카카오톡 채널 추가 / 방명록 / 이용 안내

[GitLab]2. GitLab CI/CD로 C언어 컴파일하기(GitLab SaaS, 온라인)

수성컴 | 2023. 04. 04.
[GitLab]2. GitLab CI/CD로 C언어 컴파일하기(GitLab SaaS, 온라인)

※스크린샷을 띄엄띄엄 찍어서 사진 간에 모순이 있을 수 있는 점 양해 부탁드립니다.

수성컴전자방입니다. GitLab은 CI/CD 기능이 강력하여 온라인으로 컴파일을 진행할 수 있습니다. 오늘은 그 방법을 알아보겠습니다.
참고로 제가 말한 GitLab 온라인 = GitLab 웹 = GitLab SaaS = GitLab.com 입니다.
그리고 온라인에서 진행하는 경우 Shared Runner를 사용하게 됩니다.

목차

1. [GitLab]GitLab에 project 생성하고 파일 올리기

2. GitLab CI/CD로 C언어 컴파일하기(GitLab 웹, SaaS)(현재 글)
2.1. GitLab CI로 C언어 컴파일
2.2. 글 마무리
2.3. 참고 자료

2.1. GitLab CI로 C언어 컴파일

2.1.1. 먼저 GitLab에 Project를 만들고 hello.c를 넣어 주었습니다.

#include <stdio.h>

int main(void){
    printf("Hello, world!\n");

    return 0;
};

GitLab-project
2.1.2. Project에서 CI/CDPipelines로 들어갑니다.

Get started with GitLab CI/CD
2.1.3. 여기서 C++ Templete을 이용하셔도 되지만, 저는 Try test templete을 기반으로 .gitlab-ci.yml 파일을 만들어 보겠습니다.
참고로 templete은 https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates에서도 보실 수 있습니다.

VScode
2.1.4. 아래 내용대로 .gitlab-ci.yml을 만들어 git 저장소의 최상위 경로에 둡니다.

image: gcc

before_script:
  - echo "job 실행. 이건 여러분들께 before_script를 보여드리려고 넣은 문구입니다."

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

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  script:
    - gcc hello.c
  artifacts:
    expire_in: 1 days
    paths:
      - a.out
      # depending on your build setup it's most likely a good idea to cache outputs to reduce the build time
      # cache:
      #   paths:
      #     - "*.o"


test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  script:
    - ./a.out

[Line 1 image]
image: gcc
우측 부분에는 Docker official image 이름을 넣습니다. 지금은 C언어 컴파일을 할 것이기 때문에 gcc를 넣었습니다.
https://hub.docker.com/search?image_filter=official&type=image&q=로 들어가신 후
docker-image-site
검색을 활용하시면 원하는 Docker 이미지를 찾으실 수 있습니다. 운영체제는 기본적으로 Linux라고 생각하시면 됩니다.

[Line 3~4 before_script]
before_script는 각 stages가 실행될 때 먼저 실행될 명령어입니다.

[Line 6~8 stages]
stage 실행 순서를 정합니다. 위의 예제에서는 build가 모두 끝난 후 test가 진행되도록 되어 있습니다.

[Line 10~21, Line 24~27]
build-job, test-job은 제가 임의로 정한 이름입니다. Line 10~21과 Line 24~27은 각각 하나의 job입니다. 각 job마다 가상머신을 하나씩 사용한다고 생각하시면 되겠습니다. 계속해서 설명 드리겠습니다.

[Line 11 stage]
stage: build
해당 job(build-job)이 어느 stage에 속해 있는지 정합니다.

[Line 12~13 script]
해당 job(build-job)에서 실행될 명령어입니다. 예제에서는 gcc hello.c가 실행되도록 했습니다.

[Line 14~21 artifacts]
컴파일 결과물을 저장하는 부분입니다. 저장하지 않으면 해당 job 실행 후 삭제됩니다. 각 job마다 가상머신을 하나씩 사용하므로 이 부분이 필요합니다.
15행 expire_in: 1 days는 저장하는 파일이 다음 CI 진행 후 하루까지 저장된다는 뜻입니다.(다음 CI를 진행하지 않으면 계속 저장되어 있습니다.)
16~17행 paths에는 저장할 파일의 경로를 적습니다. 예제에서는 a.out을 저장합니다.

그 다음 Line 24~27 test-job에서 ./a.out을 실행하게 됩니다.

2.1.5. .gitlab-ci.yml을 GitLab Project에 업로드(push)합니다. 그러면 자동으로 GitLab CI가 작동합니다.

Pipeline failing
GitLab CI를 처음 진행하는 경우 실패가 일어납니다. Validate your account를 클릭합니다.

Validate user account
본인 카드정보로 계정을 검증해야 합니다. 무료 서비스를 사용하면 결제는 일어나지 않습니다.(적은 금액이 결제된 후 즉시 환불됨.)

Run pipeline 클릭
Run pipeline을 클릭합니다.

Run pipeline
2.1.6. Run pipeline을 클릭합니다.

Pipelines
(저는 이 글을 쓰기 전 테스트를 많이 해봤으므로 스크린샷에 Pipeline이 많습니다. 처음 해 보시면 Pipeline이 1~2개 정도만 있을 것입니다.)
2.1.7. CI/CDPipelines에서 진행 현황을 보실 수 있습니다. 그리고 #으로 시작하는 숫자(?)를 클릭하시면 더 구체적인 현황을 보실 수 있습니다.

gitlab ci
2.1.8. job을 클릭하시면 해당 job의 터미널 화면을 보실 수 있습니다.

Job build-job
2.1.9. gcc 이미지로 실행된 것을 보실 수 있습니다. before_script와 script가 실행되었고, artifacts로 설정한 a.out이 업로드되었습니다.
2.1.10. 오른쪽 Job artifacts에서 a.out 파일을 내려받을 수도 있습니다. 참고로

Job artifacts
다른 GitLab CI가 실행되면 이전 CI의 artifacts는 삭제까지 남은 시간이 얼마인지 나옵니다.

Job test-job
2.1.11. 예제에서 그 다음 job으로 설정했던 test-job을 보겠습니다. before_script와 script가 실행되었습니다. script에서 지정한 대로 ./a.out이 실행되었습니다.

2.2. 글 마무리

제 글을 읽어 주셔서 감사합니다. 다음에 만나요!

2.3. 참고 자료

1) Infograb. n. d. “GITLAB CI WORKSHOP”, Infograb. (2023. 04. 04. 방문). https://workshop.infograb.io/gitlab-ci/11_introduction-to-gitlab-cicd/4_quick_start_gitlab_ci_cd/
2) sanggeun.choi. 2021. “[Gitlab] CI/CD Pipeline 사용하기”, Be OK. (2023. 04. 04. 방문). https://sg-choi.tistory.com/552
3) JMYL. 2016. “Gitlab CI 시작하기”, JMYL’s Blog. (2023. 04. 04. 방문). https://jmyl.gitlab.io/post/git/quick-start-gitlab-ci/
4) 박금주. 2021. “어느날 갑자기 배포가 되지 않았다.”, 사람인 기술 블로그. (2023. 04. 04. 방문). https://saramin.github.io/2021-11-09-gitlab-runner/
5) 이민지. 2021. “.gitlab-ci.yml 작성”, minji104.log. (2023. 04. 04. 방문). https://velog.io/@minji104/.gitlab-ci.yml-%EC%9E%91%EC%84%B1#gitlab%EC%97%90%EC%84%9C-gitlab-ciyml-%EC%84%A4%EC%A0%95
6) GitLab. n. d. “.gitlab-ci.yml keyword reference”, GitLab Docs. (2023. 04. 04. 방문). https://docs.gitlab.com/ee/ci/yaml/index.html#image
7) allroundplayer. 2017. “GitLab Container Registry 활성화 하기”, 올챙이시절 기록소. (2023. 04. 04. 방문). https://allroundplaying.tistory.com/31
8) 짱구네. 2022. “Gitlab-runner 를 활용한 CI/CD 구성 (Gitlab + Gitlab-runner)”, 짱구의 삽질 블로그. (2023. 04. 04. 방문). http://may9noy.tistory.com/974
9) Aram. 2022. “GitLab CI/CD”, 너무 시끄러운 고독. (2023. 04. 04. 방문). https://iceteade.tistory.com/146
10) Dabrule 외. 2022. “Is it possible to configure GitLab.com’s default shared runners?”, stackoverflow. (2023. 04. 04. 방문). https://stackoverflow.com/questions/73804737/is-it-possible-to-configure-gitlab-coms-default-shared-runners