GitHub Action으로 빌드 자동화 - CI

LJH·2021년 12월 5일
0

# 스크립트

  • deploy.yaml
name: CQRE-CI

env:
  CQRE_JASYPT_PASSWORD: ${{ secrets.CQRE_JASYPT_PASSWORD }}

on: # 지정한 이벤트가 해당 브랜치에서 발생할 때 Github Action 동작
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs: # 여러 Step으로 구성되고, 각 step 들은 가상 환경의 인스턴스에서 실행됨.
  build:
    runs-on: ubuntu-20.04 # 가상환경 OS

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: create mysql docker container # 가상환경에 mysql 컨테이너 생성
        run: |
          sudo docker run -d -p 3306:3306 --env MYSQL_DATABASE=cqre --env MYSQL_ROOT_PASSWORD=1234 mysql:8.0.23

      - name : Set up JDK 11 # 자바 버전
        uses: actions/setup-java@v1
        with:
          distribution: 'adopt'
          java-version: '11'

      - name : Grant execute permission for gradlew # 권한 추가
        run: chmod +x ./gradlew
        shell: bash

      - name: cache
        uses: actions/cache@v2
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-

      - name : Build with Gradle # gradle로 빌드
        run: ./gradlew clean build
        shell: bash

      - name: Set up Docker Buildx # Dockerfile 빌드로 DockerImage 생성
        uses: docker/setup-buildx-action@v1

      - name: Login to DockerHub # DockerHub 로그인
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push # DockerHub로 DockerImage Push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64
          push: true
          tags: ${{ secrets.DOCKERHUB_TAG }}

      - name: Get Current Time
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      - name: Show Current Time
        run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
        shell: bash

#Docker hub

  • 빌드 후 Docker image를 생성해서 지정된 Docker Hub 저장소에 이미지를 push 하도록
    스크립트에 추가했다. 이를 위해서 필요한 작업들이 있다.

사용자 추가

  • 저장소는 디폴트가 퍼블릭
  • Collaborators 탭에서 사용자 추가해줘야, 다른 사용자도 이 저장소에 도커 이미지 올릴 수 있다.

  • 혼자라면 상관없다.

토큰 발급

  • Account Settings → Security → New Access Token

  • 발급받은 토큰을 Github Action Secretes에 넣어놓고 사용하면 된다.


# 중요정보 암호화

  • JASYPT_PASSWORD, secrets.DOCKERHUB_TOKEN 이런 중요 정보들은
    github action에 넣어놓고 사용한다.
  • 저장소 → Settings → Secrets → New repository secret
    name에는 스크립트에서 사용한 이름이랑 매핑, value에는 실제 값
  • 주의! DockerHub_Tag값은 [DOCKER HUB 계정 이름]/[DOCKER HUB 저장소]:[TAG] 형태로 값을 지정해야 한다.

#이슈 - 프로퍼티 지정

  • 프로퍼티 파일에 있는 정보들을 가져오지 못하는 에러가 발생했다.
  • 이유는 프로퍼티 파일을 로컬, 개발환경별로 분리했는데 빌드 시 두 프로퍼티 파일 중 어떤 프로퍼티 파일을 선택해야 할지 몰라서 발생한 에러이다.
  • 빌드 파일에 프로퍼티 파일을 지정해 주면 된다.
test {
   useJUnitPlatform()
   systemProperty "file.encoding", "utf-8"
   systemProperty 'spring.profiles.active', 'local'
}

#캐싱

- name: cache
  uses: actions/cache@v2
  with:
    path: |
      ~/.gradle/caches
      ~/.gradle/wrapper
    key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
    restore-keys: |
      ${{ runner.os }}-gradle-


#ETC

  • 테스트, 빌드 작업은 GitHub Action에서 만든 가상환경에서 진행된다는 점을 꼭 기억하자.
    이 글에는 포함하지 않았지만 이 때문에 3일동안 삽질했다.

  • 빌드 실패 시 정확한 에러 메시지를 보려면 로컬에서는 index.html 파일을 보면 알 수 있지만, GitHub Action으로 빌드하면 해당 가상환경에 남기는 index.html 파일을 확인해야 하는데, 공식문서와 구글링을 다 뒤져봤지만 가상환경에서 생성된 index.html 파일을 확인할 수 있는 방법을 찾지 못했다.
    그래서 어떤부분에서 에러가 발생했는지 추측으로만 해결해야 했다.

2개의 댓글

comment-user-thumbnail
2022년 5월 23일

좋은 내용 잘 보고 갑니다
감사합니다.

1개의 답글