본문으로 바로가기

github-action 개요

category Ops, Infra, etc/배포 자동화 (CI, CD) 2020. 11. 5. 22:10

code, issues, pull request는 종종 사용해왔습니다만 저 Actions는 사용할 일이 없어서 방치해두었습니다.

그러던 중 GitHub Actions를 이용해서 매일 오전 9시마다 정보를 가져와 README와 자체 웹 페이지를 업데이트 해주는 서비스가 있어서 Actions의 기능이 궁금해져서 공부해보았습니다.

 

 

github action?

push, pull request, issue의 발행과 같은 이벤트에 따라 특정 기능을 트리거할 수 있는 도구입니다. 대개 CI 기능을 위해 사용합니다. 단순 CI 뿐만 아니라 test 코드 결과를 SMS 서비스를 통해 발송하기, test 돌리기, 배포하기 등으로 응용할 수 있습니다. 말 그대로 'action'인 셈이죠. 

 

github 측에서도 action을 workflows라고 소개하고 있습니다.

GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub. Make code reviews, branch management, and issue triaging work the way you want.
- 출처 (github.com/features/actions)

 

이러한 동작이 가능한 것은, 저장소마다 'runner'라고 불리우는 가상 컴퓨터가 존재하기 때문입니다.

컴퓨터 관련 스펙에 대한 내용은 다음에서 참고할 수 있습니다.

