2. Github Actions์ ๋ค์ํ ๊ธฐ๋ฅ
1. checkout
- github repository๋ฅผ ๊ฐ์ ธ์์ ์์ ์ ์ํํ ์ ์๋๋ก ํ๋ ์ก์
- ๋ง์ผํ๋ ์ด์ค ๊ณต์ ์ก์
- ํ์ํ ํ ์คํธ๋ ๋น๋ ์์ ๋ฑ์ ์ํํ ์ ์์
- ๋ ํฌ์งํ ๋ฆฌ ๋ด์ฉ์ CICD ์ํฌํ๋ก์ฐ์์ ์ฌ์ฉํ ์ ์์
- uses ํค์๋๋ก ์ก์ ์ ๋ถ๋ฌ์ฌ ์ ์์
name: checkout
on: workflow_dispatch
jobs:
no-checkout:
runs-on: ubuntu-latest
steps:
- name: check file list
run: cat README.md
checkout:
runs-on: ubuntu-latest
steps:
- name: use checkout action
uses: actions/checkout@v4
- name: check file list
run: cat README.md
- ์ฒซ๋ฒ์งธ job์ด ์คํจํ ์ด์ ๋ checkout ๋ฏธ์ฌ์ฉ์ผ๋ก ๊นํ๋ธ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค์ง ์์๊ธฐ ๋๋ฌธ์
2. context
- ์ํฌํ๋ก์ฐ๋ฅผ ์คํํ๋ ํ๊ฒฝ์ ๋ํ ์ ๋ณด
- ๋ค์ํ ์ปจํ ์คํธ๊ฐ ์กด์ฌํจ
- context์ ์ฌ์ฉ ์ด์
- ๋ ์ ์ฐํ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์
- ๊ฐ๊ฐ์ ์ปจํ
์คํธ๋ JavaSctript ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅ์ ํ๋ ค๋ฉด ๋ฌธ์์ด๋ก ๋ฐํํด์ค์ผํจ
- toJSON์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ Object๊ฐ์ฒด๋ฅผ Json๋ฌธ์์ด๋ก ๋ฐํํ ์ ์์
- context.yaml ์์
name: context
on: workflow_dispatch
jobs:
context:
runs-on: ubuntu-latest
steps:
- name: github context
run: echo '${{ toJSON(github)}}'
- ์ปจํ ์คํธ ์์ ์ด๋ค ๋ ํ์งํ ๋ฆฌ์ธ์ง, ์ด๋ค run_id ์ธ์ง ๋ฑ ๋ค์ํ ์ ๋ณด์ ์ ์ ์์
- context์ ๋ณด๋ฅผ ์ถ๋ ฅํด๋ณด๊ธฐ
- name: check github context
run: |
echo ${{ github.repository }}
echo ${{ github.event_name }}
Filter
- ์ด๋ฒคํธ๊ฐ ํน์ ์กฐ๊ฑด์ ๋ถํฉํ ๋๋ง ์ํฌํ๋ก์ฐ๊ฐ ํธ๋ฆฌ๊ฑฐ ๋๋๋ก ํจ
- ์ํฌํ๋ก์ฐ ์คํ์ ๋ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ ์ ์์
3. branch filter
- ํน์ ๋ธ๋์น ์ด๋ฒคํธ์๋ง ํธ๋ฆฌ๊ฑฐ ๋๋ ์ก์
name: branch-filter
on:
push:
branches: ["dev"]
jobs:
branch-filter:
runs-on: ubuntu-latest
steps:
- name: echo
run: echo hello
4. path filter
- ํน์ ๊ฒฝ๋ก์ ํ์ผ์ด ๋ณ๊ฒฝ๋ ๋ ์ํฌํ๋ก์ฐ๋ฅผ ์คํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํจ
- ! ๋ ํน์ ํ์ผ, ๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ธํ ์ ์
name: path-filter
on:
push:
path:
- '.github/workflows/part1/*'
- '!.github/workflows/part1/push.yaml*'
jobs:
path-filter:
runs-on: ubuntu-latest
steps:
- name: echo hello
run: echo hello
5. tag filter
- ํน์ ํ๊ทธ์์ ์คํํจ
- ex) v1.0.0์ผ๋ก ํ๊น ํด์ผ ์คํ๋จ
- push ์ด๋ฒคํธ ์์๋ง ์ฌ์ฉ ์ฌ๋ฅ
- ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- git tag <tag-name>
name: tag-filter
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+' # v1.0.0 v2.0.1
jobs:
tag-filter:
runs-on: ubuntu-latest
steps:
- name: echo
run: echo hello
6. timeout
- ํน์ ์๊ฐ์ด์ ์คํ๋๋ฉด ์๋์ผ๋ก ์ค๋จ๋๋๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ
- ํน์ job , ํน์ step ๋ฌดํ๋ฃจํ๋ก ์ธํ ๋ถํ์ํ ์์ ์๋ชจ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ
- default 360๋ถ
- ํ์์์ ์ ์ ๋ ๋ฒจ : job level, step level
- timeout-minutes ๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํจ
name: timeout
on: push
jobs:
timeout:
runs-on: ubuntu-latest
timeout-minutes: 2
steps:
- name: loop
run: |
count=0
while true; do
echo "seconds: $count"
count=$((count+1))
sleep 1
done
timeout-minutes: 1
- name: echo
run: echo hello
7. cache
- ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋ถ๋ฌ์ฌ ์ ์๋๋ก ์ ์ฅํ๋ ๊ธฐ๋ฅ
- ์์กด์ฑ ์ค์น ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์
- ๊นํ ๋ง์ผํ๋ ์ด์ค์ ๊ณต์ ์ก์
- ๊ฐ์ ์์ ๋ ๋ฆฌ์กํธ - npm start ๋ฅผ ์ํด ์ฌ์ฉํจ
name: cache
on:
push:
paths:
- 'my-app/**' # my-app ํ์์ ๋ชจ๋ ํ์ผ์ ํฌํจํจ
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: checkout the code
uses: actions/checkout@v4 # ๋ ํ์งํ ๋ฆฌ ์ฒดํฌ์์ ์ก์
- name: setup-node
uses: actions/setup-node@v3 # ์
์
๋
ธ๋ ์ก์
์ฌ์ฉ
with:
node-version: 18 # 18๋ฒ์ ์ ๋
ธ๋๋ฅผ ์ธ์คํจ ํ๋ ์ก์
- name: Cache Node.js modules
uses: actions/cache@v3
with: # withํค์๋๋ฅผ ์ฌ์ฉํด์ ์ธํ๊ฐ์ ์ ๋ฌํจ
path: ~/.npm # ์บ์ฑํ ๊ฒฝ๋ก
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
# ์บ์์ ํค, ์ด์์ฒด์ ๋ณ๋ก ์บ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์
restore-keys: |
${{ runner.os }}-node- # ๊ฐ ์ด์์ฒด์ ๋ณ๋ก ๋งค์ ๊ตฌ๋ฌธ ๊ฐ์์ ๋ฒ์ฃผ๋ฅผ ๋ํ๋
- name: Install dependencies # ์์กด์ฑ ์ค์น
run: |
cd my-app
npm ci
- name: npm build # ๋น๋์์
์คํ
run: |
cd my-app
npm run build
- 3๋ฒ์งธ job์ ์ดํ์ ๊ฐ์ ์ด์์ฒด์ ์์ ๋์ผํ package-lock.json์ ๊ฐ์ง ์ํฌํ๋ก์ฐ๊ฐ ์คํ๋ ๋ ์ด์ ์ ์ ์ฅํ๋ ์บ์๋ฅผ ์ฌ์ฉํด์ ์์กด์ฑ ์ค์น๋ฅผ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๊ฒ ํด์ค
8. artifact
- ์ํฌํ๋ก์ฐ ์คํ ์ค ์์ฑ๋ ํ์ผ/ํ์ผ๋ชจ์
- ๋์ผํ ์ํฌํ๋ก์ฐ ๋ด์์ job ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒ
- ์ํฌํ๋ก์ฐ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ์ผ์ ๊ธฐ๊ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํจ(90์ผ)
- ๋ค์ด๋ก๋๋ ๊ฐ๋ฅํจ
- ๊นํ ๋ง์ผํ๋ ์ด์ค์ ์ ์๋ ๊ณต์ ์ก์
- upload-artifact
- download-artifact
name: artifact
on: push
jobs:
upload-artifact:
runs-on: ubuntu-latest
steps:
- name: echo
run: echo hello-world > hello.txt # ํ
์คํธํ์ผ์ ๋ง๋ค๊ณ , ๋ฌธ์์ด ์ง์ด๋ฃ๊ธฐ
- name: upload artifact
uses: actions/upload-artifact@v3 # upload-artifact ์ก์
์ ์ด์ฉํด์ hello.txtํ์ผ์
with: # artifact๋ก ์
๋ก๋ํจ
name: artifact-test
path: ./hello.txt
download-artifact:
runs-on: ubuntu-latest
needs: [upload-artifact]
steps:
- name: download artifact
uses: actions/download-artifact@v3
with:
name: artifact-test
path: ./
- name: check
run: cat hello.txt
9. output
- ํ job์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ job์ step์ด๋, ๋ค๋ฅธ job ๋ค๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ฒ ํด์ค
- ์ฌ๋ฌ step๊ณผ job ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฝ๊ฒ ์ ๋ฌํ ์ ์์
- outfut vs artifact
- outfut : ๋จ์ํ ๊ฐ ์ ๋ฌํ ๋ ์ฌ์ฉํจ, key-value ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํจ
- artifact : ํ์ผ ๋๋ ํ์ผ ๋ชจ์์ผ๋ก ๋ฐ์ดํฐ ๊ณต์ ๊ฐ๋ฅํจ, ํ์ผ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๊ณต์ ์ ์ฌ์ฉํ๊ธฐ
- ์ฌ์ฉ ๊ตฌ์กฐ
- ์ค์ ํ ์์ํ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ์์ํ์ด ์ ์๋ ์คํ ์ ๊ณ ์ id๋ฅผ ์ฌ์ฉํด์ผํจ
- ๊ฐ ์คํ ์ ๊ณ ์ ํ ์์ด๋๋ฅผ ์ฌ์ฉํด์ผ ์์ํ์ ์ถ๋ ฅํ ์ ์์
- ์ถ๋ ฅ ๋ฐฉ๋ฒ
- steps.์คํญ_์์ด๋.outputs.์์ํ_ํค
- ์ฒซ๋ฒ์งธ ์คํญ์์ ์์ํ ์ค์ ์ ํ๊ณ , ๋๋ฒ์งธ ์คํญ์์ ์์ํ์ ์ถ๋ ฅํจ
- job ํํ์ ์์ํ๋ ํค ๋ฒจ๋ฅ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํจ
- job ๋ ๋ฒจ์์ ์์ํ ์ค์ ์ ์๋ฃํ๋ฉด, ์ข ์์ฑ์ด ์๋ job์ ํด๋น ์์ํ์ ์ฌ์ฉํ ์ ์์
name: output
on: push
jobs:
create-output:
runs-on: ubuntu-latest
outputs:
test: ${{ steps.check-output.outputs.test }}
steps:
- name: echo output
id: check-output
run: |
echo "test=hello" >> $GITHUB_OUTPUT
- name: check output
run: |
echo ${{ steps.check-output.outputs.test }}
get-output:
needs: [create-output]
runs-on: ubuntu-latest
steps:
- name: get output
run: echo ${{ needs.create-output.outputs.test }}
10. environment variables ๊นํ์ก์ ํ๊ฒฝ๋ณ์
- step์ด๋ job์์ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ ๋ณ์
- key - value ํํ๋ก ๋ฐ์ดํฐ ์ ์ฅํจ
- ๋์ผํ job์์๋ง ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ๊ฐ๋ฅํจ
- ํ๊ฒฝ๋ณ์ ๊ตฌ์ฑ๋ฐฉ๋ฒ
- env ์ฌ์ฉ : ์ํฌํ๋ก์ฐ ๋ด์์ ์ ์ํจ.
- workflow ๋ ๋ฒจ, job ๋ ๋ฒจ, step ๋ ๋ฒจ์์ ์ ์ํด์ ์ฌ์ฉํ ์ ์์
- ์ฐ์ ์์ step >> job >> workflow
- ๋ฏธ๋ฆฌ ์ ์
- env ์ฌ์ฉ : ์ํฌํ๋ก์ฐ ๋ด์์ ์ ์ํจ.
[ env ์ฌ์ฉํ ์ ์ ]
name: var-1
on: push
env:
level: workflow # ์ํฌํ๋ก์ฐ ๋ ๋ฒจ env ์ ์
jobs:
get-env-1:
runs-on: ubuntu-latest
steps:
- name: check env
run: echo "LEVEL ${{ env.level }}"
get-env-2:
runs-on: ubuntu-latest
env:
level: job # ์ก ๋ ๋ฒจ env ์ ์
steps:
- name: check env
run: echo "LEVEL ${{ env.level }}"
get-env-3:
runs-on: ubuntu-latest
env:
level: job
steps:
- name: check env
run: echo "LEVEL ${{ env.level }}"
env:
level: step # ์คํ
๋ ๋ฒจ env ์ ์
get-env:
runs-on: ubuntu-latest
steps:
- name: create env
run: echo "level=job" >> $GITHUB_ENV # ์ง์ env ์ ์
- name: check env
run: echo "LEVEL ${{ env.level }}"
[ ํ๊ฒฝ๋ณ์ ๋ฏธ๋ฆฌ ์ ์ํ๊ธฐ ]
- ์ํฌํ๋ก์ฐ ๋ฐ์์ ๋ฏธ๋ฆฌ ํ๊ฒฝ๋ณ์๋ฅผ ์ ์ํจ
- ์ด ๊ฐ์ ๋ฐ๊พธ๋ฉด ์ํฌํ๋ก์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์
- Settings - security - Actions secrets and variables - Actions - variables
name: var-2
on: push
jobs:
get-var:
runs-on: ubuntu-latest
steps:
- name: get var
run: echo ${{ vars.level }}
11. secrets
- ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํด์ ์ํฌํ๋ก์ฐ์ ์ฌ์ฉํ๋ ๊ฒ
- ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์ฝ๋์ ๋ถ๋ฆฌํ์ฌ, ๋ ธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํจ
- ์ฌ์ฉ ํ๋ ๊ณณ : API Key, ์ํธ, ์ธ์ฆ ํ ํฐ
- Settings - security - Actions secrets and variables - Actions - secrets
name: secrets
on: push
jobs:
get-secrets:
runs-on: ubuntu-latest
steps:
- name: get secrets
run: echo ${{ secrets.level }}
12. environment
- ํน์ ํ๊ฒฝ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฒฝ๋ณ์์ ์ํฌ๋ฆฟ์ ๊ด๋ฆฌํ๋ ๊ฒ
- Repository์์ ์ ์ํ ์ ์์
- ์ ์ ๋ ๋ฒจ : organization level, repository level, environment level
13. matrix
- ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ job์ ์คํํ๋ ๊ธฐ๋ฅ
- matrix๋ฅผ ์ฌ์ฉํด์ ํ๋์ ์ก์ ๊ตฌ์ฑํ๋ฉด, ์ฌ๋ฌ ๊ฐ์ ์ก์ ์คํํ๋๋ก ํ ์ ์
- ๋ณ์๋ก ํ๋์ ์ก์ผ๋ก ์ฌ๋ฌ ๋ฌ๋(OS)๊ฐ ์ก์ ์คํํ๊ฒ ํ๊ฑฐ๋, ๊ฐ์ ์ฝ๋ ๋ฒ ์ด์ค์์ ๊ฐ ๋ฒ์ ๋ณ๋ก ํ ์คํธ๋ฅผ ๊ตฌ์ฑํ ์ ์์
name: matrix
on: push
jobs:
get-matrix:
strategy:
matrix:
os: [windows-latest, ubuntu-latest]
version: [12,14]
runs-on: ${{ matrix.os }}
steps:
- name: check matrix
run: |
echo ${{ matrix.os }}
echo ${{ matrix.version }}
14. if condition
- ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๋ง ์คํ๋๋๋ก ํ ๋ ์ฌ์ฉ
- ์คํผ๋ ์ดํฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํด์ ์กฐ๊ฑด ๊ตฌ์ฑํ๊ธฐ
- job ๋ ๋ฒจ, step ๋ ๋ฒจ์์ ์ ์ํ ์ ์dma
- filter vs if condition
- filter : workflow ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ด (ex-dev๋ธ๋์น์ผ๋๋ง ํธ๋ฆฌ๊ฑฐ)
- if condition : workflow๊ฐ ํธ๋ฆฌ๊ฑฐ ๋ ์ดํ job๊ณผ step๋ง ์ธ๋ฐํ๊ฒ ์ ์ด (ex-dev ๋ธ๋์น์ผ๋๋ ์ฒซ๋ฒ์งธ job๋ง ์คํ/ master ๋ธ๋์น์ผ ๋ ๋๋ฒ์งธ job์ ์ธ๋ฒ์งธ step skipํ๊ธฐ)
name: if-1
on:
push:
workflow_dispatch:
jobs:
job1:
runs-on: ubuntu-latest
if: github.event_name == 'push'
steps:
- name: get event name
run: echo ${{ github.event_name }}
job2:
runs-on: ubuntu-latest
if: github.event_name != 'push'
steps:
- name: get event name
run: echo ${{ github.event_name }}
job3:
runs-on: ubuntu-latest
steps:
- name: get event name
if: github.event_name == 'push'
run: echo "PUSH"
- name: get event name
if: github.event_name != 'push'
run: echo "WORKFLOW_DISPATCH"
15. startWith, endsWith, contains
- ๋ฌธ์์ด ์ฒ๋ฆฌ ํจ์
- ๋ฌธ์์ด ์กฐ๊ฑด์ ๊ฒ์ฌํด์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ํด๋น jbob์ด๋ step์ ์คํํ๋๋ก ์ ์ดํ๋๋ฐ ์ ์ฉ
- startWith ( searchString, searchValue )
- endsWith ( searchString, searchValue )
- contains ( search, item )
- search๋ ๋ฌธ์์ด์ด๋ ๋ฐฐ์ด. ๋ฐฐ์ด์ ์ฝค๋ง๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด ๋ฆฌ์คํธ๋ก ์์ฑ
name: string-function
on: push
jobs:
string-function:
runs-on: ubuntu-latest
steps:
- name: startswith
if: startsWith('github actions', 'git')
run: echo "git"
- name: startswith
if: startsWith('github actions', 'test')
run: echo "test"
- name: endswith
if: endsWith('github actions', 'ions')
run: echo "ions"
- name: endsWith
if: endsWith('github actions', 'test')
run: echo "test"
- name: contains
if: contains('github actions', 'act')
run: echo "contains act"
- name: contains
if: contains('github, actions', 'git')
run: echo "contains git"
'๐ฅ๏ธ ๋ฐฑ์๋ > CICD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CICD] ๊ธฐ์ด ์๋๋ฆฌ์ค ๊นํ ์ก์ (0) | 2024.03.23 |
---|---|
[CICD] ํค์๋ ๊ธฐ๋ฐ ์ด์ ์๋ฆผ ์๋ํ (0) | 2024.03.23 |
[CICD] ๊นํ ๋ ํฌ ์์ฑ ์๋ํ (0) | 2024.03.23 |
[CICD] Github Actions์ event (0) | 2024.03.21 |
[CICD] ๊นํ๋ธ ์ก์ ์ปดํฌ๋ํธ (0) | 2024.03.21 |