Git Actions 다른 레포지토리 자동 푸쉬 고생기

김민찬·2024년 8월 31일

Git Actions

목록 보기
1/1
post-thumbnail

실수와 실패과정 기록이유

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

Git Actions 도전

  • Github blog 를 만들고 싶은데 build된 html, css, js 코드 말고 빌드 전 코드들을 블로그 레포지토리에 올리고 싶지 않았다.
    • 이 과정에서 직접 손으로 복사해서 블로그 레포지토리에 붙여넣기 하는 과정이 너무 귀찮았다.
  • 그리고 가장 중요한 이유는 Git Actions를 단순히 써보고 싶었다 ㅎㅎ

미리 설정할 것

  • 원격 푸쉬를 하기 위해서는 PAT(personal access token)이 필요하다. - 토큰은 복사해놓자 (프로필 클릭 -> Settings -> Developer Settings => Personal access tokens 에서 발급 가능하다.)
  • ※ 조직 레포지토리면 owner 권한이 있는 것이 좋다.
  • Actions 설정과 Token 발급을 할때 부탁을 해야되는 부가적인 힘듬이 동반될 수 있기 때문이다.
  • 매우 중요한 설정 레포지토리의 Allow GitHub Actions to create and approve pull requests를 켜야한다.
    • 지금 하려는 작업이 다른 레포지토리에 원격 푸쉬를 위해서 하는 것이기 때문에 허가를 해줘야 된다.
    • 이 설정은 레포지토리 Settings -> Actions -> General 에 Workflow Permissions 에 있다.

PAT 변수로 지정해 놓기

  • 위에서 받은 PAT는 미리 변수로 설정해 놔야한다.
  • 레포지토리 Settings 에서 왼쪽 탭 'Secrets and variables' 에서 Actions의 Secrets로 등록하면 된다.
  • 나는 이름을 PAT로 등록했고 아까 복사한 토큰을 Secret에 넣으면 된다.

드디어 Git Actions 만들기

  • 우선 프로젝트 Root에 .github/workflows로 폴더를 만든 뒤 .yml파일로 이름은 자유롭게 지어서 만들면 된다.
  • 아래는 내가 만든 Git Actions고 코드에 설명을 달아 놓겠다.
  • 자유롭게 쓸것이나 레포지토리명 등은 보기 좋게 (-/ 설명 /-) 이런식으로 달아놓겠다.

코드를 읽기전 사전 상황 설명

  • Antora라는 Docs 라이브러리를 사용했다.
    • antora는 기본적으로 빌드 결과를 build/site 라는 디렉토리에 생성해준다.
  • github blog 레포지토리는 '푸쉬할 레포지토리'라고 명할 것이다.
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에 등록된 변수 사용

결과

  • 30 여번의 시도 끝에 겨우되었다.
  • 조직 레포지토리의 권한문제와 cmd 명령어가 헷깔려서 거기서만 20회를 시도한 것같다.

profile
두려움 없이

0개의 댓글