GitHub Action

2023. 7. 16. 16:53github

Github Action 이란?

 

Github Actions 를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다.

CI/CD 를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완전히 사용자 정의된 워크플로에서 작업을 결합 할 수 있다.

 

Github 에서 공식적으로 제공하는 CI/CD 툴이다. 즉, 개발의 워크플로를 자동화 할 수 있게 도와주는 도구이다.

 

Github Actions 를 사용하면 자동으로 코드 저장소에서 어떤 이벤트가 발생했을 때 특정 작업이 일어나게 하거나 주기적으로 어떤 작업들을 반복해서 실행 시킬 수도 있다.

 

어떤 새로운 코드가 메인 브랜치에 유입(push)되면 Github Actions 를 통해 소프트웨어를 빌드하고 상용 서버에 배포할 수도 있다.

 

Github Actions 는 기존 CI/CD 서비스 대비 간편한 설정과 높은 접근성으로 특히 개발자들 사이에서 많은 호응을 얻고 있다. 

 

https://youtu.be/0Emq5FypiMM

https://youtu.be/KTHZyV9yJGY

 


Github Action 의 핵심

 

 

Workflow

 

- 자동화 된 전체 프로세스를 의미한다. (자동화 해놓은 작업 과정)

- 워크플로 파일은 yml 로 작성되고, Github Repository 의 .github/workflows 폴더 아래에 저장된다.

- 하나의 리포지토리에는 여러 개의 워크플로가 생성될 수 있다.

 

워크플로에는 크게 두 가지를 정의해야 한다.

하나는 해당 워크플로가 언제 실행되는지 정의하는 Event, 하나는 해당 워크플로가 구체적으로 어떤 일을 해야하는지 명시하는 Job 이 필요하다.

 

 

Event

 

워크플로를 trigger(실행)하는 특정 활동이나 규칙이다.

ex) main 으로 브랜치를 병합하거나 push 를 하면 Action 이 동작하도록 설정해준다.

 

Job

 

독립된 가상 머신 또는 컨테이너에서 돌아가는 하나의 처리 단위를 의미한다.

 

하나의 워크플로는 여러 개의 작업으로 구성되며 적어도 하나의 작업은 있어야 한다.

 

모든 작업은 기본적으로 동시에 실행되며 필요 시 작업 간에 의존 관계를 설정하여 작업이 실행되는 순서를 제어할 수도 있다.

 

Job 이 여러 개인 경우

jobs:
  job1:
    # job1에 대한 세부 내용
  job2:
    # job2에 대한 세부 내용
  job3:
    # job3에 대한 세부 내용

 

작업의 세부 내용으로 여러가지로 명시 할 수 있는데, 이 때 필수로 들어가야 하는 runs-on 속성을 통해 해당 macOS 나 windows 와 같은 실행 환경을 지정해주어야 한다.

 

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      # ...

 

Step

 

각 작업이 하나 이상의 단계로 모델링이 된다.

Step은 단순한 커멘드나 스크립트가 될 수도 있고, action 이라고 하는 명령어일 수 있다.

 

커맨드나 script 를 실행할 경우 run 속성을 사용하며,

action 을 사용할 때는 uses 속성을 사용한다.

 

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm install
      - run: npm test

 

 

Action

 

Github Action 에서 빈번하게 필요한 반복 단계를 재사용하기 용이하게 제공되는 일종의 작업 공유 메커니즘이다.

하나의 코드 저장소 범위 내에서 여러 워크플로 간에서 공유할 수 있을 뿐 아니라, 공개 코드 저장소를 통해 액션을 공유하면 깃허브 상의 모든 코드 저장소에서 사용이 가능하다.

 

대표적인 공개 액션인 actions/checkout 은 코드 저장소로 부터 코드를 작업 실행 환경으로 내려받는 것을 해주는 Action 이다.

 


코드

# workflow 의 제목
name: Node.js CI

# Event 설정
on:
  # push 를 할 경우
  push:
    # 브랜치가 메인일 경우 workflow 동작
    branches: [main]
  pull_request:
    # 풀 리퀘스트를 받을 경우도 설정
    branches: [main]
# workflow 가 동작할 행위를 설정해 준다.
# Jobs 를 설정
jobs:
  # Job1, 즉 이름이 build 이다.
  build:
    # runs-on : 해당 job 을 어떤 OS 에서 실행할 것인지 설정해준다.
    # ubuntu 버전은 최신 버전으로 사용한다.
    runs-on: ubuntu-latest

	# 다양한 작업 구성 행렬 전략을 사용한다.
    strategy:
      # matrix 를 사용하여 다양한 작업 구성 행렬을 정의한다.
      matrix:
        # 배열을 사용해, 노드 버전 구성 행렬을 정의한다.
        node-version: [20.x]
	
    # 단계를 정의한다.
    steps:
      # action 정의
      # checkout@3 : Repo 에 있는 Code 를 Runner 로 가져온다.
      - uses: actions/checkout@v3
      # 이름 정의해주기
      - name: Use Node.js ${{ matrix.node-version }}
      # node 설치하기
        uses: actions/setup-node@v3
        with:
          node-version: "20.x"
          cache: "npm"
      - name: build server files
      # run 으로 script 실행하기
      # package.json dependency 설치
        run: npm ci
      # - run: npm run build --if-present
      # - run: npm test

      - name: create env file
        working-directory: ./
        run: |
          pwd
          touch .env
          echo MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }} >> .env
          echo MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }} >> .env
          echo MYSQL_HOST=${{ secrets.MYSQL_HOST }} >> .env
          echo MYSQL_DATABASE=${{ secrets.MYSQL_DATABASE }} >> .env
          cat .env

      - name: zip file
        run: zip -r hous.zip ./app.js ./scripts ./appspec.yml ./package.json ./package-lock.json ./config ./controllers ./migrations ./models ./routes ./.env

      - name: AWS configure credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: upload to S3
        run: aws s3 cp --region ap-northeast-2 ./hous.zip s3://mini-be-bucket/deploy/

      - name: deploy with AWS codeDeploy

        run: aws deploy create-deployment
          --application-name hous-codedeploy
          --deployment-config-name CodeDeployDefault.OneAtATime
          --deployment-group-name GROUP
          --s3-location bucket=mini-be-bucket,bundleType=zip,key=deploy/hous.zip

 


참조 링크

 

형주님 그리고, 

 

https://docs.github.com/ko/actions

 

GitHub Actions 설명서 - GitHub Docs

GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완

docs.github.com

https://www.youtube.com/watch?v=0Emq5FypiMM&t=1s 

https://www.youtube.com/watch?v=KTHZyV9yJGY&t=1s 

 

'github' 카테고리의 다른 글

github 로 협업  (5) 2023.05.09
README 작성요령  (0) 2023.04.09