로컬 서버에 CI/CD 적용하기 (Feat : ssh: handshake failed 해결)

2024. 2. 27. 11:18프로그래밍/웹 개발

일반적으로 CI/CD는 도커 환경에서 도커 이미지를 빌드하고 클러스터에서 해당 이미지를 서비스로 실행한다.

물론 일반적인 경우의 얘기이고 당연히 다른 방법으로도 CI/CD를 구축할 수 있다. 

가령 클라우드 환경이 아닌 실제 로컬 환경에서 서버를 쓰는 경우도 있다.

이 경우 SSH로 접속해 배포를 자동화할 수 있다. 

 

Git Hub Actions에서는 배포를 위해 여러가지 도구들을 제공하는데 yml파일에 uses에 작성하는 부분이 바로 그 부분이다. 

여기서는 SSH를 통해 배포를 시도하기 위해 널리 사용되는 appleboy의 툴을 사용할 것이다.

https://github.com/appleboy/ssh-action?tab=readme-ov-file

 

GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.

GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.

github.com

 

GitHub에 접속해보면 작성해야 할 파라미터에 대한 정보가 아주 상세하게 나와있다. 

 

내가 헷갈렸던 부분은 rsa키를 발급한 후에 접속하고자 하는 서버에는 공개키를 두어야 하는지 개인키를 두어야 하는지 헷갈렸다.

일반적으로 rsa를 이용해 SSH로 접속하기 위해서는 클라이언트가 rsa키를 생성한 후 공개키(id_rsa.pub)를 접속하고자 하는 서버에 위치시키고 본인의 로컬 환경에는 개인키를 두는 방식으로 인증을 진행한다. 

그래서 github actions가 클라이언트가 되고 로컬 서버가 접속하고자 하는 서버가 되는 것이다. 따라서 github actions를 실행시키는 workflow의 yml파일에는 개인키가 등록돼있어야 하고 서버의 공개키와 대조해 접속하는 것이다. 

 

여기서도 처음에 github 레포를 참고하지 못해 조금 삽질을 했는데 다음과 같은 에러를 마주했다.

2024/02/26 09:16:09 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

 

에러를 직독직해 하자면 공개키가 없고 인증에 실패했다는 것이다. 위 github 레포에도 나와있지만 공개키는 authorized_keys에 등록해주는 별도의 과정이 필요하다. 

 

name: Deploy to  Server

on:
  push:
    branches:
      - main # 메인 브랜치에 푸시될 때 배포 실행

jobs:
  deploy:
    runs-on: ubuntu-latest # GitHub Actions 러너 설정

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

      - name: Deploy to Server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.DEV_SERVER_HOST }} # 서버의 호스트명 또는 IP 주소
          username: ${{ secrets.SERVER_USER }} # 서버 사용자명
          key: ${{ secrets.SERVER_SSH_KEY }} # GitHub Secrets에 저장된 SSH 비밀키
          port: ${{secrets.SERVER_SSH_PORT}}
          script: |
            whoami

 

* 여기서 주의할 것은 본인이 rsa를 생성할 때 passpharse를 설정했다면 추가로 명시해줘야 한다는 것이다. 즉 위 공식 github를 보고 해결하는 것을 추천한다.

 

또한 rsa키 대신 서버의 계정 정보의 password를 통해서도 접속할 수 있으나 필자는 보안의 문제도 4096비트로 rsa키를 생성해 사용했다.