이전 게시글에서는 self hosted 방식으로 Github Action workflow dispatch 는 설명드렸습니다.
이번에는 귀찮게 self hosted 가 아닌 github actions 만으로 설정하는 방법을 기록하려고 합니다.
workflow dispatch 가 무엇인지 궁금한 사람은 https://cwbeany.com/tip_dev/78 해당 링크에 가서 참고하세요~
이번에도 테스트는 제가 개인 프로젝트로 진행 중인 Qosmo-API를 대상으로 생성할 예정입니다.
https://github.com/cwadven/Qosmo-API/actions
선 작업이 필요합니다.
1. 로컬에서 ssh 키 발급 (비밀키, 공개키)
2. 접속할 서버에 ssh 공개키 등록
3. 발급된 비밀키를 이용해서 github action 을 돌릴 때 사용을 위한 Secret 등록
명령어는 간단합니다.
ssh-keygen -t ed25519 -C "github-action-deploy"
저는 그냥 전부 Enter 키 쳤습니다.
그러고 발급된 ssh 키 정보를 보기 위해 폴더를 들어갑니다.
cd ~/.ssh
ls
그러면 발급된 ssh 키 정보를 볼 수 있습니다.
이제 발급된 정보 id_ed25510 <-- 비밀키 / id_ed25510.pub <-- 공개키 를 가지고 작업을 해야합니다.
(저는 이름을 바꾸지 않았습니다.)
발급 받은 id_ed25510.pub 공개키를 가지고 서버에 등록하도록 하겠습니다.
우선 공개키의 내용을 접근해서 복사합니다.
cat id_ed25519.pub
아래와 같은 내용이 나올 것입니다.
ssh-ed25519 XXXXXXXXXXX github-action-deploy
필자는 google cloud 를 이용해서 서버를 구동하고 있기 때문에 해당 서버에 들어가서 sudo su - 에 root 쪽에 해당 공개키를 등록하려고 합니다.
sudo su -
cd ~/.ssh
ls
그러면 authorized_keys 라는 게 있습니다.
authorized_keys
여기 안에 복사한 공개키 id_ed25510.pub 정보를 넣도록 하겠습니다.
echo "ssh-ed25519 AAAAC3N... github-action-deploy" >> /root/.ssh/authorized_keys
이제 github action 을 돌릴 때, 비밀키로 배포하려는 서버에 접근하기 위해서 github action Secret 을 등록합시다.
등록 방법은 Settings 에 들어가서 Secrets and variables > Actions 로 들어갑니다.
New repository secret 을 클합니다.
이제 필요한 정보를 입력합니다.
참고로 입력할때
-----BEGIN OPENSSH PRIVATE KEY-----
XXXX
-----END OPENSSH PRIVATE KEY-----
처럼 BEGIN 이랑 END 부분도 같이 들어가야합니다.
만약 아래 있는 제가 작성한 yml 파일을 쓰려면 TOKEN 이나 PRODUCTION_PROJECT_FILE_PATH 환경변수도 입력해주세요~! (yml 파일은 참고만 해주세요~)
TOKEN (github token) 발급은 아래 게시글 내용에 있습니다.
https://cwbeany.com/tip_dev/78
프로젝트 루트 디렉터리에 .github/workflows/deploy.yml
파일을 생성합니다.
deploy.yml 파일
name: Deploy to GitHub Runner
on:
workflow_dispatch:
inputs:
deployment-type:
type: choice
description: 'Which server to deployment type'
required: true
default: 'production'
options:
- production
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
DJANGO_SETTINGS_MODULE: "config.settings.production"
jobs:
checkout:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
deploy:
needs: checkout
runs-on: ubuntu-latest
steps:
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
echo "🚀 Starting deployment process..."
echo "📂 Changing to project directory..."
cd ${{ secrets.PRODUCTION_PROJECT_FILE_PATH }}
echo "🔄 Fetching latest changes from git..."
git fetch origin
echo "🔍 Checking out to ${{ github.ref }}..."
git checkout ${{ github.ref }}
echo "⬇️ Pulling latest changes..."
git pull origin ${{ github.ref }}
echo "🐍 Activating virtual environment..."
. venv/bin/activate
echo "📦 Installing/updating dependencies..."
pip install -r requirements.txt
echo "📝 Collecting static files..."
python manage.py collectstatic --noinput
echo "🗃️ Running database migrations..."
python manage.py migrate --noinput
echo "⏰ Updating cron jobs..."
fab2 update-crontab
echo "📅 Installing cron jobs..."
cat command.cron | sudo crontab -
sudo /etc/init.d/cron reload
echo "🌿 Restarting Celery..."
sudo /etc/init.d/celeryd restart
echo "🌐 Restarting web servers..."
sudo systemctl restart nginx
sudo systemctl restart gunicorn
echo "✅ Deployment completed successfully!"
잘 완성 됐습니다~!