[Infra] Github Actions 간단 실습(2) ~ 헤로쿠 배포 ~
[Infra] Github Actions 간단 실습(1) ~ 빌드및 테스트 ~ 에서 이어집니다
지난 글에선 github actions을 이용해 깃허브에 올라오는 코드를 빌드 및 테스트하는 워크플로우를 작성해보았다.
이번엔 github actions를 이용해 깃허브에 올라오는 코드를 서버에 배포하는 워크플로우를 작성해보겠다.
여기서 사용할 서버는 heroku로, 여기를 참고하면서 진행하면 도움이 될 것이다.
0. 헤로쿠 무료 플랜 제거
헤로쿠는 2022년 8월 25일, 다가오는 11월 28일부터 무료 플랜과 무료 data service를 더 이상 제공하지 않으며 비활성 계정들도 점진적으로 삭제할 거라 발표했다. (링크) 차후 학생과 비영리 단체를 위한 지원 프로그램을 개설할 거라 했지만 학생 계정만으로도 heroku 이용이 가능할지는 아직 모르겠다..🥹 한글로 된 더 자세한 내용은 여기서 볼 수 있다.
따라서 이 게시물은 2022년 11월 28일부턴 heroku 유료 플랜을 쓰는 사람한테나 유용할 듯 싶다..
만일 헤로쿠를 사용해보고 싶다면 지금 빠르게 해보는 게 좋을지도...! 😇
1-1. 배포 워크플로우 파일 만들기
.github/worflows 에서 배포를 하는데 사용할 yml 파일을 만든다. 이름은 자유롭게 지으면 된다.
(여기선 deploy.yml이라 썼다. gradle은 빌드 및 테스트용 워크플로우)
1-2. 마켓플레이스에서 헤로쿠 배포 액션 택하기
프로젝트 상단 탭의 Actions로 가 New workflow 버튼을 클릭하면 아래와 같은 화면이 뜬다.
이번엔 마켓플레이스에서 액션을 가져올 예정이기에 set up a worflow yourself 를 클릭한다.
마켓플레이스에 Deploy to Heroku를 검색한다.
클릭하면 복사할 수 있는 action이 뜬다. 해당 액션은 yml에서 steps 하위에 붙이면 된다.
1-3. 배포 워크플로우 작성하기
프로젝트에 맞춰 필요한 정보를 입력한다.
아래는 헤로쿠 배포를 하는 데 있어 필수로 입력해야 하는 것만 적어놓은 것이다.
>> heroku_app_name
헤로쿠 앱 이름으로 heroku 에서 생성해야 한다. 고유값이어야 하므로 app 생성 후에 적는 걸 추천한다.
>> buildpack
헤로쿠에서 프로젝트를 빌드할 때 필요한 팩이다. 여기서 목록을 확인할 수 있다.
이 프로젝트는 gradle을 쓰고 있기에 heroku-buildpack-gradle을 사용한다. 해당 빌드팩의 깃허브 주소를 입력해넣으면 된다.
깃허브 주소는 빌드팩 우측에서 확인할 수 있다.
>> branch
트리거가 걸리면 배포할 때 보게 될 브랜치를 적는다.
>> appdir (옵션)
루트 경로가 아닌 특정 파일 안에 gradle 파일 및 src 디렉토리가 있다면 appdir을 지정해야 한다.
이 프로젝트는 escahp라는 파일 안에 모아넣었기 때문에 appdir를 escahp로 지정했다.
>> procfile
프로젝트에 procfile을 직접 적어넣는 방법도 있지만 여기선 action에 직접 기입하는 방법을 썼다.
배포용 application.yml과 고정 포트를 정해놓은 걸 감안하여 실행 명령어를 작성하였다.
2-1. heroku app 생성
이제 헤로쿠에서 앱을 생성해야 한다. 회원가입을 해야 사용할 수 있다.
회원가입을 하면 대쉬보드가 있는 홈으로 오게 되는데, 여기서 New - Create new app 버튼을 클릭한다.
app name을 지정하고(고유값만 가능하다) 앱을 생성한다.
region은 건드리지 않아도 된다. (us와 europe밖에 없는데 별 차이가 없다...)
앱을 생성하면 대쉬보드에서 가지고 있는 앱과 파이프라인 목록을 확인할 수 있다.
위부터 순서대로 파이프라인, 활성화된 앱, 비활성화된 앱이다.
2-2. api key, email을 github secrets에 등록
앞서 1-3에서 배포 워크플로우를 작성할 때 heroku_api_key와 heroku_email을 github secret에 등록된 키로 사용했다.
api key와 email은 노출되면 해킹의 여지가 있기에 보안을 위해 숨겨야 한다.
헤로쿠 이메일은 앱을 소유한 계정의 이메일로,
헤로쿠 api key는 대쉬보드에서 오른쪽 상단의 프로필 사진을 눌렀을 때 나오는 Account settings 에서 확인할 수 있다.
아래로 쭉 내려가면 API Key가 있다. Reveal을 클릭하면 key 값이 드러나는데 이걸 사용하면 된다.
이제 프로젝트가 있는 깃허브 레포지토리로 돌아가자.
Settings - Security - Secrets - Actioins 로 가면 아래와 같은 화면을 볼 수 있다.
여기서 시크릿키를 만들려면 우측 상단의 New repository secret 버튼을 누르면 된다.
Name에 github actions에서 명시할 키 값을, Secret에는 숨겨야할 값을 적어넣는다.
github actions에서는 키를 소문자로 부르기 때문에 Name의 대소문자 여부는 중요하지 않다.
다만 상수이기에 대문자를 쓰는 경향이 있다.
Add secret을 하면 Repositort secrets에서 등록된 시크릿키를 확인할 수 있다.
여기서 주의할 점은, 한번 등록된 시크릿키는 값을 다시 확인할 수 없다. 쓰여야 할 곳이 또 있다면 다른 곳에도 기재해놔야 한다.
이렇게 시크릿키를 만들어두면 아래처럼 github actions에서 {{ secrets.등록한_시크릿키_이름 }} 으로 값을 불러올 수 있다.
여기까지 왔으면 워크플로우는 완성한 것이다.
2-3. (옵션) 무료 도메인 등록
heroku 서버에 도메인을 쓰고 싶으면 신용카드를 등록해야 한다. 등록 방법은 여기 참고.
(신용카드를 등록하면 서버 가용시간도 1000시간으로 늘어나고 도메인을 등록할 수 있는 등 혜택이 많으니 참고하길 바란다.)
간단하게 무료 도메인을 사용하고 싶으면 내도메인.한국에 회원가입 후 도메인 이름을 검색하여 마음에 드는 도메인을 등록한다.
도메인 관리 탭에서 가지고 있는 도메인과 만료일을 알 수 있다.
도메인을 등록한 후에는 heroku로 가 도메인을 등록할 앱의 settings 로 들어간다.
하단의 Domains에서 add domain을 클릭한 후, 등록한 도메인을 입력한 후 생성한다.
SSL Certificate는 안 건드려도 된다. (SSL은 유료 플랜부터 사용 가능하다.)
그럼 아래처럼 도메인명과 함께 DNS Target이 뜬다.
오른쪽의 편집(연필 아이콘)을 누르면 타겟의 풀주소를 알 수 있는데,
해당 타겟 주소를 복사해야 한다.
이제 도메인에 DNS 주소를 연결해주면 된다.
내도메인.한국 - 도메인 관리 - 등록한 도메인의 [수정] 을 클릭
고급설정 칸에서 별칭(CNAME)의 체크박스를 표시하고 아래와 같이 두개의 별칭을 만든다.
하나는 앞에 www가 붙고 다른 하나는 빈 칸으로 둔다.
두 별칭 모두 heroku에서 복사한 DNS target 주소를 붙여넣은 후 저장한다.
반영되기까지 시간이 5-10분 걸릴 수도 있다고 하니 참고하자.
3. merge 하여 워크플로우가 제대로 돌아가는 확인하기
워크플로우가 완성되었으면 트리거를 걸어 워크플로우가 진행되는 걸 확인할 수 있다.
여기선 develop에 push가 일어나면 워크플로우가 돌기 때문에, PR을 머지한 후 상태를 확인할 수 있다.
위의 Task 중 Deploy to Heroku가 진행될 때 heroku의 앱 Overview에서도 빌드의 진행/성공 여부를 확인할 수 있다.
배포가 완료되면 적절한 api 콜에 응답이 오늘 걸 확인할 수 있다.
등록한 도메인을 통해 보거나 heroku에서 앱 대쉬보드에 들어가 Open app을 클릭하면 된다.
(app 주소는 기본적으로 앱이름.herokuapp.com 이다)
4. 참고자료
github action과 heroku를 이용한 스프링부트 자동화 빌드/배포
5. 후기
github actions를 이용해 빌드 및 테스트부터 배포까지 해보았다.
최대한 간단하게 만드려 했음에도 처음이라 인프라를 구축하는데 2-3일 걸린 것 같다.
그래도 생각보다 재미있었고 CI/CD와 좀 더 가까워진 것 같아 만족했다.
추후에 기회가 된다면 jenkins나 EC2를 사용해 배포를 해보고 싶다.
다음번엔 스프링 프로젝트에서 S3를 사용하는 방법을 올려보겠다.