0%

github action 사용하기

Github Action이란?

CI(Continuous Integration)서버란 ?
App 개발자라면 App 소스코드를 짠 후 Build하고, 여러가지 Test도 하고, 그리고 최종 결과물을 특정 장소에 저장하는 Deployment(배포) 를 하곤 한다. 한마디로 개발자들은 코딩한 다음 Build, Test, Deploy 작업을 수행하는데 이를 자동으로 해주는 프로그램이 CI서버이다. 배포서버는 최종결과물을 저장하는 컴퓨터이다. CI서버가 빌드, Test 후에 배포서버로 최종 배포를 하는 것이다.

CI는 Continuous Integration의 약자로 지속적인 통합이라는 뜻이다. 지속적이라는 뜻은 늘 작동 대기 중이라는 뜻이다. 지속적으로 서비스를 한다라는 뜻이다. 통합이라는 뜻은 기본적으로 소스코드를 통합한다라는 뜻이다. 여러사람들이 GIt 같은 버전관리툴에 올린 내용들을 하나로 다운받아서 통합해서 빌드한다.

image

GitHub Actions는 GitHub에서 제공하는 워크플로우(Workflow) 자동화 도구다. 워크플로우라는 단어가 의미하듯 테스트, 빌드, 배포 뿐 아니라 다양한 작업을 만들어서 자동으로 실행하게 할 수 있다. PR에 특정 코멘트를 남기면 자동으로 머지를 하게 만들 수 있고, 데이터를 수집하는 데에 이용할 수도 있다.

  • 개발 과정에서 발생하는 워크 플로우를 자동화 할 수 있는도구
  • 빌드 / 테스트 /커버리지 /배포가지 진행 할 수 있다.

사용법

  • .github/workflows 아래에 action이 작성된 xxx.yml 파일을 추가한다.
  • github의 tab에서 action으로 확인 할 수 있다.스크린샷 2021-01-18 오후 12 54 23

Action과 Workflow

Action은 사용자가 작성하는 실행가능한 코드 덩어리 이다. 하나의 작업을 설명한다.
Workflow는 Action을 실행하는 환경 단계를 서술한다. 하나의 Workflow는 여러개의 Action을 실행할 수 있다. 그래서 이름이 GitHub Actions다. Actions 페이지에 들어가 보면 저장소에서 사용하는 기술에 맞는 Workflow 템플릿을 추천 해준다(다양한 예제 제공).

스크린샷 2021-01-18 오후 12 56 02

Workflow 파일은 .github/workflows 디렉터리에 위치한다. 화면에 보이는 것처럼 GitHub의 Actions 탭에서 직접 작성할 수 있다. 로컬에서 소스 코드처럼 작성하고 GitHub 원격 저장소로 Push를 할 수도 있다.

Action을 npm 패키지처럼 Marketplace에 배포를 하면 우측의 GitHub Marketplace에 노출되어 다른 사용자와 공유할 수 있다. 물론 다른 사람이 작성한 Action을 이용하는 것도 가능.

1)워크 플로우의 이름

1
name: CI Build //name은 워크 플로우의 이름을 의미한다.
  1. 실행 시점
1
2
3
4
on: [pull_request] //on은  워크 플로우를 실행  시점을 설정pull_request는 GitHub로 PR을 보낼때, PR에 커밋을 추가할 때마다 실행하라는 뜻이다. Webhook 처럼 이벤트 시점을 등록할  있고, POSIX cron 문법으로 직접 스케줄을 정의할 수도 있다.
on:
schedule:
- cron: '*/15 * * * *'

3)머지 브랜치 체크 아웃

1
2
3
4
5
6
7
- uses: actions/checkout@v1
//use는 사용할 패키지 이름 지정 actions/checkout@v1은 저장소를 설정하고 PR의 머지 브랜치를 체크아웃한다.
사용할 있는 Action은 Marketplace에서 검색할 있다. npm package registry와 비슷한 친구다. 직접 로컬에 Action을 작성한 경우에는 로컬 디렉터리를 지정해줄 수도 있다.

- uses: ./.github/actions/coverage-commenter

//사용자 정의 Action을 만들려면 GitHub이 안내하는 방식을 따라야 한다.(https://docs.github.com/en/actions/creating-actions/creating-a-javascript-action)
1
2
3
4
5
6
7
8
9
10
11
12
13
on:
# Push 될때마다
push:
branches:
- master
- release/*
# PR 조건
pull_request:
branches:
- master
# 스켸줄링도 가능
schedule:
- cron: "0 2 * * 1-5"

다양한 환경 제공

1
2
3
4
jobs:
my_job:
name: deploy to staging
runs-on: ubuntu-18.04

외부 Action도 재사용 가능

1
2
3
4
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: "12"

변수 행렬화하여 사용가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
jobs:
test:
name: Test on node $ and $
runs-on: $
strategy:
matrix:
node_version: ["8", "10", "12"]
os: [ubuntu-latest, windows-latest, macOS-latest]

steps:
- uses: actions/checkout@v1
- name: Use Node.js $
uses: actions/setup-node@v1
with:
node-version: $

- name: npm install, build and test
run: |
npm install
npm run build --if-present
npm test

Secret Key 사용 방법

  • Settings -Secret 에 등록하여 사용하면 된다.

스크린샷 2021-01-18 오후 1 16 09

1
2
3
4
5
6
- name: Deploy and Firebase
uses: w9jds/firebase-action@master
with:
args: deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} //${{ ... }}은 Runner를 실행하는 문맥(Contexts)에 대한 정보나 환경 변수(Environment Variables)를 참조할 이용하는 표현식이다.

Example (npm , Firebase Deployment)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
name: Firebase Deployment

on:
push:
branches:
- master

jobs:
deploy:
name: Build & Deployment
runs-on: ubuntu-latest

steps:
- name: get the source code
uses: actions/checkout@v2

- name: install node
uses: actions/setup-node@v2
with:
node-version: "12"

- name: install node packages
run: npm i

- name: Build
run: npm run build
env:
CI: false

- name: Deploy and Firebase
uses: w9jds/firebase-action@master
with:
args: deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

reference:https://docs.github.com/en/actions