문제점

AWS ECS 클러스터 인프라 인스턴스 유형을 amd64에서 arm64로 변경 후, GitActions에서 배포가 되지 않는 상황이 발생했다.

 

GitActions에서 제공하는 기본 러너 환경이 X86_64 우분투 서버라, 해당 서버에서 빌드한 이미지는 arm64 인스턴스에서 실행을 할 수가 없었다.

 

따라서 배포할 인스턴스 아키텍쳐에 맞게 GitActions에 여러가지 시도를 해보았다.

 

1.  워크플로우 yml 파일의 도커 이미지 빌드 과정에서 docker buildx로 멀티플랫폼 이미지 빌드

워크플로우 yml에 Docker buildx 환경 설정
하단 명령어에 --platform 플래그를 설정해주고 이미지 아키텍처를 설정

위의 방법으로 빌드 시점에 이미지 플랫폼을 설정해주었지만...

 

이상하게도 워크 플로우 내에서 이미지 빌드 자체가 되지 않는 문제가 발생했다..

 

다음 방법으로 넘어가보자.

 

2. GitActions 러너 환경 자체를 arm64로 변경하기

Git에서는 GitActions의 런타임 환경레포지토리 별로 다른 서버를 호스팅해 사용 가능하게 지원한다. (기본적으로는 Ubuntu)

 

실행 가능한 환경은 MacOS, Linux, Windows 셋 다 가능하며 설정법은 꽤나 간단하다.

 

먼저, 레포지토리의 Settings에 접근 후, 좌측 메뉴의 Actions - runners 탭에 들어간다.

리눅스 뿐 아니라 다른 OS도 지원하는 모습. macOS도 x64, arm64 지원.
필자의 경우는 배포할 서버의 환경에 맞게 설정해주었다.

위와 같이 설정을 하게 되면 (접근 가능한) 서버에서 실행할 명령어를 보여주게 된다.

 

런타임을 제공할 해당 서버에 접속 후, 하단에 나오는 명령어를 차례대로 입력 하면 된다.

( 본인은 배포 환경에 맞는 도커 이미지를 맞춰주기 위해 arm64 EC2 인스턴스를 사용했다. )

 

 

Download Step

# Create a folder
$ mkdir actions-runner && cd actions-runner

# Download the latest runner package
$ curl -o actions-runner-linux-arm-2.307.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.307.1/actions-runner-linux-arm-2.307.1.tar.gz

# Extract the installer
$ tar xzf ./actions-runner-linux-arm-2.307.1.tar.gz

각 명령어들이 성공 되었으면 actions-runner 디렉토리에 다음과 같은 파일들이 생성 되어 있는 모습을 볼 수 있다.

 

Configure Step

# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/USER_NAME/REPOSITORY_NAME --token TOKEN

# Last step, run it!
$ ./run.sh

참고로 Git에서 EC2 서버로 접속하는 방식이 아닌 EC2 서버에서 GitHub 저장소로 접속하는 방식이다.

 

그래서 /USER_NAME/REPOSITORY_NAME 필드는 해당 github 저장소 주소,

--token TOKEN 액세스 토큰으로 설정해줘야 한다.

 

또한 위의 config.sh 스크립트를 실행할 때

 

해당 에러를 마주칠 수 있다. 이 에러는 GitHub Actions Runner가 실행 중에

 

ICU (International Components for Unicode) 패키지를 찾지 못해 발생하는 문제이다.

 

ICU는 국제화 및 지역화를 지원하는 라이브러리로, GitHub Actions Runner가 이를 사용하지 못하면 오류가 발생 할 수도 있다.

 

호옹...그렇다고 한다...

어찌됐든 해당 에러는 ICU 패키지를 찾지 못해서 발생하는 문제이므로 ,

 

해당 라이브러리는 현재 configuration 과정에서 필요 없으므로 이를 무시하는 옵션을 넣고 실행하면 된다.

 

DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true ./config.sh --url [저장소 주소] --token [토큰]

위의 스크립트가 성공적으로 실행되면 , 아래와 같이 Connected to GitHub 메시지를 볼 수 있다.

 

 

 

마지막으로 runner를 실행 시키는 스크립트 까지 실행해보자

DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true ./run.sh

성공적으로 서버에서 GitHub로 연결된 모습이며,

이때 action - runner 프로세스는 Job(Actions에서 발생한 워크플로우)을 Listening 상태로 대기하게 된다.

다시 Actions - Runner 탭에 들어가서 확인해보면 해당 레포지토리에 self-hosted runner 잘 등록되어 있는 걸 볼 수 있다.

 

runner Status가 정상인 걸 확인했으면 워크플로우 yml 파일을 다음과 같이 수정해주자.

jobs:
  deploy:
    name: Deploy
    runs-on: self-hosted
    environment: production
  • runs-on : 요 부분을 위에서 등록한 서버의 태그를 달아주면 된다. (만약 등록한 러너가 하나라면 self-hosted만 달아줘도 된다)
  • 만약 여러 개의 러너를 등록한 경우에는 등록한 러너의 태그에 따라
  • runs-on : [ self-hosted, Other(러너 목록의 해당 태그) , Other(러너 목록의 해당 태그) ]
    이런 식으로 세부적으로 분리도 가능하다.

 

이 후 , GitActions에서 워크 플로우를 실행 시킨 후, 연결된 서버에 접속하면,

해당 job이 워크플로우 순서대로 성공적으로 실행되고, 성공하는 모습을 볼 수 있다.

(이거이거...깃액션에서 도커 레이어 캐시도 더 잘 될지도..?)

ref : 

https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners

+ Recent posts