이제 깃허브 액션을 사용해서 main 브랜치가 푸쉬되면 배포서버에도 개발서버와 같이 환경 세팅이 되도록 세팅하겠습니다.

우선 .github/workflows/init_and_deploy.yaml 파일생성
name: Initialization and Deployment Workflow
name: Initialization and Deployment Workflow
on:
push:
branches:
- main
jobs:
initialization:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Initial Server Setup
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
script: |
if [ ! -f /home/${{ secrets.SSH_USERNAME }}/.setup_done ]; then
echo "⭐️ Git 설정"
git config --global user.name "khm0930"
git config --global user.email "asd000930@naver.com"
echo "⭐️ Miniconda 설치"
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda
echo "export PATH=\"$HOME/miniconda/bin:\$PATH\"" >> ~/.bashrc
source ~/.bashrc
source $HOME/miniconda/etc/profile.d/conda.sh
conda create -n airflow-practice python=3.11 -y
conda activate airflow-practice
pip install poetry
pip install pre-commit
conda install pandas
conda deactivate
echo "⭐️ 시스템 업데이트 및 PostgreSQL 설치"
sudo apt update && sudo apt -y upgrade
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update -y
sudo apt-get -y install postgresql-14 apt-transport-https ca-certificates curl gnupg-agent software-properties-common
echo "⭐️ Docker 설치 및 Docker 권한 부여"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update -y
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker ${{ secrets.SSH_USERNAME }}
sudo chmod 666 /var/run/docker.sock
sudo systemctl restart docker
sudo service docker restart
echo "⭐️ docker compose 설치"
sudo apt -y install docker-compose
echo "⭐️ SSH 키 생성 및 GitHub에 등록"
if [ ! -f ~/.ssh/id_rsa ]; then
ssh-keygen -t rsa -b 4096 -C "asd000930@naver.com" -f ~/.ssh/id_rsa -N ""
fi
ssh-keyscan github.com >> ~/.ssh/known_hosts
PUBLIC_KEY=$(cat ~/.ssh/id_rsa.pub)
curl -H "Authorization: token ${{ secrets.TOKEN }}" \
-X POST \
-d "{\"title\":\"airflow\",\"key\":\"$PUBLIC_KEY\"}" \
https://api.github.com/user/keys
echo "⭐️ Astronomer 설치 및 Airflow 시작"
curl -sSL install.astronomer.io | sudo bash -s -- v1.25.0
git clone git@github.com:khm0930/airflow-dev.git
cd airflow-practice
touch .env
astro dev start 2>astro_error.log &
sleep 60
echo "⭐️ 에러 로그에서 포트 사용 중 에러가 있는지 확인"
if grep -q "bind: address already in use" astro_error.log; then
echo "‼️ 포트 5432가 이미 사용 중입니다. Astro 프로세스를 종료합니다."
pkill astro
sudo systemctl stop postgresql
fi
pkill astro
astro dev stop && astro dev kill
echo "⭐️ airflow plugins 폴더 권한 변경 완료"
sudo chown ubuntu plugins
sudo chgrp ubuntu plugins
echo "⭐️ conda 환경 변수 적용 완료"
conda init
source ~/.bashrc
echo "⭐️ 설정 완료"
touch /home/${{ secrets.SSH_USERNAME }}/.setup_done
else
echo "⭐️ Already Initialized"
fi
deployment:
runs-on: ubuntu-latest
needs: initialization
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Deploy Application
# env:
# REPOSITORY_NAME: ${{ github.event.repository.name }}
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
script: |
cd
CURRENT_DIR=$(pwd)
cd $CURRENT_DIR/${{ vars.repository_name }}
echo "현재 위치: $(pwd)"
git pull origin main
echo "⭐️ 배포 완료"
# 추가적인 배포 명령어들
헤더 설정 및 트리거 정의
main 브랜치가 푸시되면 워크플로우 실행
name: Initialization and Deployment Workflow
on:
push:
branches:
- main
첫번쨰 작업 : 서버 초기 설정
jobs:
initialization:
runs-on: ubuntu-latest
저장소 체크아웃
- name: Checkout Repository
uses: actions/checkout@v2
서버 초기 설정
- name: Initial Server Setup
uses: appleboy/ssh-action@master
with:
key: ${{ secrets.SSH_PRIVATE_KEY }}
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
script: |
if [ ! -f /home/${{ secrets.SSH_USERNAME }}/.setup_done ]; then
# 설정 스크립트
fi
깃허브 접속 -> 레포 세팅 -> secrets and variables ->
SSH_PRIVATE_KEY,SSH_HOST,SSH_USERNAME 작성
여기서 프라이빗 키는 로컬 ssh private key , HOST는 배포서버 외부ip , USER_NAME 는 자신 이름 ex) ubuntu
배포서버에서 토큰 필요하기 때문에 토큰더 만들어 넣어주시고

이렇게 하면 접속됨 , setup_done 파일로 중복 실행 방지
Git 설정
git config --global user.name "khm0930"
git config --global user.email "asd000930@naver.com"
Miniconda 설치 및 기본 패키지 설치
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda
시스템 업데이트 및 관련 툴 설치
sudo apt-get -y install postgresql-14 ...
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker ${{ secrets.SSH_USERNAME }}
sudo apt -y install docker-compose
설정 완료 표시 파일 생성
초기화가 완료되었음을 나타내는 파일을 생성하여 다음 실행에서 중복을 방지
touch /home/${{ secrets.SSH_USERNAME }}/.setup_done
두 번째 작업: deployment (애플리케이션 배포)
:원격 서버에 SSH로 접속하여 git pull을 수행하여 최신 코드를 배포합니다.

main에 푸시 하면 잘된것을 확인 할수 있다.
배포 서버에 접속해서 확인해보면 setup_done 파일이 잘 생성 된걸 볼수 있따.
