Github actions: Basic (with YAML)
π§ 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
ν€μλλ μ΄λ―Έ λ€λ₯Έ νμ¬λ μ¬λλ€μ΄ λ§λ€μ΄μ μ¬λ €λ μ‘μ
μ μ€μ μ ν΅ν΄ μ¬μ©ν μ μλ€. μ΄λ κ² λ§λ€μ΄μ§ μ‘μ
λ€μ λ§μΌνλ μ΄μ€μμ μ½κ² 곡μ ν μ μλ€.
λ΄μ©μ΄ κΈΈμ΄μ§ κ΄κ³λ‘ λ€μ κΈμμ μ§μ μν¬νλ‘μ°λ₯Ό μμ±ν΄λ³΄κ² λ€!π