home

YML과 github actions

글 분류
sub
키워드
github actions
생성일
2023/01/12 04:14
최근 수정일
2023/02/05 04:21
작성중
디자인 적용 및 컨펌 후 디자인 재적용
액션 공식문서 공부중
NextJS 13 - React18 업데이트
성능개선 방식 조사중

TLDR;

yaml을 알고 액션을 만져야지
물론 yaml을 몰라도 만질 순 있음 → 지금까지 yaml 파일 모르고 github actions 만져왔으니..
하지만 해당 코드에 대한 이해도가 많이 떨어짐 - 재대로된 코드를 짜는게 아닌 돌아가는 코드를 짜게됨

yaml 기본 문법

workflow

한개이상의 job을 실행하는 설정 가능한 자동화 프로세스
YAML 파일로 설정되어있음
이벤트 발생 시 자동실행 또는 수동 실행, 설정한 스케쥴에 따라 실행되도록 설정 가능
리포지터리의 .github/workflows 파일에 설정되어 있음

기본

하나 이상의 이벤트가 workflow를 trigger
하나 이상의 jobs가 runner machine에서 일련의 하나 이상의 steps를 실행

expression

값을 참조하기 위한 표현식 → ${{}}으로 표현
if에서 사용할 경우 ${{}}를 사용하지 않아도 됨 → if가 있을경우 github actions에서 알아서 표현식으로 이해하므로

Literals

env: myNull: ${{ null }} myBoolean: ${{ false }} myIntegerNumber: ${{ 711 }} myFloatNumber: ${{ -9.2 }} myHexNumber: ${{ 0xff }} myExponentialNumber: ${{ -2.99e-2 }} myString: Mona the Octocat myStringInBraces: ${{ 'It''s open source!' }}
YAML
복사
boolean - true/ false
null - null
number - json에서 사용할수 있는 모든 number 형
string
${{}}로 감싸지 않아도됨
감싸야할 경우 필수적으로 ``로 감싸줘야함
“”으로 감쌀경우 에러발생

operators

(), [], ., !, <, ≤, >, ≥, ==, ≠, &&, || → 자세한 설명은 생략한다.
깃헙은 기본적으로 이중등호를 사용, 느슨한 비교 (타입이 변환됨)
NaN과 NaN을 이중등호로 비교 시 true는 나오지 않음
깃헙에서 문자열 비교 시 대문자, 소문자는 무시하고 비교함
Objects, arrays는 같은 인스턴스를 비교할때만 동일 취급받음

functions

contains( search, item )

대소문자 구분하지 않음
값을 string으로 형변환 하여 함수 실행
search가 배열, item은 문자열 일 경우 → search 배열의 요소가 item에 해당될경우 true 반환
search, item 둘다 문자열인 경우 → item이 search의 substring인 경우 true 반환
github.event_name == "push" || github.event_name == "pull_request" contains(fromJSON('["push", "pull_request"]'), github.event_name)
YAML
복사

startsWith( searchString, searchValue )

startsWith('Hello world', 'He') # true
YAML
복사
searchString이 searchValue로 시작하면 true 반환, endsWith는 끝나는 문자열 검색

format

format('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat') # Hello Moan the Octocat format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat') # `{Hello Mona the Octocat!}‘
YAML
복사
변수로 문자열을 만드는 함수

join

join(github.event.issue.labels.*.name, ', ') #'bug, help wanted'
YAML
복사
배열의 요소들을 문자열로 만들어주며 기본으로 ,를 이용해 연결함 두번째 파라미터가 입력되지 않을 경우 기본으로 ,

toJson

배열은 JSON 형태 문자열로 변형

fromJson

name: build on: push jobs: job1: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - id: set-matrix run: echo "matrix={\"include\":[{\"project\":\"foo\",\"config\":\"Debug\"},{\"project\":\"bar\",\"config\":\"Release\"}]}" >> $GITHUB_OUTPUT job2: needs: job1 runs-on: ubuntu-latest strategy: matrix: ${{ fromJSON(needs.job1.outputs.matrix) }} steps: - run: build name: print on: push env: continue: true time: 3 jobs: job1: runs-on: ubuntu-latest steps: - continue-on-error: ${{ fromJSON(env.continue) }} timeout-minutes: ${{ fromJSON(env.time) }} run: echo ...
YAML
복사
환경 변수 string을 값으로 변환할때 사용하는 변수

hashFiles

hashFiles('**/package-lock.json', '**/Gemfile.lock')
YAML
복사
파일 해싱, 여러개의 인자 전달 가능

success, always, cancelled

success - 항상 적용되어있음, 전 스텝이 성공해야 다음스텝 실행
always - 항상 실행함
cancelled - 취소됐을때 실행
failure - 실패했을때 실행함

Object filters

[ { "name": "apple", "quantity": 1 }, { "name": "orange", "quantity": 2 }, { "name": "pear", "quantity": 1 } ] fruits.*.name # [ "apple", "orange", "pear" ]
YAML
복사
{ "scallions": { "colors": ["green", "white", "red"], "ediblePortions": ["roots", "stalks"], }, "beets": { "colors": ["purple", "red", "gold", "white", "pink"], "ediblePortions": ["roots", "stems", "leaves"], }, "artichokes": { "colors": ["green", "purple", "red", "black"], "ediblePortions": ["hearts", "stems", "leaves"], }, } vegetables.*.ediblePortions # [ ["roots", "stalks"], ["hearts", "stems", "leaves"], ["roots", "stems", "leaves"], ]
YAML
복사

Contexts

없는 property 참조 시 - string
github[”sha”]나 github.sha 형태로 참조가능

