Airflow - GitHub action CICD

KIM HYUNMIN·2024년 11월 1일

이제 깃허브 액션을 사용해서 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 파일이 잘 생성 된걸 볼수 있따.

profile
Linux,Window,Network,docker,kubernets

0개의 댓글