(docs.github.com/en/free-pro-team@latest/actions/reference/specifications-for-github-hosted-runners#about-github-hosted-runners)

 

  • 2-core CPU
  • 7 GB of RAM memory
  • 14 GB of SSD disk space

 

Hello, GitHub-actions!

actions 탭에 보면 자체적으로 확장자를 보고 적합한 workflow 템플릿을 제공해주지만 여기서는 스스로 workflow를 만들어보도록 하겠습니다.

 

 

workflows를 직접 만들고자 하면 .github/workflows/main.yml에서 workflow를 구성할 수 있습니다.

 

다른 분이 정리하신 도식을 가져와보았다.

출처 : https://velog.io/@adam2/Github%EC%97%90-Action%EC%9D%B4%EB%9D%BC%EB%8A%94-%ED%83%AD%EC%9D%B4-%EC%83%9D%EA%B2%BC%EB%8B%A4..-github-Action%EC%9D%B4%EB%9E%80-3gk336pk8q

 

 

 

Document가 짧으니 읽어보면 간단한 workflow를 구성할 수 있습니다. 전체 문서를 원한다면 아래 링크를 참고합시다.

docs.github.com/en/free-pro-team@latest/actions/learn-github-actions

 

flutter 해보면서 yml을 작성해본 경험이 있는데, 들여쓰기에 민감하므로 주의해서 작성해봅시다.

master 브랜치에 push, pull_request를 취할 경우 실행할 steps들을 정의합시다.

작동 환경은 ubuntu로 합시다.

# action의 이름을 정합시다.
name: github-action-example

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  build: # build말고 아무 이름이나 해도 괜찮습니다. 단순한 이름일 뿐입니다.
    runs-on: ubuntu-latest
    
    # 실제로 작동하는 action은 steps에 정의한다.
    steps:
    
      # .github 외의 다른 코드를 runner에 올리기 위해
      # checkout 사용 (https://github.com/marketplace/actions/checkout)
      - uses: actions/checkout@v2
      
      # ubuntu에서 실행할 명령어
      - name: Run pwd
        run: pwd
    
      - name: Run ls -al
        run: ls -al

 

참고로 아래와 같이 적는 게 더 편합니다.

# Triggered when code is pushed or pull_request to any branch in a repository
on: [push, pull_request]

 

 

master branch에 push 후 action 탭에 가보면 이름 붙여준 build라는 job이 생성된 것을 보실 수 있습니다.

또한 step을 확인할 수 있습니다.

 

현재 main.yml 하나만 만들어 둔 상태이지만, 여러 개의 yml을 이용하여 workflow를 여러 개 만들 수도 있습니다.

workflow는 저장소마다 최대 20개까지 등록할 수 있으며 job은 최대 6시간 동안 실행될 수 있다.

 

또, 주의할 점이 공개 repo에서는 무료지만 private repo의 경우 일정 한도(500MB, 2000분)를 초과하면 비용이 청구되므로 주의해야 한다. 

 

 

MarketPlace 활용

 

마켓 플레이스에 올라온 특정 기능을 사용하기 위해서는 steps 하단에 uses를 이용하시면 됩니다.

 

 

Context

docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions

You can access context information and evaluate expressions in workflows and actions.

 

context 정보를 얻는 표현식은 아래와 같습니다.

또한, 문서에서는 if의 조건문에서는 이미 표현식으로 인식하기 때문에 ${{}}을 생략할 수 있습니다.

${{ <expression> }}

 

어떤 context할 수 있는지에 대한 정보는 아래 공식문서를 참고해보고 여기서는 간단한 context 정보를 뽑아보도록 합시다. (docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#contexts

 

context 종류로 github, env, job 등이 존재하며 각 context 내부에 세부 property가 존재합니다.

 

 

아래와 같이 ubuntu 환경에서 사용할 수 있도록 github.sha context 변수를 COMMIT_ID에 담고 (env 항목에서 정의하여 사용할 수 있습니다.) 이를 echo를 통해 출력해보도록 하겠습니다. 

- name: context
  env: 
    COMMIT_ID: ${{github.sha}}
  run: echo "commit id is $COMMIT_ID"

출력 결과는 다음과 같습니다.

 

context 와 관련된 전반 사항을 살펴보고 싶으면 공식 문서에 있는 아래 예시를 넣고 action을 가동시켜보면 확인할 수 있습니다.

name: context

on: push

jobs:
  checkingContextEnv:
    runs-on: ubuntu-latest
    steps:
      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"
      - name: Dump job context
        env:
          JOB_CONTEXT: ${{ toJson(job) }}
        run: echo "$JOB_CONTEXT"
      - name: Dump steps context
        env:
          STEPS_CONTEXT: ${{ toJson(steps) }}
        run: echo "$STEPS_CONTEXT"
      - name: Dump runner context
        env:
          RUNNER_CONTEXT: ${{ toJson(runner) }}
        run: echo "$RUNNER_CONTEXT"
      - name: Dump strategy context
        env:
          STRATEGY_CONTEXT: ${{ toJson(strategy) }}
        run: echo "$STRATEGY_CONTEXT"
      - name: Dump matrix context
        env:
          MATRIX_CONTEXT: ${{ toJson(matrix) }}
        run: echo "$MATRIX_CONTEXT"

 

 

Secret

 

주의하실 점은, action을 구성하면 다른 외부인도 사용할 수 있기 때문에 민감한 정보는 가릴 필요가 있습니다.

이럴 때 사용하는 내용이 secret입니다.

 

github Settings 부분에 secrets을 설정할 수 있습니다.

 

secrets을 통해 아래와 같이 세팅하고 사용할 수 있습니다.

- name: show my secret  
  env:
    SECRET: ${{secrets.MY_SECRET}}
  run: echo "my secret is ${SECRET}"

 

secret이기 때문에 ***로 표시되는 모습을 볼 수 있습니다.

 

 

읽어보면 좋은 글)

 

ahnheejong.name/articles/receive-new-room-notification-mails-using-github-action/

 

velog.io/@adam2/Github%EC%97%90-Action%EC%9D%B4%EB%9D%BC%EB%8A%94-%ED%83%AD%EC%9D%B4-%EC%83%9D%EA%B2%BC%EB%8B%A4..-github-Action%EC%9D%B4%EB%9E%80-3gk336pk8q

 

velog.io/@bluestragglr/Github-Action%EC%9C%BC%EB%A1%9C-%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체