Github Action을 이용한 개발 서버 자동 배포
git을 이용한 일반적인 개발 흐름은 다음과 같습니다.
개발자는 각자의 브랜치 로컬 저장소에 작업한 내역을 Commit
합니다.
그리고 커밋들을 원격 저장소로 Push
하고 관리자에게 Pull request
를 보냅니다.
PR 관리자가 소스를 검토하고 Master 브랜치와 Merge
하면 개발자들이 수정한 내역들이 하나로 통합되게 됩니다.
Github Action이란
Github Action은 커밋, 푸쉬, 풀 리퀘스트 같은 이벤트가 발생할 때마다 빌드, 테스트, 배포가 이루어지도록 Github에서 제공하는 기능입니다.
어떤 Event가 발생하면 하나 이상의 Jobs를 포함하고 있는 Workflow가 실행됩니다. Workflow는 수동으로 또는 스케줄러에 의해서 실행될 수도 있습니다.
Workflow는 YAML 파일로 작성됩니다.
하나의 Repository는 서로 다른 작업을 수행하는 여러 가지 Workflow를 가질 수 있습니다.
실습
백문이 불여일견. workflow를 한 번 만들어봅시다.
github에 접속해 Actions 메뉴로 진입합니다.
'set up a workflow yourself'를 클릭하면 아래와 같이 yml 파일을 생성할 수 있는 에디터가 나타납니다.
name: deploy-to-dev-server
run-name: ${{ github.actor }} is done
on:
push:
branches:
- master
jobs:
git-pull:
runs-on: ubuntu-latest
steps:
- name: wget
run: wget -qO- --no-check-certificate "https://test.co.kr/gitpull.jsp?key=TEST1234"
위 workflow는 .github/workflows/deploy-to-dev-server.yml 파일로 저장됩니다.
run-name
은 워크플로우가 실행(Run)될 때마다 붙여지는 이름입니다.
#1 Hong is done, #2 Son is done ... 이런 식으로 actor의 이름을 남기도록 했습니다.
workflow의 작동 조건(on:
)은 master를 제외한 브랜치에 push가 발생할 때이고
workflow가 할 일(jobs:
)의 이름은 git-pull
이며, 실행 환경은 ubuntu-latest입니다.
작업은 단계별로 실행될 수 있는데 지금은 wget이라는 하나의 단계(name:
)만이 존재합니다.
개발 서버 자동 배포
위 워크플로우의 목적은 push가 발생할 때마다 개발 서버에서 변경된 내용을 당겨오는 것(pull) 입니다.
이를 위해 gitpull.jsp를 만들어줍니다. 이 녀석은 서버의 /home/co1nam 밑에 있는 gitpull.sh를 실행합니다.
//키 검증
String key = m.rs("key");
if (!"SECRET".equals(key)) { return; }
//gitpull.sh를 실행
try {
Process proc = Runtime.getRuntime().exec("sh /home/co1nam/gitpull.sh");
//Process의 InputStream을 한 줄씩 읽어서 화면에 출력
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = reader.readLine()) != null)
{
sb.append(line);
}
out.print(sb.toString());
} catch (Exception e) {
out.print(print(e.getMessage());
}
gitpull.sh는 간단합니다. gitpull.sh이 있는 위치로 이동해서 git pull을 실행합니다.
cd /home/co1nam
git pull origin master
이제 gitpull.jsp를 실행하기만 하면 개발 서버로의 배포가 이루어집니다.
워크플로우에서 실행할 작업 run:
에 아래 내용을 넣어주면 됩니다.
wget -qO- --no-check-certificate "https://test.co.kr/gitpull.jsp?key=SECRET"
wget
명령어는 파일을 다운로드하는 명령어지만 -O-
옵션이 있는 경우 터미널에 결과를 표준 출력합니다.
-q
는 quiet mode를 의미하며 다운로드 중에 발생하는 메시지를 출력하지 않습니다.
--no-check-certificate
는 SSL 인증서를 확인하지 않습니다.
참조
https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions