Sangmun

github action으로 google cloud에 CI/CD 환경 구축하기 본문

개발/github

github action으로 google cloud에 CI/CD 환경 구축하기

상상2 2023. 2. 12. 17:53

구글 클라우드의 compute engine에 간단한 fastapi 어플을 띄우고 이를 github action을 통하여 간단한 CI/CD 환경을 구축하는것을 정리해보고자 한다.

 

Compute engine에 접속할 secret을 github repo에 등록하기

먼저 compute engine에 접속하여 다음과 같은 명령어를 입력하여 rsa key를 생성을 해준다. rsa key 생성은 굳이 compute engine에서 실행하지 않아도 된다.

ssh-keygen -t rsa -b 4096 -C [your_email]

다음은 cat으로 생성한 public key를 확인해주고 이를 복사하여

GCP  콘솔의 Compute engine > 설정 > 메타데이터 항목에서 SSH키에 추가를 해준다. 정상적으로 키가 입력이 되었으면 사용자 이름은 자동으로 입력이 된다. 

또한 아래의 명령어로 public key를 authorized_keys로 복사를 해준다.

cat id_rsa.pub >> authorized_keys

기본적으로 authorized_keys에 퍼블릭 키가 등록되면 외부에서 접근이 가능해진다. 단 GCP는 주기적으로 authorized_keys 파일을 삭제해서 외부에서 키파일을 등록하는 과정이 필요하다.

 

다음으로는 Compute engine에서 운영할 어플의 소스코드 github 저장소로 이동을 하여 Settings > Secrets > Actions로 이동을 하여 New repository secret을 클릭하여 우리의 Compute engine으로 접속하는 key들을 저장을 해준다.

생성이 필요한 secrets는 총 3개이다.

HOST : Compute engine의 IP 주소

USERNAME : Compute engine의 사용자 이름(터미널에서 맨 왼쪽에 뜨는 이름)

SSH_KEY : 위에서 생성한 rsa private key

생성된 secrets는 github action에서 아래와 같이 활용이 된다.

Compute engine에서 fastapi 어플 띄우기

아래의 명령어를 실행하여 python 환경과 fastapi를 설치

# 업데이트 및 파이썬 설치
sudo apt-get update
sudo apt-get install python3.8-venv -y

# repository clone 및 python 가상환경 설치
git clone [repository url]
cd [repository]
python3 -m venv fastapi
source fastapi/bin/activate

# fastapi 설치
pip install fastapi
pip install "uvicorn[standard]"

# github action간 추가인증이 없도록 하는 명령어
git config --global credential.helper store

다음으로 간단한 fastapi script를 작성해준다 fastapi 공식 문서에 있는 코드를 가져왔다.

# main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

그 다음 fastapi를 run 해준다.

uvicorn main:app --reload --host=0.0.0.0 --port=8000

이렇게 하고 현재 돌아가고 있는 Compute engine의 IP:8000으로 접속을 하면 접속이 안되는데 이는 Compute engine의 기본 방화벽이 있기 때문이다. 따라서 우리가 접속할 포트는 방화벽 정책에서 허용을 해주어야 한다.

 

Compute engine 인스턴스 목록에서 오른쪽 아래의 방화벽 규칙 설정으로 이동을 한다.

이동을 해서 확인해보면 현재 방화벽 규칙을 적용을 하려는 instance-1 Compute engine은 네트워크 태그가 없는것을 확인할 수 있다. 이부분이 추가가 필요한 부분이다.

방화벽 규칙 추가 기능으로 이동을 하면 아래와 같이 작성이 필요한 부분을 작성을 해주면 된다.

IPv4의 소스 IPv4는 현재 예제에서는 0.0.0.0/0로 추가를 하였지만 이는 모든 접속을 허용한다는 의미로 실무에서는 진짜로 허용할 IP만 허용을 해야한다.

포트는 fastapi가 사용할 8000포트만 열어주었다.

따라서 위의 설정대로 설정을해서 만들기를 누르면 아래와 같은 방화벽 규칙이 생긴것을 확인할 수 있고 

해당 방화벽 규칙을 네트워크 태그에 추가를 해준 후 다시 IP:포트로 접속을 해보면 다음과 같이 접속이 되는것을 확인할 수 있다.

CI/CD 환경을 만들기

CI/CD 환경을 구축하기 위하여 간단한 github action 파일을 작성해 보았다.

 

main branch의 모든 파일에 대하여 변경이 감지되면 해당 action이 실시가 된다.

name: CICD-SSH
on:
  push:
      branches: [ main ]
      paths:
        - '**'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: executing remote ssh commands using ssh key
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }} 
        username: ${{ secrets.USERNAME }}
        key: ${{ secrets.SSH_KEY }}
        port: 22
        script: |
            cd ${{ github.event.repository.name }}
            pwd
            sh deploy-ssh.sh

deploy-ssh.sh 파일 내용은 아래와 같다. 정말 간단하다 단순히 main brach에서 푸시된 코드내용을 git pull 해서 내용을 업데이트 하는것 뿐이다. fastapi는 autoload가 됨으로 서버를 재시작하지 않아도 알아서 업데이트된 코드로 서버가 돌아간다.

#!/bin/bash
git pull origin main

github action의 디테일에 들어가서 확인해보면 작업이 성공적으로 수행된 로그기록도 확인이 가능하다.

https://github.com/appleboy/ssh-action#setting-up-ssh-key

 

GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.

GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.

github.com

 

'개발 > github' 카테고리의 다른 글

github action 기본사항  (0) 2023.02.12
git 파일 복구  (0) 2023.01.18
git simulation  (0) 2022.12.31
git reset, git revert  (0) 2022.12.28
vscode에서 git 사용하기 + 유용한 extention들  (0) 2022.12.18
Comments