Github Action Workflow 작성하기

yujuck·2024년 1월 19일
0

CI CD 구축하기

목록 보기
6/6
post-thumbnail
post-custom-banner

Github Actions 에 대해 알아본 글에서 Workflow를 정리하면서 어떤 식으로 파일이 만들어지는지 정리가 되었다.

이렇게 job > step > action 으로 구성이 된다.

workflow 기본 설정

job을 작성하기 전에 workflow의 이름이나 이 workflow가 언제 실행되어야 하는지 설정해야한다. (이름 설정은 optional)

name: Deploy to AWS EC2 Dev Server

on:
	push:
		branches:
			- dev

이름 설정은 optional이지만 리포지토리 Action 탭에서 볼 때 workflow 이름도 나오기 때문에 구분을 위해 설정해주었다. 없으면 파일 이름으로 나오긴 함..!

그리고 workflow가 실행될 트리거를 설정하는 부분이 on: 부분이다.
일단 개발 브랜치에 push될 때 workflow가 실행되기를 원해서 위처럼 작성하였다.
push 외에 다른 이벤트도 있고, branch 도 지정할 수 있는데 branch가 어떤거든 상관없이 workflow를 실행시키려면 branches 부분은 삭제하면 된다.

job 설정

이제 workflow가 실행시킬 작업에 대해 설정하면 된다.
우리는 docker 이미지를 빌드해서 만들어놓은 뒤, 서버에서 해당 이미지를 실행시키려고 한다.

job은 한 개 이상으로 만들 수 있어서 build와 deploy 라는 두 개의 job을 만들었다.
deploy는 build가 실행된 다음에 진행되어야 하기 때문에 needs 라는 키워드로 build 단계 이후에 실행된다는 것을 넣어줘야 한다.

jobs:
	build:
		.
		.
	deploy:
		needs: build
		.
		.

두 개의 작업 모두 어디서 실행할지 runner 설정을 해줘야 하는데, 우리는 우리가 만들어놓은 self-host runner를 사용하려고 한다.

jobs:
	build:
		runs-on: self-hosted
		.
		.
	deploy:
		needs: build
		runs-on: self-hosted
		.
		.

step, action 설정

이제 각각의 job에서 실행할 step, action을 설정하면 된다.

build

build:
	runs-on: self-hosted
	steps:
		- name: Checkout Repository
		  uses: actions/checkout@v3

		- name: Login to Docker Hub
		  uses: docker/login-action@v3
		  with:
			registry: ghcr.io
			username: ${{ secrets.DOCKERHUB_USERNAME }}
			password: ${{ secrets.DOCKERHUB_PASSWORD }}

		- name: Build and Push Docker Image
		  uses: docker/build-push-action@v5
		  with:
			context: .
			file: ./Dockerfile.dev
			push: true
			tags: <이미지이름>:<태그>

여러번의 에러와 실패를 겪으면서 만든 build 작업..
빌드 캐시도 적용해야하고 다른 step 넣을 게 있을 것 같지만 그런 것 제외하고 제일 기본적인 내용만 적어보았다. 이렇게 만드는 것까지만 해도 몇번의 실패와 에러가 있었음..ㅠ

ghcr.io

회사 프로젝트의 docker 이미지를 public하게 올리면 안되기 때문에 어떻게 해야하나 검색을 해보니 ghcr이라는게 있었다.

ghcr은 Github Container Registry의 약자로 우리의 이미지를 private 하고 업로드 해놓을 수 있게 해준다.

우선 이걸 사용하려면 권한 설정이 필요하기 때문에 access token을 만들어줘야한다.
github 프로필 > Settings > Developer settings > Personal access tokens > Tokens 로 가서 토큰을 하나 생성해준다.
패키지를 write, read, delete만 하면 되기 떄문에 다른 scopes 는 선택 안해도 괜찮고 write:packages, delete:packages 만 선택해도 된다.

이렇게 해서 만든 access token 은 위의 step 에서 사용해야하기 때문에 잘 저장해두자!

secrets

