개요
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회 정도의 요청만 받는다고 한다. (로컬에서 테스트하는데?)
- 요청 수를 늘리려면?
- 시간 요청 제한이 있기 때문에 github 토큰을 만들어 환경변수에 넣고 사용하면 된다고 한다.! (https://github.com/nektos/act/issues/233)
'ETC > Git' 카테고리의 다른 글
Private Repository의 Permanent URL에 접근할 경우 (0) | 2024.09.15 |
---|---|
.gitignore 적용 & .gitignore online generator (0) | 2022.11.21 |
Commit Message에 대한 정리 (0) | 2022.11.19 |
[Git] 저장소 초기화와 압축 (0) | 2021.01.12 |
dyld: Library not loaded: /usr/local/opt/gettext/lib/libintl.8.dylib (0) | 2020.11.14 |