🔍 CI / CD ?
📌 CI (Continuous Integration)
- 지속적인 통합
- [코드작성 -> 테스트 -> 빌드 -> 배포 -> 버그수정] 이라는 일련의 사이클을 단축시키고 자동화시키는 방법
📌 CD (Continuous Delivery 또는 Continuous Deployment)
- 지속적인 배포
- 어플리케이션에 적용한 변경 사항을 테스트를 거쳐 레포지토리에 업로드 되는 것
- Continuous Delivery 는 마지막 단계인 개발환경에서 운영환경으로의 배포를 개발자가 수동으로 해줌
- Continuous Deployment 는 이러한 수동 처리 없이 자동으로 운영환경 배포까지 자동으로 해줌
Github Actions 는 이러한 CI/CD를 가능하게 해주는 툴 중 하나이고
Jenkins, Travis CI, AWS Code Deploy 등등 다양한 툴이 있다
🚀 Github Actions 만들기
프로젝트 루트 폴더에서 ./.github/workflows/ 내부에 정의할 수 있다
깃헙 액션 템플릿을 사용할 수도 있는데
레포지토리의 Actions 탭에서 만들거나 깃허브 Marketplace 탭에서 커스텀 액션을 검색할 수도 있다
다양한 템플릿이 있다
템플릿은 이런식으로 기본 셋팅을 포함시켜준다
여기다가 깃헙 액션을 언제 실행할지, 무엇을 실행할지 등을 yml 파일로 정의한다
🚀 Github Actions 구조
Workflow > Job > Step > Action 순으로 정의한다
말 그대로 하나의 workflow 안에 여러 개의 job 을 정의할 수 있고
job 내부에도 여러 개의 step .... 이런식으로 세부화된다
찬찬히 뜯어보자
📝 ./.github/workflows/gradle-publish.yml
name: Gradle Package
on:
release:
types: [created]
jobs:
build:
...
📌 Workflow
하나 이상의 Job 으로 구성되고 이벤트 기반으로 동작하는 절차이다
- name : workflow 이름을 정의한다
- on : 어떠한 branch에 push 되었을때, 특정한 시간에만 등등.. workflow 가 실행되도록 하는 이벤트를 정의한다
- jobs : 하나의 workflow 에서 수행시킬 job을 정의한다. 기본적으로 병렬로 실행된다.
📌 Jobs
하나 이상의 step 으로 구성된 집합이다
하나의 job 은 독립된 runner, 즉 분리되어진 가상 환경에서 실행된다.
기본적으로 workflow는 여러 개의 job을 병렬로 실행시킨다
만약 순차적으로 실행하게 하고 싶다면 의존성을 명시해주어야 한다.
...
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest, windows-2016]
node-version: [12.x, 14,x]
steps:
- uses: actions/checkout@v2
- name: npm install and build webpack
run: |
npm install
npm run build
#아티팩트를 업로드함
- uses: actions/upload-artifact@master
with:
name: webpack artifacts
path: public/
test:
#의존성 명시, build가 실행된 이후 test가 실행됨
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
#아티팩트를 다운받음
- uses: actions/download-artifact@master
with:
name: webpack artifacts
path: public
...
build 이후에 여러 개의 test를 수행해야 한다면 위 코드처럼 분리시킬 수 있다
하지만 각 job은 독립된 runner에서 돌아간다고 했다
따라서 build 라는 job 에서 사용한 빌드된 코드를 test에서 사용할 수 없다 (독립된 공간이므로)
이런 식으로 의존성이 있는 job 은 빌드된 아티팩트를 업로드 하고,
다른 job 에서 내려받는 식으로 사용할 수도 있다
그리고 needs 를 사용하여 순서를 명시해주면 된다
- build 또는 test : 하나의 job과 그 이름을 정의한다
- runs-on : job이 수행될 os 등의 환경을 정의한다. 여기서는 ubuntu 최신 버전에서 동작하도록 했다
- strategy : 매트리스 등을 정의하여 여러 환경에서 동시에 빌드하도록 할 수 있다.
- needs : 해당 job 이 끝나면 이 job 을 수행하도록 정의한다
- steps : 하나의 job 에서 수행할 step의 집합을 정의한다
📌 Steps
Job 안에서 명령어를 실행시킨다.
action 또는 shell 명령어로 이루어진 집합이다
하나의 job은 같은 runner에서 실행되기 때문에 데이터를 공유할 수 있다
test:
...
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@master
with:
name: webpack artifacts
path: public
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install, and test
run: |
npm install
npm test
env:
CI: true
- uses : 오픈 소스 커뮤니티에 있는 다른 action를 가지고 와서 실행하는 것
actions/checkout@v2 는 내 레포지토리 환경을 runner 에 복사해서 실행하는 action이므로
내 레포지토리의 코드를 다루는 job 에서는 반드시 사용해야함 - with : 각 actions에 의해 정의된 파라미터를 나열한다.
이 변수들은 앞에 INPUT_ 이라는 prefix 가 붙고
대문자로 바뀌어 각 action에 대한 환경변수로 선언된다. (node-version -> INPUT_NODE-VERSION) - env : 각 actions에 필요한 환경 변수를 정의한다.
- name : 각 step 의 이름을 정의한다
- run : runner에서 실행할 커맨드를 정의한다
📌 Secrets 환경 변수 정의하기
Secret 을 이용해 환경 변수를 전달할 수도 있다
내 레포지토리 -> Settings -> Secrets -> Actions 에서
원하는 환경 변수를 정의
...
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
...
깃헙 액션 yml 파일에서 secrets로 접근 가능하다
📚 Reference
📝 Github Actions Docs - 깃헙 액션 공식 Docs
📝 Github Actions로 개발 주기 자동화 - 애저 듣고보는 잡학지식
🔍 Series
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)
'🏭 Infra > ⚡ Github Actions' 카테고리의 다른 글
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포) (0) | 2022.08.08 |
---|---|
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시) (0) | 2022.08.08 |