GitHub에서 제공하는 자동화 플랫폼으로서, 소프트웨어 개발 및 배포 과정을 자동화하고 효율적으로 관리할 수 있는 기능을 제공.
개발자들이 소프트웨어의 빌드, 테스트, 배포, 모니터링 등을 자동화하는 데 사용되며, 이를 통해 개발 작업의 품질을 향상시키고 개발 프로세스를 간소화할 수 있다.
워크플로우는 특정 GitHub 리포지토리에 연결되어 있다. 이 리포지토리 내의 .github/workflows
디렉토리에 워크플로우 정의 파일을 작성하여 워크플로우를 설정할 수 있다.
하나 이상의 잡(Job)을 포함하며, 이 잡들은 이벤트 발생 시 실행
특정 이벤트에 반응하여 워크플로우가 실행되며, 여러 이벤트 유형을 트리거로 설정 가능. 예를 들어 코드 커밋, PR 생성, 이슈 등
push
: 커밋을 푸시할 때fork
: 리포지토리가 포크될 때watch
: 리포지토리가 스타를 받을 때pull_request
: 풀 리퀘스트 액션이 발생할 때 (생성, 종료 등)issues
: 이슈가 열릴 때, 삭제될 때 등discussion
: 논의 액션이 발생할 때 (생성, 삭제 등)create
: 브랜치나 태그가 생성될 때issue_comment
: 이슈나 풀 리퀘스트에 댓글이 달릴 때workflow_dispatch
: 수동으로 워크플로우를 트리거할 때repository_dispatch
: REST API 요청을 통해 워크플로우를 트리거할 때schedule
: 워크플로우가 일정에 따라 예약 실행될 때workflow_cal
: 다른 워크플로우에서 호출될 때실행 환경인 Runner 에서 실행되는 작업들을 정의
하나 이상의 단계(Step)을 포함하며, 병렬 또는 순차적으로 실행될 수 있다.
필요한 조건에 따라 실행 여부를 결정할 수 있다.
쉘 스크립트 또는 Action을 실행한다.
사용자 지정 또는 타사 액션을 사용할 수 있다.
단계는 순차적으로 실행되며, 각 단계가 성공적으로 완료되어야 다음 단계가 실행된다.
참고)
GitHub Actions는 공개 리포지토리에서는 무료로 사용할 수 있지만 비공개 리포지토리의 경우에는 일정량의 무료 사용량만 제공되며, 추가 사용량은 유료로 결제해야 한다고 한다!
YAML 파일은 들여쓰기와 공백을 정확하게 사용해야 한다!
그리고 YAML은 대소문자를 구분하기 때문에 키워드, 값, 변수 등을 정확하게 대소문자를 일치시켜 작성해야 한다.
그리고 GitHub Actions에서 사용 가능한 키워드와 옵션을 알고 사용해야 하므로, 오타나 잘못된 키워드 사용을 주의해야 한다.
name : First Workflow #워크플로우의 이름 정의
on: workflow_dispatch #트리거 되는 이벤트
jobs: #워크플로 내의 Job 정의
first-job:
runs-on: ubuntu-latest #어떤 환경에서 실행될지
steps: #작업 내의 step 정의
- name: Print greeting #step의 이름
run: echo "Hello World" #실행할 쉘 명령어
- name: Print goodbye
run: echo "Done - bye!"
여러 줄의 쉘 명령어를 실행해야 하는 경우 (또는 가독성을 위해 여러 줄의 명령어를 실행해야 하는 경우), run: 키워드 뒤에 파이프 기호 (|)를 추가하여 간단히 실행 가능하다고 한다.
1. ...
2. run: |
3. echo "첫 번째 결과"
4. echo "두 번째 결과"
run
): 사용자가 정의한 (일반적으로 간단한) 쉘 명령어
: (일반적으로 복잡한) 자주 반복되는 작업을 수행하는 (사용자 지정) 응용 프로그램
: 미리 정의된 액션을 사용하거나, 필요한 작업을 직접 정의하여 워크플로우에서 사용할 수 있다.
아래의 Deployment Exercise 2 워크플로우는 코드가 push
될 때 트리거되며, lint, test, deploy 작업을 차례로 수행한다. (needs
키워드 사용)
name: Deployment Exercise 2
on: push
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Get code
uses: actions/checkout@v3
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint
test:
needs: lint
runs-on: ubuntu-latest
steps:
- name: Get code
uses: actions/checkout@v3
- name: Install dependencies
run: npm ci
- name: Test
run: npm run test
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Get code
uses: actions/checkout@v3
- name: Install dependencies
run: npm ci
- name: Build code
run: npm run build
- name: Deploy code
run: echo "Deploying..."
actions/checkout
액션은 워크플로우의 시작 단계로서 필요한 코드를 가져와 워크플로우 실행 환경을 설정하고, 그 후의 모든 작업에서 해당 코드를 사용할 수 있도록 한다.
참고)
npm ci
Node.js 패키지 매니저인 npm을 사용하여 프로젝트의 종속성(dependencies)을 설치하는 명령. 주로 CI/CD 파이프라인과 같이 자동화된 환경에서 사용된다.
프로젝트의 package-lock.json 파일을 엄격하게 따라 설치를 진행한다. 그리고 중간에 종속성 설치가 실패하면 중단된다. 즉, 패키지 버전 충돌 등의 문제가 발생하면 설치를 진행하지 않고 에러를 반환한다.
npm ci는 package-lock.json을 사용하여 미리 계산된 종속성 트리를 기반으로 빠르게 설치된다.일반적으로 npm ci는 CI/CD 파이프라인에서 사용되며, 빠른, 일관된, 오류 없는 종속성 설치를 위해 활용! 반면 개발 환경이나 프로젝트 초기 설정에서는 npm install을 사용하는 것이 일반적이라고 한다.
${{ }}
GitHub Actions에서 사용되는 템플릿 문법. 워크플로우 파일에서 변수나 표현식을 사용하거나 GitHub 이벤트의 데이터에 접근하는 데 사용
변수 사용: 워크플로우 내에서 정의한 변수를 사용할 때 ${{변수명}} 형식으로 사용할 수 있다.
GitHub 이벤트 데이터 접근: ${{ github.event.이벤트명 }}
과 같은 형식으로 GitHub 이벤트의 데이터에 접근할 수 있다. 예를 들어 ${{ github.event.issue.title }}
은 이슈 이벤트에서 이슈 제목을 가져온다.
함수 사용: ${{ 함수명(매개변수) }}
과 같은 형식으로 내장 함수를 사용할 수 있다. 예를 들어 ${{ toJSON(github.event) }}
은 GitHub 이벤트를 JSON 형식으로 변환