GitHub Actions는 CI/CD 와 같은 workflows를 자동화하는 도구이다. 쉽게 말하자면, GitHub에 push, pull과 같은 액션들이 발생 했을 때 해당 이벤트에 대해 정해진 동작을 자동으로 실행시켜 준다.
비슷한 것으로는 CI에는 Jenkins, CD에는 ArgoCD 등이 있다. Jenkins, ArgoCD등 만 사용 경험이 있어 GitHub Actions를 사용해 보고 싶었는데, 이번 기회에 배울 수 있었다.
GitHub Actions를 사용하기 위해서는 꼭 ./github/workflows 폴더 안에 yaml 파일을 생성해 줘야 한다.
https://github.com/hsh108868/azure_function/tree/master/.github/workflows
실습 코드는 여기서 확인할 수 있다.
GitHub Actions를 통해 특정 운영 체제에서만, 특정 steps에서만, 특정 버전에서만, 특정 행동에서만 Action을 실행하도록 설정할 수 있다.
echo "WORKFLOW: ${{ env.WORKFLOW_LEVEL }}"
echo "STEP 1: ${{ env.STEP_1 }}"
echo "STEP 2: ${{ env.STEP_2 }}"
GitHub Actions 에서는 해당 방식으로 환경변수를 설정하니 꼭 기억해 두도록 하자. 또한 환경 변수는 scope 내에서 설정하면 해당 scope 내에서만 값이 할당된다.
run: |
STEP_1='This value comes from the step 1'
echo "::add-mask::$STEP_1"
echo "::set-output name=value1::$STEP_1"
를 통해 mask를 설정할 수 있다.
echo "STEP 2: ${{ steps.step2.outputs.value2 }}"
echo "SECRET 1: ${{ secrets.SECRET_1 }}"
GitHub Settings 에서 Secret을 설정한다면 이렇게 마스킹을 할 수 있다. (if 문을 통해 체크하면 Secret 값이 잘 적용되었음을 알 수 있다.)
strategy:
matrix:
os: ['ubuntu-latest', 'windows-latest','macos-latest']
runs-on: ${{ matrix.os }} #빌드 서버의 운영 체제, 여러 개 사용 가능
name: 'Say Hello on ${{ matrix.os }}' # 네임 하나가 각각의 스텝
run: |
echo "Hello from ${{ matrix.os }}"
을 통해 각각의 운영 체제에서 실행할 수 있도록 설정할수도 있다.
strategy:
matrix:
os: ['ubuntu-latest', 'windows-latest','macos-latest']
nodejs: ['14.x', '16.x']
runs-on: ${{ matrix.os }} #빌드 서버의 운영 체제, 여러 개 사용 가능
steps:
- name: 'Setup node.js version' # 네임 하나가 각각의 스텝
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.nodejs }}
- name: 'Check node.js version on ${{ matrix.os }} '
shell: bash
run: |
echo $(node --version)
각 버전에 맞을 때만 실행할 수도 있다. 해당 코드는 6개의 Jobs 가 실행된다.
- name: 'Run only on Windows'
if: matrix.os == 'windows-latest'
shell: bash
run: |
echo "Windows Only"
- name: 'Run not on Windows'
if: matrix.os != 'windows-latest'
shell: bash
run: |
echo "Not Windows"
특정 운영 체제에서만 실행되도록 할 수도 있다.
if: github.event_name == 'pull_request'
특정 이벤트에서만 실행할 수도 있다.
env:
WORKFLOW_LEVEL: 'This values comes from the workflow level' #jobs에서도 가능, 각각의 steps에서도 환경변수 설정 가능
jobs:
build-job:
name: 'Build Job' #하는 일 각각의 빌드 서버가 할당된다.
runs-on: ubuntu-latest
steps:
- name: 'Say Hello' # 네임 하나가 각각의 스텝
shell: bash
run: |
echo "Hello World"
deploy-to-dev-job:
name: 'Deployment Job to DEV' #하는 일 각각의 빌드 서버가 할당된다.
needs:
- build-job
runs-on: ubuntu-latest
steps:
- name: 'Say DEV' # 네임 하나가 각각의 스텝
shell: bash
run: |
echo "DEVELOPERS"
deploy-to-prod-job:
name: 'Deployment Job to PROD' #하는 일 각각의 빌드 서버가 할당된다.
needs:
- build-job
runs-on: ubuntu-latest
steps:
- name: 'Say PRO' # 네임 하나가 각각의 스텝
shell: bash
run: |
echo "PRODUCER"
GitHub Actions에서는 기본적으로 각각의 Job에 대한 순서가 설정되어 있지 않다. 빠르게 캐치 한 것이 빠르게 실행된다. 따라서, 꼭 앞의 것이 먼저 실행되어야 하는 경우에는 이와 같이 Job Chaining을 걸어주어야 한다.