개발일지

[Spring] Github Actions 테스트 시 credential 값 설정하는 방법

Tommy__Kim 2023. 10. 26. 01:10
프로젝트 환경 : Java, Spring
SVN : Github
문제 상황 : Sonar Cloud의 Actions 동작 중 문제 발생

문제 발생 상황

프로젝트를 진행하며 이미지 파일을 AWS의 S3 버킷에 올려하는 상황이 생겼습니다. 

S3에 업로드하기 위해서는 S3의 버킷 이름, IAM의 ACCESS-KEY, SECRET-KEY가 필요합니다. 

앞서 언급한 정보들은 github에 올라가는 경우 악용할 수 있어 보통 credential yaml 파일을 생성하고, github에는 올리지 않고 로컬, 배포 환경 서버에 yaml 파일을 두고 다음과 같이 yaml 파일을 include 해 사용합니다.

spring:
  profiles:
    active: local   # 기본 환경
    include: credential # 비밀 정보들 관리 관련 yaml

[application-credential.yaml]

cloud:
  aws:
    s3:
      bucket: S3 버킷 이름
    credentials:
      access-key: IAM ACCESS KEY
      secret-key: IAM SECRET KEY
    region:
      static: ap-northeast-2
      auto: false
    stack:
      auto: false

그러고 Java Code 에서는 다음과 같이 설정 정보들을 가져오도록 구현합니다. 

@Configuration
public class S3Configuration {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;

    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonS3Client amazonS3Client() {
        BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);

        return (AmazonS3Client) AmazonS3ClientBuilder
                .standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
                .build();
    }

 

로컬에서 이와 관련된 테스트 코드들을 작성하고 github에 push 후, Actions가 작업을 수행한 후 Sonar Cloud의 분석 리포트를 봤는데 다음과 같이 테스트 코드 몇 개가 깨져있었습니다. 

해당 원인을 찾아가 보니 @Value를 선언한 코드에 대해 테스트 하는 경우 application-credential.yaml에 들어있는 값들을 불러올 수 없기 때문에 Bean을 생성하지 못해 테스트가 깨지는 상황이 발생했습니다. 

 

해결책

Github에서는 환경변수를 저장할 수 있는 공간이 있습니다. 

Github Repository -> Settings -> Secrets and variables -> Actions 탭 클릭 후 New Repository secret 클릭

yaml에 적었던 값들을 여기에 key value 형식으로 적어주면 됩니다. 

 

그 후 action을 명세하는 yml에 다음의 명령어를 적어주면 됩니다. 

      - name: Setup environment variables
        run: |
          echo "CLOUD_AWS_REGION_STATIC=ap-northeast-2" >> $GITHUB_ENV
          echo "CLOUD_AWS_CREDENTIALS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV
          echo "CLOUD_AWS_CREDENTIALS_SECRET_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV
          echo "CLOUD_AWS_S3_BUCKET=${{ secrets.BUCKET_NAME }}" >> $GITHUB_ENV

credential.yaml에 있던 key값들을 echo 명령어를 통해 값을 저장하면 됩니다. 

여기서 CLOUD_AWS_REGION_STATIC부분 (= 왼쪽 부분)은 yaml 혹은 properties에 적힌 key 값을 적어주면 됩니다. 

예시는 다음과 같습니다. 

cloud:
  aws:
    s3:
      bucket: S3-Value	# CLOUD_AWS_S3_BUCKET
    credentials:
      access-key: ACCESS-KEY-VALUE  # CLOUD_AWS_CREDENTIALS_ACCESS_KEY
      secret-key: SECRET-KEY-VALUE  # CLOUD_AWS_CREDENTIALS_SECRET_KEY

#{{ }} 안의 값은 Github Repository Secret에 적어준 key 값을 적어주면 됩니다. 

그런 후 테스트를 다시 실행해 보면 

다음과 같이 정상적으로 테스트를 진행하는 것을 확인할 수 있습니다.