๐Ÿ“’ Docker - Git-sync

Kimdongkiยท2024๋…„ 6์›” 21์ผ

Git

๋ชฉ๋ก ๋ณด๊ธฐ
2/2

๐Ÿ“Œ Git-sync

๋งํฌ

git-sync:
    image: databurst/git-sync:latest
    volumes:
      - ${AIRFLOW_PROJ_DIR:-.}:${DESTINATION_PATH:-/app/sync}
      - ${GIT_SSH_KEY:-~/.ssh/id_rsa}:/root/.ssh/id_rsa
    environment:
      REPO_URL: ${REPO_URL:-git@github.com/lv1turtle/tourist_visitation_patterns_by_weather.git}
      GIT_BRANCH: ${GIT_BRANCH:-main}
      DIRECTORY_NAME: ${DIRECTORY_NAME:-project}
      DESTINATION_PATH: ${DESTINATION_PATH:-/app/sync}
      INTERVAL: ${INTERVAL:-30}

ssh ๊ณต๊ฐœ ํ‚ค ์ƒ์„ฑ(์ธ์Šคํ„ด์Šค)

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

RSA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ 4096๋น„ํŠธ ๊ธธ์ด์˜ ํ‚ค๋ฅผ ์ƒ์„ฑ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
์ฐธ๊ณ ๋กœ email์€ ๊ทธ๋ƒฅ sshํ‚ค์˜ ์ฃผ์„๋А๋‚Œ์ด๋‹ค.(์œ ์˜๋ฏธํ•œ ๊ตฌ๋ฌธ์„ ๋„ฃ์„ ํ•„์š” ์—†๋‹ค๋Š” ๋œป์ž„)
๋‚˜๋Š” ๋ช…๋ น์–ด ์ž…๋ ฅํ›„ ๋ชจ๋‘ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜๊ธฐ์œ„ํ•ด Enterํ‚ค๋งŒ ๋ˆŒ๋ €๋‹ค.
์ดํ›„ ํ‚ค์˜ ๊ถŒํ•œ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

chmod 400 ~/.ssh/id_rsa


์œ„ ๋ฐฉ๋ฒ•์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ๊ทธ๊ฑด ๊ทธ๊ฑฐ๋Œ€๋กœ ์•Œ ์ˆ˜ ์—†๊ฒŒ๋œ ์ƒํƒœ์ด๋‹ค..
ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ AWS์—์„œ ์ œ๊ณตํ•˜๋Š” Keypair์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • RSA & ED25519

RSA๋ฅผ ๋ฌดํ•œํžˆ ๋„์ „ํ•ด๋ณด์•˜์ง€๋งŒ ๋ฒˆ๋ฒˆํžˆ ์‹คํŒจํ–ˆ๋‹ค.
๊ตฌ๊ธ€๋ง ํ•ด๋ณธ ๊ฒฐ๊ณผ Window์—์„œ Putty๋ฅผ ์‚ฌ์šฉํ•œ EC2์˜ ๊ฒฝ์šฐ๋Š” ED25519๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค..

Linux์™€ MAC์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.
ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ Window๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ Putty๋กœ EC2์— ์ ‘์†ํ•˜์˜€๋‹ค๋ฉด ED25519๋ฅผ ์‚ฌ์šฉํ•˜์ž.

  • ์ถ”๊ฐ€
    ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํ‚คํŽ˜์–ด๋Š” ssh๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ EC2ํ™˜๊ฒฝ์— ๋“ค์–ด๊ฐ€์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค
    ppk๋‚˜ pem์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” rsa๋กœ ์ƒ์„ฑํ•˜์˜€๋‹ค.

๐Ÿ“Œ Auto Git Pull

์‚ฌ์ „ ์ค€๋น„

  • ๋งŒ์•ฝ Git-sync๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋ฉด Git Action์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  • ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ๋จผ์ € ED25519๋กœ EC2์—์„œ sshํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์ž.
ssh-keygen -t ed25519 -C "your_email@example.com"
  • ํ‚ค ๊ถŒํ•œ ์„ค์ •
chmod 600 id_ed25519
  • ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์•„๋ฌด ๋ช…๋ น์–ด๋„ ๋‚˜์˜ค์ง€ ์•Š์•„์•ผ ์ •์ƒ์ด๋‹ค.(ํ‚ค ์ถ”๊ฐ€ ๋ช…๋ น์–ด์ž„)
ssh-add ~/.ssh/id_ed25519
  • Github์™€ EC2๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
  • SSH ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ๋ช…๋ น์–ด
ssh -T git@github.com
  • Github Repository์— 3๊ฐ€์ง€์˜ Secrets ํ‚ค๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • EC2_HOST
    • EC2_PRIVATE_KEY : Pub ํ‚ค๋Š” EC2์—์„œ, Private ํ‚ค๋Š” ๊นƒํ—™์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.
    • EC2_USER

Code

  • ์ด์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

  • Git-Action์˜ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„์ด๋‹ค.

name: Git-sync # ์ด๋ฆ„
on:
  push: # pushํ• ๋•Œ
    branches: 
      - main # main ๋ธŒ๋žœ์น˜์—
