Profile picture

[Github Actions] 프로젝트 배포 예제

JaehyoJJAng2023년 04월 18일

예제 1

name: CI-TEST

on:
  push:
    branches: [main]
  
jobs:
  CI:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Node.js
        uses: actions/setuo-node@v2
        with:
          node-version: "14.x"
      - run: npm install
      - run: npm run build
      - run: npm test

옵션 설명

name

name: CI-TEST

Action의 이름을 지정합니다. 이것은 Actions 실행 로그에서 사용됩니다.


on

on:
  push:
    branches: [ main ]

이 Action이 실행되어야 하는 이벤트를 정의합니다. push 이벤트가 발생하고 브랜치가 main 일 때, 이 Action이 실행됩니다.


jobs

jobs:
  CI:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14.x'
    - run: npm install
    - run: npm run build
    - run: npm test

Action이 실행될 Job을 정의합니다. 여기서는 CI라는 하나의 Job을 정의합니다.


runs-on

runs-on: ubuntu-latest

Job이 실행되는 환경을 정의합니다. 여기서는 ubuntu-latest로 정의하였습니다.


steps

steps:
- uses: actions/checkout@v2
- name: Set up Node.js
  uses: actions/setup-node@v2
  with:
    node-version: '14.x'
- run: npm install
- run: npm run build
- run: npm test

Job의 각 단계를 정의합니다. 위의 예제에서는 다음과 같은 단계를 가지고 있습니다.

  • actions/checkout 를 사용하여 코드를 가져옵니다.
  • Node.js를 설정합니다.
  • npm install 명령을 실행하여 필요한 패키지를 설치합니다.
  • npm run build 명령을 실행하여 빌드합니다.
  • npm test 명령을 실행하여 테스트를 수행합니다.
  • 위의 예제는 Github Actions에서 자주 사용되는 YAML 파일 문법을 보여주는 기본적인 예제입니다. 각 단계는 이전 단계의 결과를 사용하여 실행됩니다. 더 자세한 정보는 Github Actions 문서를 참조하시기 바랍니다.


Node.js 배포 예제

  • 노드.js 어플리케이션을 빌드하고 테스트하는 github actions 정의
