디자인 적용 및 컨펌 후 디자인 재적용
액션 공식문서 공부중
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은 둘중 하나만 사용할 수 있음