๐ง Github actions?
Github actions
๋ Github์์ ์ ๊ณตํ๋ workflow๋ฅผ ์๋ํํ ์ ์๋ ๋๊ตฌ์ด๋ค. ์ฆ, Github์์ ์ง์ ์ ๊ณตํ๋ CI/CD ๋๊ตฌ๋ผ๊ณ ํ ์ ์๋ค.
CI๋ก ์ด๋ค๋ ์๋ฏธ๋ ํ
์คํธ ์คํ์ด๋ ๋น๋ ๊ฒ์ฌ, ์ปจ๋ฒค์
๊ฒ์ฌ๋ฅผ ํตํด ์ฝ๋๊ฐ ์๋๋๋ก ๋์ํ๊ณ ์ ์์ฑ๋์๋์ง๋ฅผ ํ์ธํ ์ ์๋ค๋ ์๋ฏธ์ด๊ณ CD๋ ์๋ฒ์ ๋ฐฐํฌํ๊ฑฐ๋ ๋ ์ง์คํธ๋ฆฌ์ ๋ฐํํ๋ ๋ฑ์ ํ์๋ฅผ ํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
์ด๋ฌํ CI/CD ๋๊ตฌ์๋ Travis CI
, CircleCI
๋ฑ์ด ์์ง๋ง Github actions
๋ ์์ฑ์ด ์ฌ์ฐ๋ฉด์๋ ํ์ฅ์ฑ์ด ์ข๊ณ , Github ๋ง์ผ ํ๋ ์ด์ค์์ ์ฌ๋ฌ ์ฌ๋์ด ๊ณต์ ํ Workflow๋ฅผ ์ฐพ์ ์ ์์ผ๋ฉฐ, ์์ ์ด ์ง์ ๋ง๋ค์ด์ ๊ณต์ ํ ์๋ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
๐ YAML (YAML Ain't Markup Language)
Github actions
์ workflow๋ค์ yaml(์ผ๋ฏ)๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋์ด /.github/workflows
์ xxx.yml
ํํ๋ก ์ ์ฅ๋๋ค.
๋ฐ๋ผ์ YAML์ ๋ํด ์ต์ํ ์๋ก ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ๊ธฐ ์์ํด์ง๊ธฐ๋๋ฌธ์ YAML์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ณด๋ ค ํ๋ค.
YAML ์ด๋? (vs JSON)
YAML์ ์๋ฏธ๋ "๋ ๋ค๋ฅธ ๋งํฌ์ ์ธ์ด (Yet Another Markup Language)"์์ผ๋, ๋ฌธ์ ๋งํฌ์ ํ์์ด ์๋๊ณ ๋ฐ์ดํฐ ์ค์ฌ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ์ฌ "YAML์ ๋งํฌ์ ์ธ์ด๊ฐ ์๋๋ค (YAML Ain't Markup Language)"๋ผ๋ ์ด๋ฆ์ ์ฑํํ์๋ค๊ณ ํ๋ค.
YAML์ JSON๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋์ด ์ฝ๊ธฐ ์ฝ๊ฒ ๊ฐ๋ ์ฑ์ ๊ณ ๋ คํ์ฌ ์ค๊ฒ๋ ๋ฐ์ดํฐ ๊ตํํฌ๋งท์ด๋ค. JSON์ ๋จ์ํ์ ๋ฒ์ฉ์ฑ์ ์ค์ ์ ๋ ๋ฐ๋ฉด, YAML์ ๊ฐ๋ ์ฑ์ ์ค์ ์ ๋์๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ JSON์ ๋นํ์ฌ YAMLํ์ผ์ ์์ฑ๊ณผ ํด์์ด ๋น๊ต์ ๋ณต์กํ ํธ์ด๋ค.
YAML ๋ฌธ๋ฒ
์ด๋ฒ ๊ธ์์๋ YAML์ ๋ชจ๋ ๋ฌธ๋ฒ์ ์์๋ณธ๋ค๊ธฐ ๋ณด๋ค๋ workflow ์์ฑ์ ํ์ํ ๋ฌธ๋ฒ๋ค๋ง ๊ฐ๋ตํ ์ ๋ฆฌํด๋ณด๋ คํ๋ค.
๋ฐ์ดํฐ ์ ์ (map)
๋ฐ์ดํฐ๋ ๋ค์ฌ์ฐ๊ธฐ
๋ฐ key: value
ํํ๋ก ์ ์ํ๋ค.
// YAML
apiVersion: v1
kind: Pod
metadata:
name: echo
labels:
type: app
// JSON
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "echo",
"labels": {
"type": "app"
}
}
}
์ด๋ key
์ value
์ฌ์ด์๋ ๋ฐ๋์ ๋น์นธ์ด ์กด์ฌํด์ผํ๋ค.
# error (not key-value, string)
key:value
# ok
key: value
๋ฐฐ์ด ์ ์ (array)
๋ฐฐ์ด์ ํ์ดํ(-)
ํํ๋ก ์ ์ํ๋ค.
// YAML
person:
name: Chungsub Kim
job: Developer
skills:
- docker
- kubernetes
// JSON
{
"person": {
"name": "Chungsub Kim",
"job": "Developer",
"skills": [
"docker", "kubernetes"
]
}
}
์ฃผ์
์ฃผ์์ #
์ผ๋ก ํ์ํ๋ค.
# ์ฃผ์์ฃผ์์ฃผ์
์ค๋ฐ๊ฟ
|
์ง์์ด๋ ๋ง์ง๋ง ์ค๋ฐ๊ฟ ํฌํจ, |-
์ง์์ด๋ ๋ง์ง๋ง ์ค๋ฐ๊ฟ ์ ์ธ, >
์ง์์ด๋ ์ค๊ฐ์ ๋ค์ด๊ฐ ๋น์ค์ ์ ์ธํ๋ค.
// YAML
newlines_sample: |
number one line
second line
last line
// JSON
{
"newlines_sample": "number one line\n\nsecond line\n\nlast line\n"
}
YAML ๋ณํ ์ฌ์ดํธ
json2yaml
์ ์ฌ์ดํธ์์ JSON์ YAML ๋ณํํ ์ ์๋ค.
๐๐ปโโ๏ธ workflow ๊ตฌ์ฑ ์ดํด๋ณด๊ธฐ
repository์ Actions ํญ์์ workflow๋ฅผ ์์ฑํ ์ ์๋ค.
์ง์ ์ฒ์๋ถํฐ ์์ฑํ ์๋ ์์ง๋ง, ์ฒ์์๋ ์๋์ ์ถ์ฒ ํ ํ๋ฆฟ์์ ์์ ํ๋ฉด์ ์์ฑํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ 12,14,16 ]
steps:
- name: checkout to repository
uses: actions/checkout@v2
- name: Run a one-line script
run: echo Hello, world!
- run: npm test
์์ ๊ธฐ๋ณธ ํ ํ๋ฆฟ์ ์์๋ก ์ํฌํ๋ก์ฐ์ ๊ตฌ์ฑ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ๋ค.๐
name
name: CI
name
์ ์ด ์ํฌํ๋ก์ฐ์ ์ด๋ฆ์ด๋ค. GitHub Actions์์๋ ๋ค์์ ์ํฌํ๋ก์ฐ๋ฅผ ์ค์ ํ ์ ์๋๋ฐ ํ์ผ๋ง๋ค ํ๋์ฉ ์ค์ ํ ์ ์๋ค.
์ด๋ ๊ฒ ์์ฑํ ์ด๋ฆ์ repository์ Actionsํญ์์ ์๋์ฒ๋ผ ํ์ธํ ์ ์๋ค. (name: PR Test)
on
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
on
์ ํ์๊ฐ์ผ๋ก ์ํฌํ๋ก์ฐ์ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์ ์๋ค. ์์์๋ push์ pull_reqeust์ main ๋ธ๋์น์ ๋ํด์ ์ค์ ํ ๊ฒ์ธ๋ฐ ๊ฐ๋จํ๊ฒ
on: [push, pull_request]
๋ก ์ค์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๋ค์ํ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉฐ ์ด๋ ์ด๊ณณ์์ ํ์ธํ ์ ์๋ค.
repository_dispatch๋ฅผ ์ค์ ํ๋ฉด Github ์ธ๋ถ์์ ๋ฐ์ํ๋ ํ๋์ผ๋ก๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ผ๋ฉฐ,
schedule ์ด๋ฒคํธ๋ฅผ ์ค์ ํ๋ฉด POSIX cron ๋ฌธ๋ฒ์ผ๋ก ์๋์ฒ๋ผ ํน์ ์๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
on:
schedule:
# KST ๊ธฐ์ค, ์-๊ธ 06์
- cron: "0 21 * * 0-4"
jobs
jobs:
build:
jobs
๋ ์ํฌํ๋ก์ฐ์ ๊ธฐ๋ณธ ๋จ์๋ผ๊ณ ๋ณด๋ฉด ๋๋ฉฐ ๋ค์ ๋ ์์ ๋จ์์ธ ์คํ
(step)์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์์์๋ jobs.build
๋ก ๋์ด ์๋๋ฐ ์ค์ ๋ฌธ๋ฒ์ jobs.<job_id>
๊ฐ ๋๋ค. build๋ ์์๋ก ์ง์ ํ ์ด๋ฆ์ด๊ณ ์๋ฌด ์ด๋ฆ์ด๋ ์ง์ ํ ์ ์๋ค. ์ฌ๊ธฐ์๋ build๋ผ๋ ์ก ํ๋๋ง ์์ง๋ง ์ด๋ฆ์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ์ก์ ์ค์ ํ ์ ์๋ค.
jobs
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋ ฌ์ ์ผ๋ก ์คํ๋์ง๋ง needs
ํค์๋๋ฅผ ํตํด ์์กด์ฑ์ ๊ฐ๋๋ก ์ค์ ํ ์๋ ์๋ค.
์๋๋ needs
ํค์๋๋ฅผ ์ถ๊ฐํ์ฌ test์์
์ด build์์
์ดํ์ ์คํ๋๋๋ก ์ค์ ํ ๊ฒ์ด๋ค.
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: ./build_server.sh
test:
needs: build
runs-on: ubuntu-latest
steps:
- run: ./test_server.sh
runs-on
runs-on: ubuntu-latest
runs-on
์ ์ก์ ์คํํ ์ด์์ฒด์ ๋ก Windows, Linux, macOS๋ฅผ ์ง์ ํ ์ ์๊ณ ๋
ธ๋๋ฅผ ์ง์ ์ด์ํ๋ ๊ฒฝ์ฐ์๋ self-hosted๋ฅผ ์ง์ ํ ์๋ ์๋ค.
strategy
strategy:
matrix:
node: [ 12,14,16 ]
strategy
๋ ์ ์ค์ ์ฒ๋ผ ๊ฐ์ ์ก์ ์ฌ๋ฌ ๋ฒ์ ์ ํ๊ฒฝ์์ ์คํํ๊ณ ์ถ์ ๋ ํ๋ ฌ์ ๊ตฌ์ฑํ๋ค. ์์์๋ Node.js 12, 14, 16๋ฒ์ ์์๋ง ์คํํ์ง๋ง os๊น์ง ์ง์ ํ๋ฉด ๋ ๋ณต์กํ ํ๋ ฌ์ ๊ตฌ์ฑํ ์๋ ์๋ค.
steps
steps:
- name: checkout to repository
uses: actions/checkout@v2
- name: Run a one-line script
run: echo Hello, world!
- run: npm test
steps
๋ ์ก์ ์ค์ ๋์์ ์ ์ํ๋ ๋ถ๋ถ์ด๋ฉฐ yaml๋ฌธ๋ฒ์ ํ์ดํ(-)์ผ๋ก ๋ถ๋ฅ๋์ด ํ๋์ step์ด ๊ตฌ์ฑ๋๋ค.name
์ ํ์๊ฐ์ด ์๋์ง๋ง, ํ๋์ step์ ํ๋์ uses
๋๋ run
ํค์๋๊ฐ ์กด์ฌํด์ผ ํ๋ค.run
ํค์๋๋ ์์คํ
์ shell์ ์คํ๋ ๋ช
๋ น์ด๋ฅผ ์ง์ ์์ฑํด์ฃผ์ด์ผ ํ์ง๋ง,uses
ํค์๋๋ ์ด๋ฏธ ๋ค๋ฅธ ํ์ฌ๋ ์ฌ๋๋ค์ด ๋ง๋ค์ด์ ์ฌ๋ ค๋ ์ก์
์ ์ค์ ์ ํตํด ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์ก์
๋ค์ ๋ง์ผํ๋ ์ด์ค์์ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ค.
๋ด์ฉ์ด ๊ธธ์ด์ง ๊ด๊ณ๋ก ๋ค์ ๊ธ์์ ์ง์ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํด๋ณด๊ฒ ๋ค!๐
๐ ์ฐธ๊ณ
'๊ฐ์ธ๊ณต๋ถ > CI&CD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Github actions: ํ ์คํธ ์๋ํ (with Slack) (0) | 2021.12.04 |
---|