Pull Request
나 push
같은 이벤트를 트리거로 GitHub 작업 워크플로(Workflow)를 구성할 수 있습니다..yml
(혹은 .yaml
) 파일에 의해 구성되며, 테스트, 배포 등 기능에 따라 여러개의 워크플로도 만들 수 있습니다..github/workflows
디렉토리 이하에 위치.yml
)에 따라 Github Repository에 특정 변동사항을 트리거로 작동됩니다Github Actions를 통한 배포 자동화
하지 않는다면 해당 working-directory를 읽지 못하고 그냥 종료되기 때문에 꼭 적어야 합니다.
.github/workflows
디렉토리에 YAML 형태로 저장되며, event에 의해 실행 됩니다.cron
으로 특정 시간대 반복N개의 도커 이미지
선행관계
를 지정할 수 있으며, 후행작업은 선행작업이 끝난 이후에야 실행될 수 있습니다. 만약 선행관계가 설정되지 않은 경우 병렬로 실행
됩니다. 그리고 각각의 작업은 실패할 수 있으며, 선행작업이 실패한 경우 후행작업은 취소됩니다.단일 스크립트 명령어
다중 스크립트 명령어
다른 사람이 배포한 액션 명령어
jobs:
build:
runs-on: ubuntu-lastest
strategy:
matrix:
os: [ubunutu-latest, windows-2016]
node-version: [12.x, 14.x]
# 10분마다 실행 workflow
on:
schedule:
- cron: '*/10 * * * *'
# master, dev 브랜치에 push 된 경우에 실행
on:
push:
branches: [master, dev]
# master, dev 브랜치에 push 되었고,
# js파일의 변경이 있을 때에만 트리거,
# doc 디렉토리의 변경에는 트리거 하지 않게 하고싶은 경우
on:
push:
branches: [master, dev]
paths:
- "**.js"
paths-ignore:
- "doc/**"
jobs
jobs에 등록된 job들은 기본적으로 병렬적으로 실행된다. job_id를 키값으로 하여 생성할 수 있다.jobs:
some-job-id: ...
some-job-id-2: ...
깃허브 액션은 도커 컨테이너 위에서 작동
한다가상기계
와 도커
의 2단계로 나누어집니다. 즉 도커 이미지가 가상기계 위에서 수행
되는 형태이므로 2개의 실행환경을 명시해야 합니다.가상기계 운영체제
- 필수깃허브 액션에서 제공하는 도커 이미지 (또는 이미지의 목록)
- 선택appepec.yml
설정 파일에 의해 쉘 스크립트 등 단계에 따라 특정 동작을 합니다..yml
(설정 파일)과 .sh
(쉘 스크립트)에 의해 각 배포 결과를 로그로 저장하며 빌드 파일(.jar
)을 실행strategy:
와 matrix:
를 사용하면 간단하게 도커 이미지를 명세할 수 있습니다. 아래는 4개의 운영체제에서 각각 8, 10, 12
버전의 노드를 이용한 실행환경을 생성합니다. 즉, 12개의 실행환경이 만들어집니다.
jobs:
build_and_test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [8.x, 10.x, 12.x]
container:
[
"ubuntu-latest",
"centos-latest",
"windows-latest",
"macos-latest",
]
커스텀 도커 이미지를 사용하고 싶다면 matrix:
를 사용하면 안됩니다.
jobs:
build_and_test:
runs-on: ubuntu-latest
strategy:
container:
image: node:10.16-jessie
env:
NODE_ENV: development
ports:
80
volumes:
my_docker_volume:/volume_mount
options: --cpus 1
후행작업에서 needs:
를 사용하면 해당 작업들이 끝날때까지 대기합니다. 즉, 아래의 작업들은 1 → 2 → 3
순서로 수행됩니다.
#선행 관계 설정
jobs:
job1:
....
job2:
needs: job1
job3:
needs: [job1, job2]
# 병렬
...
jobs:
job1:
job2:
job3:
환경변수 설정
**env**:
**ENV_KEY1**: xxx
**ENV_KEY2:** xxx
선택적 실행 설정
if:
에 넣어진 표현식의 결과가 참이 아니라면 수행되지 않습니다jobs:
nofity_to_slack:
if: github.event_name == 'push'
각 작업의 steps:
에 적으며, 새로운 스텝마다 -
를 앞에 적어야 합니다.
steps:
- action1:
- action2:
...
- actionN:
단일 스크립트
run:
다중 스크립트
run:
에 |
으로 시작하여 적고싶은 만큼 적습니다.
다른 사람이 배포한 스크립트
use:
를 사용하면 됩니다. 필요한 경우 with:
과 env:
를 사용하여 추가적인 데이터를 보낼 수 있습니다.
jobs:
build_and_test:
...
steps:
- name: Execute test.
run: npm test
- name: Install dependencies.
run: |
npm cl
npm install
- use: 8398a7/action-slack@v3
with:
...
env:
...
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
permissions:
contents: read
env:
S3_BUCKET_NAME: be-0-name
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
# build한 후 프로젝트를 압축합니다.
- name: Make zip file
run: zip -r ./practice-deploy.zip .
shell: bash
# Access Key와 Secret Access Key를 통해 권한을 확인합니다.
# 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않습니다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옵니다.
aws-region: ap-northeast-2
# 압축한 프로젝트를 S3로 전송합니다.
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./practice-deploy.zip s3://$S3_BUCKET_NAME/practice-deploy.zip
Checkout은 현재 상태의 소스코드를 가상의 컨테이너 안으로 Checkout해주는 역할
name
on
branches
on:
branches:
# 단일 브랜치
- master
# 다중 브랜치
- [master, dev]
# * 또는 ** 정규식 매칭
# refs/heads/releases/ 하위의 브랜치에 적용됩니다.
- 'releases/**'
# branches-ignore를 위처럼 사용하면 특정 브랜치를 제외할 수 있습니다.
#태그 범위 제한
tags:
# 단일 태그
- v1
# 다중 태그
- [v1, v2]
# * 또는 ** 정규식 매칭
# v1.1, v1.2 ... v1.9 까지 매칭됩니다.
- v1.*
#크론식
on:
schedule:
- cron: '*/15 * * * *'
jobs
Steps
uses: actions/checkout@v2
- 해당 레포지토리를 pull 받고 이동하는 action 대부분의 workflow에서 사용uses: actions/setup-node@v2
- 노드를 설치하는 action으로 가상머신안에는 대부분의 프로그래밍 언어가 설치되어 있지 않기 때문에 프로젝트 실행에 필요한 언어들을 action을 통해 다운run: npm install -g bats
- run 키워드를 통해 러너가 실행되는 서버에서 명령어를 실행paths
로 특정 패턴을 설정하여, 해당 패턴에 일치하는 파일이 변경되었을 때 워크플로가 실행되도록 설정할 수 있다.paths와 반대로paths-ignore
로는 무시할 패턴을 설정할 수 있다. (paths 의 값의 앞에!를 붙여 paths-ignore와 같이 사용할 수도 있다.)version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/action #왼쪽의 디렉토리 내에 배포가 진행됨
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: scripts/deploy.sh #최상위 디렉토리에 scripts 폴더내의 쉘 스크립트가 실행됨
timeout: 60
runas: ubuntu
#!/bin/bash# 빌드 파일의 이름이 콘텐츠와 다르다면 다음 줄의 .jar 파일 이름을 수정하시기 바랍니다.
BUILD_JAR=$(ls /home/ubuntu/action/build/libs/practice-githubAction-deploy-0.0.1-SNAPSHOT.jar)JAR_NAME=$(basename $BUILD_JAR)echo "> 현재 시간: $(date)" >> /home/ubuntu/action/deploy.log
echo "> build 파일명: $JAR_NAME" >> /home/ubuntu/action/deploy.log
echo "> build 파일 복사" >> /home/ubuntu/action/deploy.log
DEPLOY_PATH=/home/ubuntu/action/
cp $BUILD_JAR $DEPLOY_PATH
echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ubuntu/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)if [ -z $CURRENT_PID ]
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ubuntu/action/deploy.log
else
echo "> kill -9 $CURRENT_PID" >> /home/ubuntu/action/deploy.log
sudo kill -9 $CURRENT_PID
sleep 5
fi
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포" >> /home/ubuntu/action/deploy.log
sudo nohup java -jar $DEPLOY_JAR >> /home/ubuntu/deploy.log2>/home/ubuntu/action/deploy_err.log &
# CodeDeploy에게 배포 명령을 내립니다.
- name: Code Deploy
run: >
aws deploy create-deployment --application-name be-0-name #code Deploy 애플리케이션 이름
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name be-0-name-group #배포 그룹 이름
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=practice-deploy.zip
AWS 콘솔에서 리소스가 변화된 경우에는(e.g. 파라미터 스토어 변수값 변경, Code Deploy 설정 변경 등) 코드의 변화가 아니기 때문에 파이프라인이나 Github Actions가 자동으로 실행되지 않습니다.
→
1. 파이프라인 다시실행하기 : 변경 사항 릴리스 버튼 클릭
2. Github Actions 다시 실행하기 : 가장 최근에 실행된 workflow 선택
3. Re-run all jobs 버튼을 클릭하여 workflow 재실행