IT 역량/Git, Github

[Git/Gitea] Gitea Actions를 활용한 테스트 코드 실행 자동화 (2)

mingchin 2024. 11. 19. 17:19
728x90
반응형

지난 글에 이어서.. 시행착오를 정리한다.

 

Docker Compose를 기반 act_runner 활성화

지난 글에서는 act_runner binary를 다운 받고, 이를 직접 실행해 daemon을 활성화 하는 방식으로 Gitea와 연결해 테스트 코드를 실행했다. 하지만 이렇게 하면 매우 기본적인 실행들 외에는 많은 제약이 발생하고, 커스터마이징 하기가 쉽지 않다. (하나만 띄울 수 있고, 직접 daemon을 매번 재실행해야 하며, 관련 로그도 보기 어렵다 등등) 따라서 Docker compose를 활용해 act_runner를 컨테이너로 실행하는 것이 좋다.

 

Act_runner 설정 config.yaml 준비

act_runner generate-config > config.yaml

을 실행하여, confing.yaml을 생성하면 정말 많은 옵션들을 볼 수 있다.

 

대부분은 수정하지 않고 그냥 사용해도 무방하지만, 몇 가지 살펴볼 것들이 있다.

 

  • runner - labels
runner:
  labels: "label_name"

 

이 부분이 많이 헷갈렸는데, 그냥 내가 띄우고자 하는 act_runner의 별명을 지어준다고 생각하면 된다. 레이블을 활용해 특정 동작을 선택적으로 연결하고 실행할 수 있다. 여기 지정하는 값은, 실제 workflow 관련 yml 파일이나 이어 작성할 docker-compose.yml 내에도 연결하기 위해 동일하게 세팅해줘야 하는 값이므로 기억해두자.

1. Runner 분류: 여러 Runner를 운영할 때, 특정 Runner에만 워크플로를 실행시키고 싶을 때 사용합니다. 예를 들어, 테스트 환경용 Runner와 프로덕션 환경용 Runner를 분리하여 사용할 수 있습니다.
2. 작업 필터링: label은 runs-on 필드와 매칭되어 특정 Runner에서만 작업이 실행되도록 합니다.

 

  • runner - envs - DOCKER_REGISTRY_AUTH
runner:
  DOCKER_REGISTRY_AUTH: "~/.docker/config.json"

 

온프로미스 레지스트리 내 이미지를 활용해 Gitea Actions를 수행하고 싶은 경우 셋팅해줘야 한다. 이미 구축한 온프로미스 레지스트리에 로그인을 수행하게 되면 해당 경로에 자동으로 파일이 생성되며, 그 안에는 아래와 같은 형식의 텍스트가 저장돼 있다.

 

