본문으로 바로가기

Github action 로컬에서 테스트 해보기

category ETC/Git 2022. 9. 1. 23:39
728x90
반응형

개요

github action을 사용하는데 매번 commit 찍고 push 날리고 action탭에서 build 잘 되는지 확인하고 이러한 과정을 겪다 보니 로컬에서 디버깅하듯 돌릴 수 있는 방법이 없을까 하다가 act라는 tool을 알게 됐다. 웬만한 건 document에 다 나와 있으니 그때 그 때 참고하면 되겠지만 또 막상 필요한 건 잘 안 보인다. act를 쓰면서 trouble shooting 했던 것 위주로 작성하려 한다.


Docker Build 하기

act에서 Docker를 사용하려면?

Project에 Dockerfile이 포함된 경우 이를 빌드한 뒤  후속 작업을 수행해야 된다. 허나 순수하게 act만 설치해서는 되지 않았다. 이에 대해 다음과 같은 로그가 찍히는 상황이다.

🚀  Start image=node:16-buster-slim
   🐳  docker pull image=node:16-buster-slim platform= username= forcePull=false
   🐳  docker create image=node:16-buster-slim platform= entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
   🐳  docker run image=node:16-buster-slim platform= entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
 ⭐ Run Main Checkout
   🐳  docker cp src=/home/ubuntu/private/**/PROJECT/. dst=/home/ubuntu/private/**/PROJECT
 close /tmp/act1535790957: file already closed
   ✅  Success - Main Checkout
 ⭐ Run Main Build, tag, and push image to PROJECT_ACTION
   🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/build-image] user= workdir=
| /var/run/act/workflow/build-image: line 3: docker: command not found
   ❌  Failure - Main Build, tag, and push image to Amazon ECR
 exitcode '127': command not found, please refer to https://github.com/nektos/act/issues/107 for more information
 🏁  Job failed

해당 로그에 찍힌 링크를 열어보니 act를 실행할 때 다른 이미지를 지정해서 실행하라는 내용이 보였다. 더 찾아보니 누군가 act에 대한 custom image를 작성해 이를 github에 공개해놓은 것이 있었다 https://github.com/lucasctrl/act_base를 참고하여 act를 다음과 같이 실행하니 해결되었다.

$ sudo act  -P ubuntu-latest=lucasalt/act_base:latest

결과는 다음과 같이 성공한다.

🚀  Start image=lucasalt/act_base:latest
    🐳  docker pull image=lucasalt/act_base:latest platform= username= forcePull=false
    🐳  docker create image=lucasalt/act_base:latest platform= entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
    🐳  docker run image=lucasalt/act_base:latest platform= entrypoint=["/usr/bin/tail" "-f" "/dev/null"] cmd=[]
  ⭐ Run Main Checkout
    🐳  docker cp src=/home/ubuntu/private/**/PROJECT/. dst=/home/ubuntu/private/**/PROJECT
  close /tmp/act1955925170: file already closed
    ✅  Success - Main Checkout
  ⭐ Run Main Build, tag, and push image to PROJECT
    🐳  docker exec cmd=[bash --noprofile --norc -e -o pipefail /var/run/act/workflow/build-image] user= workdir=
Sending build context to Docker daemon   1.04MBkB
| Step 1/4 : FROM python:3.8-slim
|  ---> bdd3315885d4
| Step 2/4 : COPY . /app
|  ---> Using cache
|  ---> fea54cb8aebb
| Step 3/4 : WORKDIR /app
|  ---> Using cache
|  ---> a79611ebc978
| Step 4/4 : CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]
|  ---> Using cache
|  ---> 593e9172ae44
| Successfully built 593e9172ae44
| Successfully tagged test:latest
    ✅  Success - Main Build, tag, and push image to Amazon ECR
  🏁  Job succeede

 

Python 사용하기 

act에서 python을 사용하려면?

일반적인 github action에서 python 사용에 대한 참고 steps은 다음과 같다.

- name: Python Setup
	uses: actions/setup-python@v4
  	with:
    	python-version: '3.8'

위와 같이 설정하고 act를 실행할 경우 다음과 같은 Error 발생했다

:error::Version 3.8 with arch x64 not found%0AThe list of all available versions can be found here: https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json

에러를 읽어보니 호환성 혹은 의존성 문제인 것 같은데 아래 steps을 Python Setup 전에 설정해줌으로써 해결 가능했다.

  - run: |
      # Hack to get setup-python to work on act
      if [ ! -f "/etc/lsb-release" ] ; then
        echo "DISTRIB_RELEASE=18.04" > /etc/lsb-release
      fi

참고한 이슈는 이곳이다. https://github.com/nektos/act/issues/251

 

pip install에 대한 broken permission

pip를 통해 어떤 라이브러리를 설치하게 될 때 발생하는 문제였는데 아래 메시지를 뿜으며 일어난 현상이다.

::error::WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

Docker를 build 할 때 act를 사용했던 방법으로 해결 가능했다.


 

Secrets 사용하기

repository에서 설정하는 secrets을 act에서 사용하기

github repository에서 secrets에 환경변수를 설정하고 이를 github-action이 수행하는 과정에서 불러들여 사용하는 경우가 있다. 이는 act에서 다음과 같은 방법으로 시뮬레이션할 수 있다.

우선 my.secret라는 이름의 파일 생성하고 해당 내용은 다음과 같이 작성한다.

# my.secret
KEY1=VALUE
KEY2=VALUE

이후 act에서 해당 my.secret 파일을 사용할 수 있는 '--secret-file' 옵션을 이용하면 된다.

$ sudo act —secret-file my.secret

 

Github Evenv 사용하기

github.event 에서 사용할 수 있는 컨텍스트를 사용하기

github action에서 해당 pr 또는 커밋을 기준으로 다음과 같은 환경변수를 사용할 수 있다.

${{ github.event.head_commit.message }}

이는 해당 pr의 commit message 정보 url 정보 기타 등등 github document에 나와있는 정보였는데 act에서 json 파일을 만든 뒤 --eventpath 옵션을 이용하는 것으로 시뮬레이션 할 수 있었다.

act --eventpath event.json

event.json의 내용은 https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads 의 Webhook Payload Example 부분을 참고하자


기타

  • 사용하다 보니 어느 순간에 API 요청 제한이 걸린 것이 눈에 띄었다. 시간당 60회 정도의 요청만 받는다고 한다. (로컬에서 테스트하는데?)
  • 요청 수를 늘리려면?

 

 

 

728x90
반응형