Github Action, act 로컬 테스트 실행시 SSH Private Key 저장 문제 해결

2025. 12. 5. 15:11문제해결

개요

이 글에서는 Github Action의 워크플로우 파일을 로컬 개발 환경에서 act라는 오픈소스 프로세스를 실행하여 테스트하다가 SSH 접속이 안되는 문제를 해결하는 것을 다루고 있습니다.

https://github.com/nektos/act

 

GitHub - nektos/act: Run your GitHub Actions locally 🚀

Run your GitHub Actions locally 🚀. Contribute to nektos/act development by creating an account on GitHub.

github.com

 

배경

GCP 클라우드 기반의 배포를 위한 워크플로우 파일을 작성하는 과정에서 Github Action 워크플로우를 로컬 개발 환경에서 테스트를 하기 위해서 act라는 프로세스를 이용하여 테스트를 하고 있었습니다. 그중에서 문제가 되었던 것은 클라우드의 VM 인스턴스에 접속하기 위해서 SSH 접속을 시도하는 과정에서 문제가 발생하였습니다.

 

문제가 발생했던 워크플로우의 스텝은 다음과 같습니다.

jobs:
  deploy:
    runs-on: ubuntu-22.04
    environment: gcp-production
    needs: build-image
    defaults:
      run:
        shell: bash

    steps:
      # ...
      # gcp ssh 연결 확인
      - name: Test SSH Connection
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ env.GCP_INSTANCE_IP }}
          username: ${{ env.GCP_SSH_USERNAME }}
          passphrase: ${{ env.GCP_SSH_PASSPHRASE }}
          key: ${{ env.GCP_SSH_PRIVATE_KEY }}
          port: 22
          script: |
            echo "SSH connection successful!"

 

act 명령어 실행

act -W .github/workflows/ci.cd.production.gcp.yml \
--container-architecture linux/amd64 \
--secret-file .secrets \
--job deploy

 

.secrets 파일

GIT_TOKEN={GIT_TOKEN_VALUE}
DOCKER_USERNAME={USERNAME}
DOCKER_PASSWORD={PASSWORD}
GCP_INSTANCE_IP={VM_INSTANCE_IP}
GCP_SSH_USERNAME={SSH_USERNAME}
GCP_SSH_PASSPHRASE={SSH_PASSPHRASE}
GCP_SSH_PRIVATE_KEY=-----BEGIN OPENSSH PRIVATE KEY-----\n{데이터 본문}\n-----END OPENSSH PRIVATE KEY-----

 

실행 결과

 

원인

위와 같이 SSH 접속을 실패한 원인은 SSH Private Key 값이 정확하지 않았기 때문입니다. 현재 설정된 GCP_SSH_PRIVATE_KEY 변수의 값의 형식은 다음과 같습니다.

GCP_SSH_PRIVATE_KEY=-----BEGIN OPENSSH PRIVATE KEY-----\n{데이터 본문}\n-----END OPENSSH PRIVATE KEY-----

 

실제 pem 파일에 저장된 SSH Private Key 값은 다음과 같습니다.

 

위와 같은 값이 나오게된 경위는 Private Key값이 줄바꿈이 포함되어 저장되어 있습니다. 이러한 값을 한줄의 문자열로 저장하기 위해서 줄바꿈을 "\n" 문자열로 변경하여 넣어야 겠다고 생각하였습니다. 그래서 다음과 같은 명령어를 사용하여 줄바꿈을 "\n"으로 변경하여 출력하도록 하였습니다.

KEY_FILE_PATH="{pem 파일 경로}"
awk '{printf "%s\\n", $0}' "$KEY_FILE_PATH" | sed 's/\\n$//'

 

하지만 위와 같이 생성된 한줄의 문자열 형태는 정확하지 않은 값이기 때문에 SSH 접속에 실패한 것입니다.

 

해결 방법

정확한 SSH Private Key 값을 프로퍼티 값에 넣기 위해서는 다음과 같은 형태로 저장되어야 합니다.

GCP_SSH_PRIVATE_KEY="-----BEGIN OPENSSH PRIVATE KEY-----
...mNyeXB0AAAAGAAAABDsFvUfRU
...
...sE6n0A==
-----END OPENSSH PRIVATE KEY-----"

 

다음 act 명령어를 실행하여 SSH 접속이 되는지 확인해봅니다.

act -W .github/workflows/ci.cd.production.gcp.yml \
--container-architecture linux/amd64 \
--secret-file .secrets \
--job deploy

 

실행 결과를 보면 SSH 접속하여 echo 명령어로 출력한 것을 볼 수 있습니다.

 

References