name: Node.js CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  node-js:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14.x, 16.x]
    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${ { matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${ { matrix.node-version }}
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

옵션 설명

name

name: Node.js CI

Action의 이름 정의


on

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

Action을 실행해야 하는 이벤트를 정의합니다. 위의 예제에서는 main 브랜치로의 push 및 pull_request 이벤트가 발생하면 Action이 실행됩니다.


jobs

jobs:
  node-js

Action을 실행할 Job을 정의합니다. 위의 예제에서는 node-js 라는 하나의 Job을 정의하였습니다.


strategy

strategy:
  matrix:
    node-version: [14.x, 16.x]

Job이 실행될 때, 여러 환경에서 실행될 수 있도록 행렬(matrix)을 정의합니다. 위의 예제에서는 node-version 이라는 변수를 정의하고, 14.x와 16.x 두 가지 버전의 Node.js를 선택할 수 있도록 설정합니다.


steps

steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
  uses: actions/setup-node@v2
  with:
    node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm run build --if-present
- run: npm test

Job의 각 단계를 정의합니다. 위의 예제에서는 총 5개의 단계를 가지고 있습니다.

  • actions/checkout@v2 를 사용하여 현재 레포지토리의 코드를 체크아웃합니다.
  • actions/setup-node@v2 를 사용하여 node-version 환경을 설정합니다.
  • npm ci 명령을 사용하여 필요한 모듈들을 설치합니다.
  • npm run build --if-present 명령을 사용하여 어플리케이션을 빌드합니다.
  • npm test 명령을 사용하여 어플리케이션을 테스트합니다.

Flask 배포 예제

  • 파이썬 플라스크 앱을 배포하기 위한 Github Actions YAML
name: Deploy Flask App

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.9
      uses: actions/setup-python@v2
      with:
        python-version: 3.9

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Build and Deploy
      env:
        APP_SECRET: ${{ secrets.APP_SECRET }}
        SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
        SERVER_USERNAME: ${{ secrets.SERVER_USERNAME }}
        SERVER_IP: ${{ secrets.SERVER_IP }}
        SERVER_PORT: ${{ secrets.SERVER_PORT }}
      run: |
        ssh -i ${{ secrets.SSH_PRIVATE_KEY }} ${{SERVER_USERNAME}}@${{SERVER_IP}} -p ${{SERVER_PORT}} "cd ~/app && git pull"
        python app.py

옵션 설명

name

name: Deploy Flask APp

Action의 이름 정의


on

on:
  push:
    branches:
      - main

Action을 실행해야 하는 이벤트를 정의합니다. 위의 예제에서는 main 브랜치로의 push 이벤트가 발생하면 Action이 실행됩니다.


jobs

jobs:
  deploy:

Action을 실행할 Job을 정의합니다. 위의 예제에서는 deploy 라는 하나의 Job을 정의합니다.


runs-on: ubuntu-latest

Job이 실행될 환경을 정의합니다. 위의 예제에서는 ubuntu-latest 환경에서 Job이 실행됩니다.


steps

steps:
  - uses: actions/checkout@v2
  - name: Set up Python 3.9
    uses: actions/setup-python@v2
    with:
      python-version: 3.9

  - name: Install dependencies
    run: |
      python -m pip install --upgrade pip
      pip install -r requirements.txt

  - name: Build and Deploy
    env:
      APP_SECRET: ${{ secrets.APP_SECRET }}
      SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      SERVER_USERNAME: ${{ secrets.SERVER_USERNAME }}
      SERVER_IP: ${{ secrets.SERVER_IP }}
      SERVER_PORT: ${{ secrets.SERVER_PORT }}
    run: |
      ssh -i ${{ secrets.SSH_PRIVATE_KEY }} ${{SERVER_USERNAME}}@${{SERVER_IP}} -p ${{SERVER_PORT}} "cd ~/app && git pull"
      python app.py

Job의 각 단계를 정의합니다. 위의 예제에서는 총 4개의 단계를 가지고 있습니다.

  • actions/checkout@v2 를 사용하여 현재 레포지토리의 코드를 체크아웃합니다.
  • actions/setup-python@v2 를 사용하여 Python 3.9 환경을 설정합니다.
  • pip install 명령을 사용하여 requirements.txt 파일에 명시된 필요한 Python 패키지를 설치합니다.

커밋 자동화 예제

name: Set recent blog post in README

on:
    schedule:
        - cron: "*/30 * * * *"
    push:
        paths:
            - "scripts/blog-post.sh"
    workflow_dispatch:

jobs:
    update-readme-blog-post:
        name: Update README with latest blog posts
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3
            - name: Run script
              run: |
                  bash ./scripts/blog-post.sh || bash ./scripts/send-notification.sh -m "🚨 Failed to update blog post\n\nCheck: https://marshallku.com/"
            - name: Commit
              run: |
                  bash ./scripts/commit.sh || bash ./scripts/send-notification.sh -m "Failed to commit changes"
              env:
                  TOKEN: ${{ secrets.TOKEN }}
                  REPOSITORY: ${{ github.repository }}
                  MESSAGE: "Update blog post"

옵션 설명

name

name: Set recent blog post in README

name: workflow의 이름을 Set recent blog post in README로 설정합니다.


on

on:
  schedule:
    - cron: "*/30 * * * *"
  push:
    paths:
      - "scripts/blog-post.sh"
  workflow_dispatch:
  • on: Workflow가 트리거되는 이벤트를 정의합니다. 여기서는 3가지 이벤트가 정의되어 있습니다.
  • schedule: 매 30분마다 Workflow를 트리거합니다. cron 표현식은 매 분(), 매 시간(), 매일(), 매월(), 매주()를 의미하며 매 30분(/30)마다 실행됩니다.
  • push: scripts/blog-post.sh 파일이 변경될 때 Workflow를 트리거합니다.
  • workflow_dispatch: 이벤트는 수동으로 Workflow를 트리거하기 위해 사용됩니다.

jobs

jobs:
  update-readme-blog-post:
    name: Update README with latest blog posts
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run script
        run: |
          bash ./scripts/blog-post.sh || bash ./scripts/send-notification.sh -m "🚨 Failed to update blog post\n\nCheck: https://marshallku.com/"
      - name: Commit
        run: |
          bash ./scripts/commit.sh || bash ./scripts/send-notification.sh -m "Failed to commit changes"
        env:
          TOKEN: ${{ secrets.TOKEN }}
          REPOSITORY: ${{ github.repository }}
          MESSAGE: "Update blog post"
  • jobs: Workflow의 job을 정의합니다. 이 구문에서는 update-readme-blog-post라는 하나의 job을 정의합니다.
  • name: job의 이름을 Update README with latest blog posts로 설정합니다.
  • runs-on: job이 실행되는 운영 체제를 ubuntu-latest로 설정합니다.
  • steps: job이 실행되는 일련의 단계를 정의합니다.
  • uses: GitHub Action을 사용하여 현재 작업 디렉토리로 레포지토리를 체크아웃합니다.
  • name: 이 단계의 이름을 Run script로 설정합니다.
  • run: bash ./scripts/blog-post.sh 명령어를 실행하고, 실패시 bash ./scripts/send-notification.sh -m "🚨 Failed to update blog post\n\nCheck: https://marshallku.com/" 명령어를 실행합니다.
  • name: 이 단계의 이름을 Commit으로 설정합니다.
  • run: bash ./scripts/commit.sh 명령어를 실행하고, 실패시 bash ./scripts/send-notification.sh -m "Failed to commit changes" 명령어를 실행합니다.
  • env: job 실행에 필요한 환경 변수를 설정합니다. TOKEN, REPOSITORY, MESSAGE 환경 변수가 정의되어 있습니다.

Loading script...