Git Action은 Github에서 제공하는 CI/CD 도구로, 코드를 Push, Pull Request, 또는 Schedule에 따라 자동으로 다양한 작업을 실행하여 개발 Workflow를 자동화할 수 있다.
⚠️ work flows 파일위치는 약속되어 있음
root/.github/workflows
아래 YAML 파일이 위치해야만 정상적으로 인식 된다.파일 확장자는 .yml
또는 .yaml
을 사용한다. (’ .github ’ 폴더 이름의 ‘ . ’ 빼먹지 말기)
Trigger Event가 발생하게 되면 workflows는 실행 됨.
Event 설정은 'on'
키 통해 설정할 수 있으며, 필수로 입력해야함.
*ex) push, fork, schedule 등…
: push event 발생시 job 이하 로직이 순서대로 시작됨.
on: push
job:
...
on:
push:
# 특정 branch의 push 이벤트 발생시에만
branches:
- targetBranch1
- targetBranch2
# 특정 branch의 push 이벤트는 제외
branches-ignore:
- targetBranch3
on:
push:
tags:
- 'dev-[0-9]+.[0-9]+.[0-9]+'
branches:
- 'dev'
‘jobs’
키 하위로 실행시킬 행위를 설정 할 수 있음.
...
on:
...
jobs: #jobs 하위에 실행시킬 행위 설정
deploy: # 그룹을 지정한다 필수이며 1개 만있어도 됨.
runs-on: ubuntu-latest # 명령을 실행할 환경 설정
strategy:
matrix:
node-version: ['18.x']
steps: # 순서대로 실행시킬 명령 작성
...
# '-' 는 단계를 나타냄, name을 사용하지 않아도되며 사용하지 않으면 uses 또는 run 이 그대로 사용됩니다..
- name : check
uses : actions/checkout@v3
- name : install
run: npm install
...
|
: run
섹션에서 |
기호는 여러 줄의 쉘 명령을 실행하도록 지정하는 데 사용되며, 각 줄은 별도의 쉘 명령으로 처리.
...
jobs:
...
steps:
run:|
echo "This is the first command."
echo "This is the second command."
...
#미사용시 각 명령을 세미콜론(';')으로 구분해야한다.
run: echo "This is the first command."; echo "This is the second command."
with
: uses
키워드로 지정된 액션에 전달되는 입력 인수.
...
steps:
- name: Check out code
uses: actions/checkout@v2
with: # 여러값을 추가할 수 있음.
ref: 'main'
id
: id
필드는 GitHub Actions 워크플로우에서 특정 단계를 식별하는 데 사용되며, 이 id는 후속 단계에서 이 단계의 출력을 참조하는 데 사용될 수 있음.
...
steps:
- name: Step 1
id: step1
run: echo "::set-output name=output1::value1"
- name: Step 2
run: echo "The output of Step 1 is ${{ steps.step1.outputs.output1 }}"
name: example-workflow
on:
push:
# 특정 tag를 감지하여 git flwo 실행
tags:
- 'dev-[0-9]+.[0-9]+.[0-9]+'
jobs:
deploy:
name: CI Pipeline
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['18.x']
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Setting environment
run: |
mv ./env/.env ./.env
mv ./env/.env.development ./.env.production
- name: Set env version
run: |
echo "${{ github.ref_name }}" >> ./.env.production
env:
NEXT_PUBLIC_WEB_VERSION: ${{ github.ref_name }}
- name: Install dependencies
run: npm install
- name: Run build
run: npm run build
# Make ZIP file with source code
# -x는 zip파일 생성 시에 해당 부분들을 제외한다
- name: Generate deployment package
run:
zip -r deploy.zip ./public/favicon-32x32.ico .next/ .ebignore .npmrc
package.json .env.production -x .next/cache/*
- name: Generate static
run: |
mkdir public/_next
mv .next/static public/_next/static
- name: Current timestamp
id: timestamp
run: echo "::set-output name=date::$(date +'%Y-%m-%dT%H-%M-%S-%3NZ')"
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.DEV_AWS_S3_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.DEV_AWS_S3_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- run: aws s3 sync public s3://dev-example.io
# Deploy to Elastic Beanstalk
# application_name과 environment_name 한번더 확인!
# 해당 부분은 꼭 같아야 한다!
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v14
with:
aws_access_key: ${{ secrets.DEV_AWS_EB_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.DEV_AWS_EB_SECRET_ACCESS_KEY }}
application_name: dev-example-web-io
environment_name: dev-example-web
region: ${{ secrets.DEV_AWS_REGION }}
version_label: '${{ steps.timestamp.outputs.date }}'
deployment_package: deploy.zip