
오랜만에 실수에서 배운 기록을 하려고 한다.
Git Actions 라는 새로운 도전을 했고 그 과정에서 아주 많은 시간이 들었다.
다시 Git Actions를 사용할 때 같은 실수를 하지 않기 위해 기록해 둔다.



.github/workflows로 폴더를 만든 뒤 .yml파일로 이름은 자유롭게 지어서 만들면 된다.(-/ 설명 /-) 이런식으로 달아놓겠다.build/site 라는 디렉토리에 생성해준다.name: (-/ 자유로운 이름 /-)
# 이 워크플로우는 pull request가 main 브랜치에 병합될 때만 실행된다.
on:
pull_request:
types: [closed] # PR이 'closed' 상태일 때 실행
branches:
- main # main 브랜치에 적용
# 워크플로우가 리포지토리 콘텐츠에 접근할 수 있게 권한을 설정한다.
permissions:
contents: write # 리포지토리 내용 수정 권한
id-token: write # GitHub ID 토큰을 쓸 수 있는 권한
jobs:
build:
# PR이 병합된 경우에만 실행된다.
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest # 최신 Ubuntu 환경에서 실행
steps:
# 1. 리포지토리의 코드를 체크아웃(다운로드)하는 단계
- name: Checkout (-/ 현재 레포지토리명 /-) code
uses: actions/checkout@v3 # GitHub에서 제공하는 체크아웃 액션 사용
# 2. Node.js 설정
- name: Set up Node.js
uses: actions/setup-node@v3 # Node.js 설정을 위한 액션 사용
with:
node-version: '20' # Node.js 20 버전 사용
# 3. 프로젝트 의존성 설치
- name: Install dependencies
run: npm install # npm 명령어로 의존성 설치
# 4. 프로젝트 빌드
- name: Build the project
run: npm run build # npm 명령어로 프로젝트 빌드
# 5. 이전에 클론한 리포지토리가 있으면 삭제
- name: Remove old repository clone if it exists
run: |
if [ -d prev ]; then
rm -rf prev # 'prev' 디렉토리가 있으면 삭제 - 이름은 이전 기록이므로 prev로 지었다.
echo 'Removed existing prev directory' # 삭제 후 메시지 출력
fi
# 6. 원격 레포지토리 리포지토리 클론
- name: Clone the (/- 푸쉬할 레포지토리 명 /-) repository
run: |
git clone --depth 1 --branch main https://x-access-token:${{ secrets.PAT }}@(/- 푸쉬할 레포지토리 명 /-) prev
echo 'Clone completed' # 클론 완료 메시지 출력
# 7. 빌드된 파일을 클론한 리포지토리에 동기화
- name: Sync files to the cloned repository
run: |
if [ -d build ]; then
rm -rf prev/site # 기존 'site' 폴더 삭제
cp -r build/site prev/site # 빌드된 파일 복사
echo 'Files synchronized' # 동기화 완료 메시지 출력
else
echo 'Build directory not found' # 빌드 폴더가 없을 경우 메시지 출력 후 에러 처리
exit 1
fi
# 8. 변경 사항을 커밋하고 푸시
- name: Commit and push changes to (-/ 원격 레포지토리 명 /-)
run: |
cd prev
git config --global user.name '(-/ 유저 이름 /-)' # 커밋 작성자 이름 설정
git config --global user.email '(-/ 유저 이메일 /-)' # 커밋 작성자 이메일 설정
git add . # 변경 사항 스테이징
echo 'Changes staged for commit' # 스테이징 완료 메시지
git commit -m '[sync] 파일 동기화' || echo '[no changes] 파일 변화 없음' # 커밋 또는 변경 사항이 없을 경우 메시지 출력
echo 'Commit completed' # 커밋 완료 메시지 출력
git push origin main # 변경 사항을 원격 리포지토리로 푸시
echo 'Push completed' # 푸시 완료 메시지 출력
env: # 환경 변수
PAT: ${{ secrets.PAT }} # GitHub Personal Access Token 사용 - 아까 secrets에 등록된 변수 사용