노출되면 안되는 변수들은 .env 파일에 환경변수로 관리가 되고 github에 올라가지 않게 .gitignore로 제외시켜주는데, workflow를 실행할 때 그런 값들이 필요해질 수 있다.
그럴 때 사용하는게 secrets인데, repository에서 외부에 노출시키지 않고 사용할 값들을 설정할 수 있다.

repository의 Settings > Secrets and variables > Actions 로 가면 Repository secrets 부분에서 New repository secret을 클릭해 추가할 수 있다.
업로드중..

각 step 설명

- name: Checkout Repository
  uses: actions/checkout@v3

가장 기본이 되는 단계인데, github 리포지토리를 runner가 실행되고 있는 서버로 내려받는 동작을 한다. github에서 제공하고 있는 action이다.

- name: Login to ghcr
  uses: docker/login-action@v3
  with:
	registry: ghcr.io
	username: ${{ secrets.DOCKERHUB_USERNAME }}
	password: ${{ secrets.DOCKERHUB_PASSWORD }}

docker/login-action@v3 액션으로 ghcr에 로그인하는 단계다.
로그인을 하려면 username, password 가 필요한데, username은 아까 access token을 만든 계정의 이름, password는 access token을 넣어주면 된다.

username을 github.repository_owner로 사용하는 글들도 봤는데 회사의 경우 repository 소유자가 회사 이름이라 그렇게 하면 오류가 나서 공용 계정으로 토큰을 만들고 그 공용 계정의 이름과 토큰으로 secrets를 설정해주었다.

- name: Build and Push Docker Image
  uses: docker/build-push-action@v5
  with:
	context: .
	file: ./Dockerfile.dev
	push: true
	tags: ghcr.io/<repository owner>/<이미지이름>:<태그>

docker/build-push-action@v5 액션을 사용해 docker 이미지를 build, push 하는 단계이다.
현재 repository를 내려받은 위치에 있기 때문에 context는 현재 위치 (.)으로 하고, 미리 만들어놓은 Dockerfile.dev를 이미지를 만드는 데 사용하려고 한다.
tags를 설정하는 부분에서 몇번씩 에러가 났었는데...
1. repository owner 잘 넣어주기
2. 소문자로 만들어주기
이 두가지를 잘 지키면 에러 없이 잘 될거다..

deploy

deploy:
	needs: build
	runs-on: self-hosted
	steps:
		- name: Login to Docker Hub
		  uses: docker/login-action@v3
		  with:
			registry: ghcr.io
			username: ${{ secrets.DOCKERHUB_USERNAME }}
			password: ${{ secrets.DOCKERHUB_PASSWORD }}
		
		- name: docker compose pull and up
		  run: |
			<실행 명령어>
			<실행 명령어>
			.
			.

deploy는 build가 다 진행되면 시작된다.

먼저 이미지를 pull 받을 수 있게 로그인을 먼저 해주고 다음 step을 진행하면 된다.

- name: docker compose pull and up
  run: |
	<실행 명령어>
	<실행 명령어>
	.

run은 서버에서 실행시킬 script를 지정하는 키워드이고, 여러 명령어를 적을 수 있다.
우리는 서버에 실행시킬 어플리케이션 별로 폴더를 만들어서 docker-compose.yaml과 환경변수 파일을 만들어준 다음 해당 위치에서 docker-compose 명령어로 container를 실행시키려고 한다.
그래서 위의 내용을 명령어로 작성시켜두었다.

run: | 
	cd ~/RestApi
	docker-compose pull
	docker-compose up --force-recreate -d --build --quiet-pull

완성 후

docker image 생성, github action workflow 작성까지 하고 나면 이제 빌드에서 배포까지 push 이벤트 트리거로 진행이 된다.
근데 이제 build 단계에서 서버의 cpu가 거의 풀로 찬다던가(인스턴스가 작긴 함) 도커 이미지 크기가 너무 크다던가 하는 문제에 대해서는 좀 더 수정을 거쳐야 할 것 같다.

그래도 역시 만들어놓고 보니 편하긴 하다!

profile
알게 된 내용 부담 없이 남기기
post-custom-banner

0개의 댓글