이 글에서는 Github Action에 대해서 이해해보고 cloudtype 플랫폼을 사용해 cd까지 연결해보는 글입니다.
Github Actions
Github Actions는 깃허브에 내장된 CI/CD 도구라고 이해하면 됩니다. Jenkins, Travis CI 등의 도구가 비슷하다고 할 수 있을 것 같습니다.
깃허브 내장이다보니 깃허븐와의 통합이 쉽고, CI/CD 서버가 내장되어 CI/CD 서버를 따로 구축할 필요 없다는 점이 장점입니다. 또한, 일정 스펙까지는 무료이기 때문에 공부하기에도 좋습니다. 무료 버전은 스토리지 500MB, 월 2000분이 무료입니다.
Github Actions를 동작시키려면은 repository의 `.github/workflows` 디렉토리에 필요한 Actions 파일들을 yaml 형식으로 작성해놓습니다. 작성된 actions 파일들을 github에서 자동으로 실행하여 CI/CD가 구축됩니다.
Github actions에서 CI
Github actions에서는 feature/에서 dev으로 합쳐질 때 test를 통과한 코드만 merge되도록 하여 오류를 방지하고 안정적인 코드만 배포할 수 있도록 설정이 가능합니다.
다음은 예시 yml 파일입니다.
# Actions 이름 github 페이지에서 볼 수 있다.
name: 'CI'
# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on:
push:
# 배열로 여러 브랜치를 넣을 수 있다.
branches: [ develop, feature/* ]
# github pull request 생성시
pull_request:
branches:
- develop # -를 쓴 여러 줄로 여러 브랜치를 명시하는 것도 가능
# 실제 어떤 작업을 실행할지에 대한 명시
jobs:
ci:
# 스크립트 실행 환경 (OS)
# 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
runs-on: [ ubuntu-latest ]
# 실제 실행 스크립트
steps:
# uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
- name: checkout
uses: actions/checkout@v4
# with은 plugin 파라미터 입니다. (java 11버전 셋업)
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
# run은 사용자 지정 스크립트 실행
- name: run unittest
run: |
./gradlew clean test
Github actions에서 CD
배포를 자동화하는 작업을 기술할 수 있으며 빠르고 간편하게 배포가 가능합니다. main 브랜치에 코드가 통합되었을 때 운영 환경에 빠르게 배포가 가능해집니다.
main 브랜치는 감시당하며 merge되었을 경우 gradle test가 실행되고 main 브랜치 기준으로 jar 파일이 생성됩니다. 이 jar 파일을 운영 서버 aws, gcp 등에 배포를 해줄 수 있습니다.
다음은 예시 yml 파일입니다.
name: 'CD'
on:
push:
branches: [ main ]
jobs:
cd:
runs-on: [ ubuntu-latest ]
steps:
- name: checkout
uses: actions/checkout@v4
- name: java setup
uses: actions/setup-java@v3
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
- name: run unittest
run: |
./gradlew clean test
- name: deploy to heroku
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "sampleapp-github-actions" #Must be unique in Heroku
heroku_email: "nbcdocker@proton.me"
Github actions의 진행 과정
맨 위 Repository는 우리의 프로젝트가 저장된 Repository를 의미한다. 다음 workflows는 위에서 우리가 알아본 workflows/ 디렉토리에 저장하는 yml파일들을 의미한다. 다음 jobs는 우리가 각 workflow에서 명시해둔 일들을 의미하는데 job들은 각각 가상화 머신에서 따로 병렬로 진행될 수 있으며 따로 설정을 해주면 순차적으로 실행되도록 만들 수도 있다. 마지막으로 각 job들은 각 머신에서 순서대로 step by step으로 진행된다.
우리가 정해놓은 event 가 발생하면(위 코드에서는 push 특정 branch) Runner(가상화 머신)에서 우리가 지정해놓은 job들을 순차적으로 진행한다. 위 그림에서 Runner1과 Runner2가 순차적인 것처럼 그려져있지만 둘다 각자 분리된 가상화머신이므로 동시에 실행될 수 있다.
Workflow 구조 이해하기
name: 'CD' # github actions의 이름을 정하는 부분
on: # 이 action이 언제 실행되는지에 대한 부분
push:
branches: [ main ]
jobs: # 실제 실행할 내용에 대한 부분
cd:
runs-on: [ ubuntu-latest ] # 어떤 환경에서 실행하는지 기술
steps: # 실제 실행할 단계들을 기술
- name: checkout # 실행에 표시될 이름
uses: actions/checkout@v4 # 여러 가지 plugin 사용
- name: java setup
uses: actions/setup-java@v3
with: # plugin 에서 사용할 파라미터들
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
- name: run unittest
run: | # 실제로 실행할 스크립트
./gradlew clean test
- name: deploy to heroku
uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: "sampleapp-github-actions" #Must be unique in Heroku
heroku_email: "nbcdocker@proton.me"
- runs-on: 어떤 환경에서 실행하는지 기술
GitHub 호스팅 실행기 정보 - GitHub Docs
GitHub는 워크플로를 실행하는 호스팅 가상 머신을 제공합니다. 가상 머신에는 GitHub Actions에서 사용할 수 있는 도구, 패키지 및 설정 환경이 포함되어 있습니다.
docs.github.com
- uses: 여러 가지 plugin 사용
- 다양한 action들을 사용 - https://github.com/marketplace?type=actions
GitHub Marketplace: actions to improve your workflow
Find the actions that help your team build better, together.
github.com
Cloudtype으로 배포해보기
1. Cloudtype 가입하기
https://app.cloudtype.io/auth/signup 클릭 후, github 계정으로 가입하기 클릭
모두의 플랫폼팀, 클라우드타입
클라우드타입은 클라우드 기반 애플리케이션을 빠르게 개발하고 배포할 수 있는 클라우드 애플리케이션 플랫폼입니다.
cloudtype.io
2. 결제 카드 등록 후 무료 요금제 활성화
오른쪽위 프로필을 눌러서 구독 결제 탭으로 들어가 본인 카드 등록
성공시 구독내역에 프리티어라고 뜸.
3. github - cloudtype 을 연결하기 위한 설정 - GitHub Personal Token 발급하기
https://github.com/settings/tokens 로 이동해서 본인 토큰 만들기
티스토리가 저장이 안되서 다시 찍느라 본인은 이미 존재함.
repo, admin:public_key 체크하고 이름 짓기
토큰은 한번만 확인할 수 있으므로 메모장같은곳에 잘 보관.
3. github - cloudtype 을 연결하기 위한 설정 - cloudtype 의 API Key 발급
환경설정 인증 탭가서 새로운 api 키 발급
보관해둘것 이것도 한번만 확인가능
4. Cloudtype 시작하기
홈화면으로 가서 + 버튼 누르고 시작하고 내 깃허브 저장소로 배포하기 클릭
계속 이어 진행. 본인이 하고싶은 repository 클릭
유의해야 할점이 보통은 application.yml 이 github 레포에 없을 것이므로 application.yml을 배포시 주입해줄 단계가 필요함.(secretkey 등..)
5. github - cloudtype 을 연결하기 위한 설정 - 토큰 넣어주기
본인 저장소 세팅가서 지금만든 api 키와 github personal token 저장하기
6. Github Actions 설정하기
"프로젝트 레포지토리/.github/workflows/" 안에 다음 파일을 넣어 세팅. 프로젝트에 부족한 파일이 있다면 추가로 설정해줘야 함.
# test-pr.yml
name: test every pr
on:
workflow_dispatch:
pull_request:
permissions:
contents: read
pull-requests: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: setup jdk
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: gradlew test
run: ./gradlew test
name: Deploy to cloudtype
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Connect deploy key
uses: cloudtype-github-actions/connect@v1
with:
token: ${{ secrets.CLOUDTYPE_TOKEN }}
ghtoken: ${{ secrets.GHP_TOKEN }}
- name: Deploy
uses: cloudtype-github-actions/deploy@v1
with:
token: ${{ secrets.CLOUDTYPE_TOKEN }}
project: # 워크스페이스 이름/프로젝트 이름 ex) nbc.docker/cicd
stage: main
yaml: |
name: # 프로젝트 이름 ex) `cicd`
app: java@17
options:
ports: 8080
context:
git:
url: git@github.com:${{ github.repository }}.git
ref: ${{ github.ref }}
preset: java-springboot
설정해주면 간단한 프로젝트의 경우에는 배포가 자동으로 진행됨. 위에서 언급했던 aws secret key나 database url 값등을 넣어줄 방법을 본인이 찾아야함.
7. cloudtype 가서 확인하기
위 설정을 깃허브에 만들면 다음과 같이 배포가 진행됨
p.s. 기존에 작성하던게 다 날라가서 다시 작성하느라 부족한 부분이 많음. 티스토리... 이놈... 하..