• Github Actions 설정하며 겪은 문제들 (gradle)

    2023. 3. 10.

    by. Sohyun

    문제 1 ) gradlew 권한문제로 실행 못함

    에러발생

    Error: Gradle script '/home/runner/work/time-deal-api/time-deal-api/gradlew' is not executable.

     
    해결 : 아래를 추가해서 재빌드하거나 로컬에서 권한 수정해서 푸시해주면 된다.

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    

     
     
    chmod +x gradlew 을 했을 때의 변화

    변경전
    변경후

    문제 2) 민감정보 외부 환경 변수로 주입하기

    일단 데이터베이스 비밀번호를 gitignore로 database properties파일로 비번 주입해주고 있었는데 그것이 안올라가서 
    문제 발생했고 
     
    (@Configuration에 설정해놓고 파일은 올리지 않아서 생기는 문제 -> 당연하지만 파일이 있거나 없으면 해결된다.)

    java.io.FileNotFoundException at ClassPathResource
    

     
    두가지 선택지가 있었다.

    빌드시 외부 환경변수로 설정하기 또는 database properties파일로 설정하기

     
    둘다 비밀번호를 주입하는 것이기 때문에 먼저 깃허브에서 제공하는 시크릿 키를 만든다.
    settings > Secrets and variables > Actions > New Repository secret

     
    1. 빌드시 외부 환경변수로 넣어준다.
    gradle.yml에 추가, 콘솔에 찍혀서 입력이 잘 되었음을 짐작할 수 있다.

        - name: set databases.properties
          env:
            DATABASE.USERNAME: ${{ secrets.DATABASE_USERNAME }}
            DATABASE.PASSWORD: ${{ secrets.DATABASE_PASSWORD }}

    -> 나는 테스트케이스 실행이 실패했다.
    외부에서 환경변수를 읽어오는 설정을 했을 때, 로컬에서도 애플리케이션에서는 읽었는데 테스트에서는 읽지 못했다.
    리소스가 분리되어 있어서 그런 것 같다….
    (= 테스트에는 리소스가 없어서 접근을 못하는?)
     
    테스트에도 리소스를 만들어 줘도 로컬에선 읽지만 여기에선 환경변수를 읽지를 못했다.
    다른 설정이 있겠지만 찾지 못했고, 된다고 해도 같은 내용을 테스트하면서 리소스를 다른 것을 쓰는 것도 번거롭고 실수하기 쉬울 것 같긴하다.

     
     
     
     
     
     
     
     
     
     
    2. 빌드시 database properties파일을 생성해준다.
    원하는 경로로 들어가기 -> properties 파일 생성하기 -> 시크릿키 2개 넣어주기
    (리눅스 명령어의 >>는 내용추가이고 >는 덮어쓰기)
    (스프링부트에서 @Configuration 설정으로 database properties파일을 읽도록 미리 설정해 둔 부분이 있다.)
    gradle.yml에 추가

    - name: make database.properties
          run: |
            cd ./src/main/resources
            touch ./database.properties
            echo "DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }}" >> ./database.properties
            echo "DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }}" >> ./database.properties
          shell: bash

     

    문제 3) 하이버네이트 설정문제

     application.yml파일에   database: mysql 추가해서 mysql 쓰겠다고 알리고

      jpa:
        properties:
          hibernate:
            show_sql: true
        database: mysql

    gradle.yml에 MySQL 설정을 추가해주었다.

        - name: Start MySQL
          uses: samin/mysql-action@v1.3
          with:
            character set server: 'utf8'
            mysql database: 'deal'
            mysql user: ${{ secrets.DATABASE_USERNAME }}
            mysql password: ${{ secrets.DATABASE_PASSWORD }}

     하지만 안되어서 설정을 싹 바꿈
    하이버네이트 설정 ddl-auto추가했더니 작동함
     
    전체

    name: Java CI with Gradle
    
    on:
      push:
        branches: [ "main" ]
      pull_request:
        branches: [ "main" ]
    
    permissions:
      contents: read
    
    jobs:
      build_test:
        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: Gradle Caching
          uses: actions/cache@v3
          with:
            path: |  
              ~/.gradle/caches
              ~/.gradle/wrapper
            key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
            restore-keys: |
              ${{ runner.os }}-gradle-    
            
        - name: Grant execute permission for gradlew
          run: chmod +x ./gradlew      
            
        - name: Start MySQL
          uses: samin/mysql-action@v1.3
          with:
            character set server: 'utf8'
            mysql database: 'deal'
            mysql user: ${{ secrets.DATABASE_USERNAME }}
            mysql password: ${{ secrets.DATABASE_PASSWORD }}         
            
        - name: make database.properties
          run: |
            cd ./src/main/resources
            touch ./database.properties
            echo "DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }}" >> ./database.properties
            echo "DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }}" >> ./database.properties
          shell: bash
          
        - name: Build with Gradle
          run: ./gradlew build -x test
    

     
     
    docs랑 아래 블로그에서 데이터베이스 파일 생성하는 방법을 참고했다.

     

    GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot)

    GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot) 안녕하세요, 이번 시간에는 GitHub-Actions로 CI/CD를 구축하는 방법에 대해 알아보겠습니다. 해당 포스팅이 CI/CD를 전체적으로 포함하고 있기는 하지만

    zzang9ha.tistory.com

     
    문제는 해결했지만 정답인지는 모르겠다!
    실수한 부분 있으면 알려주시면 감사하겠습니다. 🥰

    댓글