[CI/CD] Git Action 으로 EC2 배포 자동화 (feat.appleBoy)

HYEONGWOO IM·2024년 2월 29일

EC2 인스턴스 생성 등은 생략 하겠습니다.

1. deploy 브랜치 생성 및 클론

main브랜치를 배포 브랜치로 써도 되지만 deploy 배포 브랜치를 따로 하나 만드는 것을 추천

브랜치 이름을 잘 설정해서 브랜치를 하나 만들어 주고,
deploy브랜치를 ec2 내부에서 클론 받아줍니다.

2. GitAction

# This is a basic workflow to help you get started with Actions

name: deploy

name 은 워크플로우 이름을 설정하는 것 입니다. deploy로 설정 하였음.
다른이름으로 해도 됩니다.

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches:
      - deploy

워크플로우가 실행 될 조건을 설정하는 것으로
deploy 브랜치에 push가 됐을 때 해당 워크플로우를 실행합니다.

jobs:
  SSH:
    runs-on: ubuntu-latest

이제부터 작업을 정의합니다.
SSH여기서 작업의 이름을 정의하면 되는데 deploy 등 원하는 이름을 사용해도 됩니다.
runs-on은 이 워크플로우를 실행할 환경인데 최신의 ubuntu 로 해주었습니다.

 steps:
      - uses: actions/checkout@v2
      - name: Run scripts in server
        uses: appleboy/ssh-action@master
        with:
          key: ${{ secrets.ACCESS_KEY }}
          host: ${{ secrets.HOSY }}
          username: ${{ secrets.USERNAME }}
          script: |
            cd tscenping
            git reset --hard
            git fetch
            git pull
            npm i
            npm run build

steps: 작업의 단계를 정의하는데
먼저 uses: actions/checkout@v2 는 깃 허브 레포지토리를 체크아웃 하고 actions/checkout 의 v2 버전을 사용
name:Run scripts in server 는 서버에서 스크립트를 실행하는 단계 Run scripts in server 이 스크립트 이름이 됨
uses: appleboy/ssh-action@master 는 SSH를 사용해 원격 서버에 연결하여 실행하기 위함인데 appleboy의 ssh-action master브랜치를 사용합니다.
with: 부분에서 액션에 대한 입력 매개변수를 넣어주면 되는데
저는 key, host, username만 사용하였습니다.

https://github.com/appleboy/ssh-action
해당 링크에 appleyboy의 설명이 있으니 참고 바랍니다.

key

key는 ec2 내부에서 ssh key를 가져오면 되는데

ssh-keygen -t rsa -b 4096 -C "email@example.com"

해당 커맨드를 ec2 내부에서 실행하게 되면 키가 생성됩니다 경로는 .ssh폴더 인데 ls -al 을 통해 확인할 수 있습니다.

cd .ssh 를 해서 .ssh폴더로 이동을 해줍니다.

그럼 id_rsa, id_rsa.pub, authorized_keys 가 있을텐데

cat id_rsa >> authorized_keys

해당 커맨드를 입력해서 authorized_keys 파일 뒤에 id_rsa를 이어붙여 줍니다.

그리고

cat id_rsa.pub

이게 key값인데 git에 추가를해주어야 하니 출력된 내용을 복사해서 메모장에 적어놔 줍니다.

host

host 는 인스턴스의 퍼블릭 IPv4 주소 입니다.
aws에서 확인 후 복사해서 메모장에 붙여놔 줍니다.

username

username 은 ec2에 username입니다. 터미널에 뜨는 @옆 이름이라고 생각하면 됩니다.
그것도 메모장에 적어놔 줍니다.

3. github secret key

deploy 브랜치가 있는 레퍼지토리로 와줍니다.

settings 를 클릭해주고

왼쪽 메뉴들 중

Security 탭의 Secret and variables 의 Actions로 가줍니다.

거기서 내리시면 Repository secrets가 있는데 여기서 New repository secret을 클릭해 줍니다.

총 3개
HOST, USERNAME, KEY를 만들건데
각각에 내용으로는 메모장에 붙여놨던 것들을 넣어줍니다.

          key: ${{ secrets.ACCESS_KEY }}
          host: ${{ secrets.HOSY }}
          username: ${{ secrets.USERNAME }}

위에서 보여드린 이 부분에서 ACCESS_KEY부분에 KEY를
HOSY부분에 HOST를
USERNAME부분에 USERNAME을 넣어주시면 됩니다.
저는 네임에 오타가 있었는데 그냥 사용합니다.

이렇게 설정을 해주시면 디플로이 브랜치에 무언가 푸시될 시 ec2에 ssh로 접속하는 동작을 하게 됩니다.

그럼 이후에

          script: |
            cd tscenping
            git reset --hard
            git fetch
            git pull
            npm i
            npm run build

script를 만들어서 동작할 코드들을 작성해주시면 됩니다.

저는 혹시 ec2 내부에서 코드 수정이 이루어 졌을 경우를 대비해 reset을 하게 해줬고 이미 deploy브랜치 이기 때문에 deploy 브랜치를 pull 받은 뒤 npm i
npm run build 를 하게 해주었습니다.
저 같은 경우 nginx로 html파일을 뿌려주고 있어 빌드만 해주면 알아서 배포파일이 바뀝니다.

0개의 댓글