본문 바로가기

Backend/Git

Github actions - ssh trouble shooting

github actions trouble shooting 이라고 뭔가 거창하게 쓰긴 했지만 github actions 를 사용하는 과정에서 회사 내부 github repository 를 모듈로써 설치해야 하는 경우 겪었던 문제와 그 해결에 대해 간단하게 적어보도록 하겠습니다.

 

문제는 github actions 으로 테스트를 하던 publish 를 하던 npm install 을 하는 과정에서 발생했습니다.

해당 repository 에선 내부 공통 모듈로 작성된 특정 repository 를 사내 github 으로부터 설치해서 사용중이었는데..

문제는 github actions 이 돌아가는 장비에서 사내 github 으로 접근이 안되는 부분이었습니다.

 

"dependencies": {
  "axios": "^1.3.4",
  "typescript": "^4.9.5",
  "AAA": "github:xxx/AAA#v1.0.2",
},

 

예를 들어 위처럼 package.json > dependencies 에 AAA 라는 내부 모듈이 정의되어 있는 경우입니다.

별 이상이 없겠거니 하고 workflows 의 yml 에는 다른 설정 없이 npm install 을 할 때 아래와 같은 에러로 실패하게되는데요.

 

 

사내 github 에 접근할 때 ssh 를 사용하게 되는데 이 때 권한이 없는 문제입니다.

별 삽질을 다 해봤는데 문제를 해결하기 위해선 github actions 이 돌아가는 장비에서 github.com 에 대한 ssh host 를 등록하고, 

ssh private key 를 추가해주는 과정이 필요합니다.

 

jobs:
  install:
    name: "Install Dependencies"
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v3
      - name: Setup SSH-keys and known_hosts
        env:
          SSH_AUTH_SOCK: /tmp/ssh_agent.sock
        run: |
            mkdir -p ~/.ssh
            ssh-keyscan github.com >> ~/.ssh/known_hosts
            ssh-agent -a $SSH_AUTH_SOCK > /dev/null
            ssh-add - <<< "${{ secrets.SSH_PRIVATE_KEY }}"
      - uses: actions/setup-node@v3
        with:
          node-version: 12
      - name: Install Dependencies
        run: npm install
        env:
          SSH_AUTH_SOCK: /tmp/ssh_agent.sock
      - run: npm run build

 

위는 제가 해결한 github actions yml 파일 내용입니다. ssh key 와 known hosts 를 셋업하는 step 이 핵심인데,

SSH_AUTH_SOCK env 세팅과 ssh keyscan 후 known hosts 등록, private key 를 추가해주니 내부 github private repository 에 대한 ssh 접근이 해결 되었습니다.

 

 

물론 아예 다른 대안을 사용할 수도 있었겠지만, 뭔가 이 상황에서 해결을 하고 싶었던.. 것이었습니다.

 

내용이 좀 짧은 듯 하여 github actions 를 통해 npm publish 할 때 사용하는 액션 및 syntax 에 대해 소개하고 가도록 하겠습니다.

github actions 를 사용하기 위해 정의하는 yml 에 들어가는 내용 중 uses 에는 여러가지 액션을 넣을 수 있습니다.

 

- name: get-npm-version
  id: package-version
  uses: martinbeentjes/npm-get-version-action@main
  if: always()
- name: slack noti
  uses: 8398a7/action-slack@v3
  with:
    status: ${{ job.status }}
    author_name: Publish module ${{ steps.package-version.outputs.current-version }}
    fields: repo,author
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
  if: always()

 

먼저 get-npm-version 부분입니다. 제가 하고 싶었던건 npm publish 후 해당 버전이 배포되었다고 slack noti 를 하는 것인데, 이 버전을 package.json 으로부터 읽어오고 싶었습니다. 처음엔 뭐 직접 짜야되나.. 싶었지만 역시나 이런것들을 다 만들어서 올리는 사람들이 있더라구요. martinbeentjes/npm-get-verison-action 액션을 사용하면 package.json 파일의 version 부분을 읽어옵니다.

 

다음은 slack 에 메세지를 보내는 부분입니다. 이 또한 webhook 을 통해 직접 스크립트를 짜야하나 싶었지만.. 역시나 만들어져있는게 있습니다. 찾아보면 slack 용 위와 같은 액션은 여러개가 있는데, 적당한 걸 골라서 쓰시면 됩니다.

8398a7/action-slack@v3 액션을 사용해 저처럼 설정하면, 아래와 같은 포맷으로 잡이 완료되었을 때 메세지가 옵니다.

 

 

if 문법을 사용해 항상 메세지가 오도록 설정했으므로, 실패하면 Failed Github Actions 메세지가 오게 됩니다.

 

이런 여러가지 액션들은, github marketplace 에서 찾아볼 수 있으니 github actions 로 workflow 를 작업할 때 찾아보고

골라서 사용하시면 되겠습니다.

'Backend > Git' 카테고리의 다른 글

Use github actions  (0) 2022.11.26
(Github) git 계정 여러개 사용하기  (0) 2021.11.20