Github Actions 테스트 설정

joona95·2024년 4월 2일

문제 상황

기본 레시피 저장소 프로젝트는 Github Actions 로 배포 자동화 설정이 되어 있다.

main / develop / test 에 따라 workflow 를 분리해두었다.

최근 querydsl 에 대한 JPA 테스트 코드를 작성하면서 테스트 DB 분리가 필요했다.

이에 따라서 테스트 application.yml 설정 파일 분리를 해두었다.

PR 생성 시에 자동으로 Github Actions 에서 test workflow 가 실행되도록 되어 있는데 오류가 발생했다.

오류에 따른 해결 방안

1. yml 파일 찾지 못하는 오류 발생

1-1. 설정된 path 에 파일이 없다고 발생하는 오류

  • Github Actions 에서 yml 을 찾지 못하는 오류 발생

@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@TestPropertySource(locations = "classpath:application-test.yml")
class IngredientCustomRepositoryTest extends Specification {
...
}
  • 테스트 코드에서 @TestPropertySource 설정을 통해서 application-test.yml 이라는 테스트 설정 파일을 참조하도록 해뒀음
  • 기존 workflow 에서 secret 설정으로 생성하는 yml 파일명이 application.yml 이었음

      # application.yml 파일 복사
      - name: Copy application.yml
        env:
          APPLICATION_YML_FILE: ${{ secrets.TEST_APPLICATION_YML }}
        run: echo $APPLICATION_YML_FILE | base64 --decode > src/main/resources/application-test.yml
  • Github Actions 의 test workflow 설정에서 yml 파일명을 application.yml 에서 application-test.yml로 변경

  • 테스트용 yml 파일을 base64로 인코딩한 뒤 secret 설정에 등록

1-2. @SpringBootTest에서 yml 파일을 찾을 수 없다고 오류 발생

  • 기본 앱 테스트에서 application.yml 을 참조하면서 data 연결 정보가 없다고 오류 발생

@ActiveProfiles("test")
@SpringBootTest(properties = "classpath:application-test.yml")
class AppApplicationTests {

    @Test
    void contextLoads() {
    }

}
  • @ActiveProfiles("test") 설정으로 test profile 일 때 실행되도록 설정
  • @SpringBootTest 의 properties 에 참조할 yml 을 application-test.yml 로 설정

2. AWS RDS 인바운드 IP 제한으로 DB 연결 오류 발생

  • RDS 에서 인바운드 설정으로 현재 EC2, 로컬호스트 IP만 허용하고 있음
  • Github Actions 는 실행 시마다 IP 가 변동되어 고정 IP 등록 불가
  • JPA 테스트여서 테스트 DB 연결이 필요함
      - name: Get Github action IP
        id: ip
        uses: haythem/public-ip@v1.2

      - name: Setting environment variables
        run: |
          echo "AWS_DEFAULT_REGION=ap-northeast-2" >> $GITHUB_ENV
          echo "AWS_SG_NAME=launch-wizard-1" >> $GITHUB_ENV

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: Add Github Actions IP to Security group
        run: |
          aws ec2 authorize-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 3306 --cidr ${{ steps.ip.outputs.ipv4 }}/32
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ap-northeast-2

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

      - name: Test with Gradle
        run: ./gradlew test

      - name: Remove Github Actions IP from security group
        run: |
          aws ec2 revoke-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 3306 --cidr ${{ steps.ip.outputs.ipv4 }}/32
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ap-northeast-2
  • Github Actions 의 test workflow 내에 AWS 에 Github Actions 가 실행되는 IP 를 등록 후 테스트하도록 함
  • 테스트가 성공하고 완료된 이후에는 해당 IP 를 보안 정보에서 삭제하도록 함

(+) 추가 설정 필요

  • AWS 에 IAM 에 설정해둔 Github Actions 권한에 AmazonEC2FullAccess 권한 추가 필요

      - name: Setting environment variables
        run: |
          echo "AWS_DEFAULT_REGION=ap-northeast-2" >> $GITHUB_ENV
          echo "AWS_SG_NAME=launch-wizard-1" >> $GITHUB_ENV
  • AWS_SG_NAME 을 실제 RDS 에서 사용하고 있는 보안 그룹명으로 설정

      - name: Add Github Actions IP to Security group
        run: |
          aws ec2 authorize-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 3306 --cidr ${{ steps.ip.outputs.ipv4 }}/32
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ap-northeast-2
      - name: Remove Github Actions IP from security group
        run: |
          aws ec2 revoke-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 3306 --cidr ${{ steps.ip.outputs.ipv4 }}/32
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ap-northeast-2
  • DB 연결을 위한 IP 등록이므로 포트 설정을 3306 포트로 해야 함

(+) GitHub Actions Public IP 가져오는 라이브러리 오류

    - name: Get Public IP
      id: publicip
      run: |
        response=$(curl -s canhazip.com)
        echo "ip='$response'" >> "$GITHUB_OUTPUT"
        
    - name: Add Github Actions IP to Security group
      run: |
        aws ec2 authorize-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 3306 --cidr ${{ steps.publicip.outputs.ip }}/32
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_DEFAULT_REGION: ap-northeast-2        

    - name: Remove Github Actions IP from security group
      run: |
        aws ec2 revoke-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 3306 --cidr ${{ steps.publicip.outputs.ip }}/32
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_DEFAULT_REGION: ap-northeast-2
  • 라이브러리 사용하지 않고 명령어로 ip 가져오도록 수정

0개의 댓글