GitHub action 두번째 정리이다. 기초부터 보니 재미있기도 한것 같다.
공식 문서가 따로 있던데 참고해서 볼 생각이다.
공부는 DaleSeo 이분이 정리를 깔끔하게 잘해놨다. 핵심만 정리해두셨는데 거기서 또 내가 나중에 복습하기 위해서 핵심의 핵심만 따로 작성해 본다.
출처 : https://www.daleseo.com/github-actions-checkout/
워크플로우를 구성하다보면 반복적인 작업이 일어난다. 액션은 이런 반복의 단계를 재사용하기 용이하도록 하는 작업 공유 매커니즘이다.
GitHub Marketplace에서는 깃허브 뿐 아니라 다양한 업체들이 공개해놓은 액션을 받아서 사용해볼수 있다.
간단히 깃허브의 코드 저장소에 올려둔 코드를 CI 서버로 내려 받은 후에 특정 브랜치로 전환하는 행위이다.
깃허브에서는 이런 과정을 묶어서 액션으로 제공해주고 있다.
이 액션을 사용하면 매우 간편하게 코드 저장소로 부터 CI서버로 코드를 내려받도록 워크플로우를 구성할수 있다.
step키 하위의 uses 키에 사용하고자 하는 액션의 위치를 {소유자}/{저장소명}@{참조자} 의 형태로 명시하고 있다.
name: Our Workflow
on: push
jobs:
checkout:
runs-on: ubuntu-latest
steps:
- run: ls -al
- uses: actions/checkout@v3
//출처 : DaleSeo 블로그
이 코드에서 예시로 들면 steps - uses - actions/checkout@v3 를 작성하였다.
수행 내용은 대략 아래와 같다.
기존에는 CI 서버의 최상위 작업 디렉토리에 코드들이 받아졌는데 다른 경로에 받고 싶다면
Path 옵션을 사용하면 된다.
액션에 입력 파라미터를 넘길때는 with를 사용한다.
name: Our Workflow
on: push
jobs:
checkout:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
path: our-source
- run: ls -al
- run: ls -al our-source
our-source 라는 디렉토리에 코드가 받아진다.
default 값은 최신 상태의 코드만 받아오는 것이다. 만약 과거 내역이 필요하면 fetch-depth옵션을 사용한다.
기본값은 1이며, 0 으로 설정하면 전체 변경 이력을 불러온다.
name: Our Workflow
on: push
jobs:
checkout:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 3
- run: git log --pretty=oneline
3개의 커밋을 가져오도록 설정되어 있다.
공개된 저장소의 코드를 내려 받을때 유용하다. repository 옵션으로 소유자 / 저장소 명으로 저장소를 지정해주고
ref 옵션으로 브랜치명이나 태크명 또는 커밋 해시값을 지정해준다.
거의 잘 바뀌지 않는 파일들을 깃허브의 캐시에 올려놓고 CI 서버로 받을수가 있다.
나는 v2 버전을 활용하고 있는데 v3버전도 있다. 나 같은 경우에는 node modules를 캐시해놓고 있다.
- name: Cache node modules
uses: actions/cache@v2
id: cache
with:
path: node_modules
key: npm-packages-${{hashFiles('**/package-lock.json')}}
//github에서 제공하는 액션이다.
GitHub Actions의 hashFiles() 내장함수를 이용하여 package-lock.json 파일의 SHA 해시값을 키에 포함시켜 변경사항이 있을때는 키값이 바뀌게 해서 다시 캐싱하게 만든다.
캐시가 변경되었다면 key가 바뀌어서 캐시를 가져오지 못한다.
캐시가 있다면 캐시를 해서 정보를 내려받는다.
npm install 과정에서 20초 정도 절약할수 있었다.
npm install 과정까지 다 끝내면 캐시를 저장하는데 캐시가 있다면 저장하지 않았다.
캐시를 저장하면 이렇게 나온다
캐시를 저장하는데 0초이고 저장하지 않는다고 하면 5초가 걸리다니… 이게 무슨 상황인가.
캐시가 있는지 없는지 여부 값은
- if: steps.npm-cache.outputs.cache-hit == 'true'
run: echo 'npm cache hit!'
- if: steps.npm-cache.outputs.cache-hit != 'true'
run: echo 'npm cache missed!'
이렇게 처리할수 있다.
분기 처리를 해서 if구문에 맞게 다음 로직을 실행시킨다.