jobs: # git-action์˜ job์„ ์ž‘์„ฑ
  pull_changes: # ์ด๋ฆ„
    runs-on: ubuntu-latest # ubuntu ํ™˜๊ฒฝ ์„ค์ •
    steps: # job์˜ task๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ž‘์„ฑ
      - name: Checkout repository # actions/checkout@v2๋ฅผ ์‚ฌ์šฉํ•ด์„œ repository์— ์ ‘๊ทผ
        uses: actions/checkout@v2
        
      - name: Create .ssh directory
        run: mkdir -p ~/.ssh # ~/.ssh ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ (Key๋ฅผ ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.)
  • Git-Action์ƒ์— ๋ฏธ๋ฆฌ ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์„ ๋๋ƒˆ๋‹ค. ์ด์ œ ๋ณธ๋ฌธ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.
    • ssh-keyscan : ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์˜ SSH ๊ณต๊ฐœํ‚ค ๊ฒ€์ƒ‰
    • -H : ํ•ด์‹œ๋œ ํ˜•์‹์œผ๋กœ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ €์žฅํ•˜๊ฒ ๋‹ค๋Š” ์˜ต์…˜์ด๋‹ค.
    • ${{ secrets.EC2_HOST }} : GitHub Actions์˜ ์‹œํฌ๋ฆฟ์—์„œ EC2 ํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    • ~/.ssh/known_hosts : known_hosts ํŒŒ์ผ์— ๋‚ด์šฉ ์ถ”๊ฐ€
  • ์—ฌ๊ธฐ์„œ ํ˜น์‹œ๋‚˜ ๋ชจ๋ฅผ๊นŒ๋ด ์ž‘์„ฑํ•œ๋‹ค.
    • ">" : ์ผ๋ช… ๋‹จ์ผ ๊บพ์‡  ๊ด„ํ˜ธ, ํ•ด๋‹น ์œ„์น˜์— ์ƒˆ๋กœ ์ƒ์„ฑ ๋˜๋Š” ๋ฎ์–ด์“ฐ๊ธฐ
    • ">>" : ์ผ๋ช… ์ด์ค‘ ๊บพ์‡  ๊ด„ํ˜ธ, ํ•ด๋‹น ์œ„์น˜์— ์ƒˆ๋กœ ์ƒ์„ฑ ๋˜๋Š” ์ถ”๊ฐ€
      - name: Add EC2 host key to known_hosts
        run: |
          ssh-keyscan -H ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts
          chmod 600 ~/.ssh/known_hosts
  • env: ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™˜๊ฒฝ์„ค์ •์„ ํ•ด์ค€๋‹ค.

  • EC2_PRIVATE_KEY๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ƒ์„ฑํ•ด์ค€๋‹ค.

  • chmod 600 id_ed25519๋กœ ๊ถŒํ•œ์„ค์ •์„ ํ•ด์ค€๋‹ค.

      - name: Pull Change from EC2
        env:
          EC2_HOST: ${{ secrets.EC2_HOST }}
          EC2_USER: ${{ secrets.EC2_USER }}
          EC2_PRIVATE_KEY: ${{ secrets.EC2_PRIVATE_KEY }}
        run: |
          echo "${EC2_PRIVATE_KEY}" > id_ed25519
          chmod 600 id_ed25519
          # SSH๋ฅผ ํ†ตํ•ด EC2 ์„œ๋ฒ„๋กœ ์ ‘์†ํ•˜์—ฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
          ssh -o StrictHostKeyChecking=no -i id_ed25519 ${EC2_USER}@${EC2_HOST} 'cd /home/ubuntu/tourist_visitation_patterns_by_weather && git fetch origin main' || exit 1
  • ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ์›๋ž˜ ์‚ฌ์šฉํ•˜๋˜ git ๋ช…๋ น์–ด๋“ค์ด๋‹ค.
          # ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์— ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉ
          git merge FETCH_HEAD --no-commit --no-ff
  • ๋ฐ”๋ณด์ฒ˜๋Ÿผ ๊ฐ€์ ธ์™€์„œ๋Š” ์•ˆ๋˜๋Š” & ๊ถŒํ•œ์ด ์—†๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ ์ ‘๊ทผํ–ˆ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์ œ์™ธํ•ด์ฃผ์ž...
          # ๊ถŒํ•œ์ด ์—†๋Š” 3๊ฐœ์— ๋Œ€ํ•ด์„œ๋Š” ์ œ์™ธ
          git reset HEAD -- .github/workflows/airflow_dag_test.yml
          git reset HEAD -- .github/workflows/conde.yml
          git reset HEAD -- dbt
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šคํ…Œ์ด์ง•ํ•˜๊ณ  ์ปค๋ฐ‹ํ•ด์ค€๋‹ค.
          git config --global user.email "you@example.com"
          git config --global user.name "Your Name"
          git add .
          git commit -m "Pull changes from EC2, excluding specific files and directories"
          
          # main branch๋กœ push
          git push origin main
          
        shell: bash

๋์œผ๋กœ ๋ช‡๋งˆ๋”” ๋” ์ž‘์„ฑํ•˜๊ฒ ๋‹ค.

ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ •ํ™ฉ์ƒ Git-sync์™€ Git-Action์„ ํ†ตํ•œ Auto Pull ๊ธฐ๋Šฅ์€ ์ž์‹ ์ด ์ฃผ์ธ์ธ Repository์—์„œ๋งŒ ๊ฐ€๋Šฅํ•œ๊ฒƒ ๊ฐ™๋‹ค.

๋˜๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›์•˜์„ ๊ฒฝ์šฐ.

ํŒ€์›์ด ์ฃผ์ธ์ธ Repository์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ณธ์ธ์˜ Repository์—์„œ๋Š” ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฏธ๋ฃจ์–ด ๋ณด์•˜์„ ๋•Œ ์ด๋Ÿฌํ•œ ๊ฒฐ๋ก ์ด ๋‚ด๋ ค์กŒ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€