job vs jobs vs needs

job
현재 실행 중인 job의 문맥
jobs
재사용 가능한 workflow에서만 사용가능한 문맥
needs
현재 실행중인 job의 의존성을 가진 선행 job의 문맥

variables

Non-sensitive 설정 정보를 저장하는 방법
name: Greeting on variable day on: workflow_dispatch env: DAY_OF_WEEK: Monday jobs: greeting_job: runs-on: ubuntu-latest env: Greeting: Hello steps: - name: "Say Hello Mona it's Monday" if: ${{ env.DAY_OF_WEEK == 'Monday' }} run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!" env: First_Name: Mona
YAML
복사
같은 이름의 variable이 있을 경우 제일 가까운 variable이 우선권을 가짐
variable은 runner pc에 전달되므로 github actions 자체에는 접근 권한이 없음 → actions에서 사용하려면 env context로 접근해서 사용해야함

workflow에 step, jobs간 값 전달 방법

echo "{environment_variable_name}={value}" >> $GITHUB_ENV
Bash
복사
환경변수를 GITHUB_ENV파일로 바로 업데이트 함 → 결과값을 다른 step이나 jobs에서 참조 가능
steps: - name: Set the value id: step_one run: | echo "action_state=yellow" >> $GITHUB_ENV - name: Use the value id: step_two run: | echo "${{ env.action_state }}" # This will output 'yellow'
YAML
복사
jobs: job1: runs-on: ubuntu-latest # Map a step output to a job output outputs: output1: ${{ steps.step1.outputs.test }} output2: ${{ steps.step2.outputs.test }} steps: - id: step1 run: echo "test=hello" >> $GITHUB_OUTPUT - id: step2 run: echo "test=world" >> $GITHUB_OUTPUT job2: runs-on: ubuntu-latest needs: job1 steps: - run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}
YAML
복사
job output에 바로 삽입하는 법

artifect

job간 파일 공유 하는 방법
jobs: example-job: name: Save output steps: - shell: bash run: | expr 1 + 1 > output.log - name: Upload output file uses: actions/upload-artifact@v3 with: name: output-log-file path: output.log
YAML
복사
아티팩트 업로드
jobs: example-job: steps: - name: Download a single artifact uses: actions/download-artifact@v3 with: name: output-log-file
YAML
복사
아티팩트 다운로드

matrix

matrix가 무엇인가

특정 케이스에 exclude 필요 시

name: what is matrix on: push # 모든 job에서 참조할 수 있는 환경 변수 env: WF_ENV: Available to all jobs jobs: trymatrix: runs-on: ubuntu-latest strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] node_version: [6, 8, 10] steps: - name: Log Env # 해당 step에서만 참조가능한 환경변수 env : step ENV run: | echo "environment ${{WF_ENV}}" echo "environment ${{JOB_ENV}}" # 시크릿키 참조하는 법 echo "${{secrets.github_secrets}}"
YAML
복사

단편적인 정보들

디버깅 로그 설정

Secrets에 ACTIONS_STEP_DEBUG 값을 true로 설정
더 자세한 디버그 로그 검색 가능

다른 쉘 사용하기

jobs: run-shell-command: runs-on: ubuntu-latest steps: # 기본 쉘인 bash로 동작 -name: echo a string run: echo "hello world" # python에서 코드 실행 -name: python command run: | import platform print(platform.processor()) shell: python
YAML
복사

다른 사람이 작성한 액션 사용하기

# 생략 steps: - name: 모바일 preview url 대기 uses: patrickedqvist/wait-for-vercel-preview@v1.2.0 id: waitForGochoMobileURL with : parameter: hi - name : log greating time run: echo "${{steps.waitForGochoMobileURL.outputs.time}}" # 생략
YAML
복사
커밋이나 브랜치를 @이후에 붙여놓기로 사용 할 수 있음
항상 특정 브랜치로 고정하진 말자! → 버전관련 이슈가 발생할 수 있음
특정 step을 참조하기 위해선 id가 선언되어야 함
with로 해당 액션에 파라미터 입력 가능
사용하는 actions에 대한 출력값은 ${{참조하고자하는 값}}으로 사용할 수 있으며 출력값은 문서의 outputs에서 확인할 수 있음

checkout action

# 생략 steps: - name: 리포지터리 코드 가져오기 uses: actions/checkout@3
YAML
복사
기본적으로 깃헙은 디렉터리에 리포지터리에있는 파일들을 추가하지 않음
깃헙 공식 action

Scheduler

name: scheduler test on: schedule: # 매 1분 마다실행 - 11:01, 12:01, 13:01 - cron: "1 * * * *" steps: - name: 리포지터리 코드 가져오기 uses: actions/checkout@3
YAML
복사

event filtering

name: scheduler test on: push: branches: - main - "feature/*" # feature에 해당하는 브랜치가 push 됐을때 전부실행 하지만 feature/featC가 왔을땐 실행하지 않는다 - "!feature/featC" paths: # js 파일이 변경 됐을 때만 해당 액션 실행 - "**.js"
YAML
복사
해당 브랜치에 이벤트 발생했을 떄 또는 파일이 변경됐을 때만 실행하고 싶을 때
!가 붙었을 땐 해당 이름의 이벤트는 제외
name: scheduler test on: push: branches-ignore: # feature/featA, feature/featB 매치됨 # feature/directory/a는 매치되지 않음 - "feature/*" # feature/featA, feature/featB, feature/directory/a 전부 매치됨 - "feature/**"
YAML
복사
branches, tags, paths모두 ignore할 수 있음
branches와 branches-ignore은 둘중 하나만 사용할 수 있음