{
        "auths": {
                "my_ip:my_port": {
                        "auth": "MyAuThCodE="
                }
        }

 

Action을 수행하는 순간 도커 이미지를 pull하고 환경을 구축하도록 할 예정이기 때문에 필요한 부분!

 

  • container- valid_volumes
container:
  # If you want to allow any volume, please use the following configuration:
  valid_volumes:
    - '**'
  # valid_volumes: []

 

Actions를 수행할 컨테이너가 특정 경로를 볼륨으로 잡고 싶은 경우 설정한다. 주석에서 알 수 있듯 어떤 볼륨이든 따로 인자를 주어 잡을 수 있게 하려면 위의 옵션을, 그렇지 않으면 리스트에 직접 볼륨 잡을 목록들을 넣으면 된다. 

 

  • container- valid_volumes
container:
  # If it's empty, /workspace will be used.
  workdir_parent:

 

Actions를 수행할 컨테이너의 진입 working directory를 지정할 수 있다. 어차피 특정 레포지토리를 clone해서 사용할 것이라 나의 경우는 사용할 필요가 없었다.

 

docker-compose.yml 준비

version: '3'

services:
  act_runner:
    image: gitea/act_runner:latest
    container_name: gitea_act_runner
    privileged: true
    environment:
      CONFIG_FILE: /config.yaml
      GITEA_INSTANCE_URL: my_url # Gitea 서버 URL로 수정
      GITEA_RUNNER_REGISTRATION_TOKEN: MY_TOKEN_HASH # Gitea에서 생성된 액트 러너 토큰으로 수정
      GITEA_RUNNER_LABELS: label_name # 러너에 적용할 레이블 설정
      GITEA_RUNNER_NAME: runner_name # 러너 이름 설정
      GITEA_RUNNER_CAPACITY: 1 # 동시에 처리할 작업 수 (1은 기본값)
    restart: always
    volumes:
      # .runner file을 직접 보고 싶은 경우에만 활성화
      # - ./act_runner/data:/data
      - ./config.yaml:/config.yaml
      # 컨테이너 내에서 로컬 docker.sock을 사용하고 싶은 경우
      - /var/run/docker.sock:/var/run/docker.sock

 

기본 셋팅은 위와 같다. GITEA_RUNNER_REGISTRATION_TOKEN의 경우 지난 글과 동일한 방식으로 받아 오면 되고, GITEA_RUNNER_LABELS는 위의 runners - label 에서 지정한 "레이블 명"과 동일한 값을 사용해야 연결된다. volumes에 위에서 작성한 config.yaml을 act_runner 컨테이너가 바라볼 수 있도록 해준다. (아래와 같이 같은 depth에 존재할 때 기준이며, 다른 위치라면 경로에 맞게 수정)



# act_runner 실행
docker compose up -d

# 컨테이너 로그 확인
docker logs -f gitea_act_runner

# act_runner 내리기
docker compose down

 

관련해 문제가 발생하면 logs를 통해 확인할 수 있다. Gitea GUI의 Settings - Actions - Runners 에서 "idle"로 활성화 된 runner가 있어야 한다.

Workflow 실행을 위한 준비

Gitea는 기본적으로 ubuntu:latest 이미지를 활용해 테스트를 수행하지만, 나는 온프로미스에 따로 구축해둔 "my_image"를 활용해 테스트를 수행해야 하는 상황이었다. 

name: Test Workflow

on:
  push:
    branches:
      - feat/gitea-actions

jobs:
  test:
    runs-on: label_name
    container:
      image: my_image:latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2  # 레포지토리의 변경 사항을 가져옴
        token: ${{ secrets.PAT }}
      - name: AdaptModel
        run: python builder.py

 

위의 샘플 코드를 실행하기 위해 필요한 단계는 아래와 같다.

 

1) 테스트 용 이미지 내 필수 패키지 설치(Node.js, git)

이미지를 구성하다보면 layer를 최소화 하다보니 일반적으로 있을만한 패키지들이 자주 누락된다. 위의 steps 중 "Checkout code"에 해당하는 부분은, git으로 Gitea 레포지토리에 접근하여 현 브랜치(feat/gitea-actions)의 변경 사항을 clone 해오는 역할을 한다. 이는 Github Actions의 호환 런타임인데, Node.js를 필요로 한다. 따라서 두 패키지를 이미지 내에서 활용 가능하도록 설치해주어야 한다.

# Install Node.js & git (minimal stage)
RUN curl -fsSL https://rpm.nodesource.com/setup_16.x | bash - && \
    dnf install -y nodejs git  && \
    dnf clean all

 

2) git clone을 위한 토큰 설정

위 clone 과정을 위해, Gitea에 로그인하는 과정이 필요할 수 있다. ID/Passwd로 레포지토리에 대한 접근을 허용하는 경우, Settings - Actions - Secrets에 이를 사전 지정하여 코드에 ID/Passwd를 노출하지 않고 안전하게 접근할 수 있다.

"username:password" 형식으로 입력해두고, token: ${{ secrets.PAT }} 를 추가하면 된다.

 

3) 실행 코드 넣기

여기까지 진행하면, 작업 브랜치(feat/gitea-actions)에 push를 하는 순간 "my_image:latest"를 이용해 컨테이너를 띄우고, gitea 레포지토리에 사전 정의된 ID/Passwd로 로그인 후 clone을 수행해 작업 브랜치와 동일한 소스코드를 가진다. 따라서 해당 소스코드에 대해 테스트 하고 싶은 내용들을 순차적으로 "name/run"의 쌍으로 넣어주면 된다.

 

이때 컨테이너 내에서 컨테이너를 띄우는 것이 물리적으로 가능은 하지만.. 기본적으로 각 "name/run" 쌍의 프로세스가 정상 종료되었는지 여부로 Actions 탭에서 성공 실패를 띄워주기 때문에, 이 부분을 유의해서 각 단계를 설정해야한다.

 

몇 번의 시행착오 끝에..! 이제 정말 유효한 테스트 코드들을 구성하고, 작업마다 정상 동작하는지 여부를 체크하도록 하는 일만 남았다.

728x90
반응형