Github 작업을 사용하여 내 VPS에 업데이트 배포

7669 단어 githubactions
martingraham.dev의 VPS에서 내 Linode 웹사이트를 자체 호스팅합니다. 소스 코드는 github에서 호스팅되므로 업데이트를 커밋하고 싶을 때마다 VPS에 원격으로 접속하여 최신 버전의 리포지토리를 가져오고 사이트를 빌드하고 관련 프로세스를 다시 시작해야 했습니다. 이게 뭐야, 1985? Github Actions을 입력합니다.

Github 작업 소개



Github 작업은 다양한 github 관련 이벤트에 의해 트리거될 수 있는 사용자 정의 가능한 자동화입니다. 내 경우 내main 분기에 대한 커밋이 발생할 때 내 작업이 발생합니다.
.yml에 있는 .github/workflows 파일에서 작업을 정의합니다. 위에서 말할 가치가 있습니다. 이 파일은 저장소에서 볼 수 있으므로 노출되는 정보에 대해 주의해야 합니다. 보안 우선!

name: Update Linode VPS Action
on: 
  push:
    branches:
      - 'main'
jobs:
  Push-to-linode:
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    steps:
      - name: Configure SSH
        run: |
          mkdir -p ~/.ssh/
          echo "$SSH_KEY" > ~/.ssh/staging.key
          chmod 600 ~/.ssh/staging.key
          cat >>~/.ssh/config <<END
          Host staging
            HostName $SSH_HOST
            User $SSH_USER
            IdentityFile ~/.ssh/staging.key
            StrictHostKeyChecking no
          END
        env:
          SSH_USER: ${{ secrets.STAGING_SSH_USER }}
          SSH_KEY: ${{ secrets.STAGING_SSH_KEY }}
          SSH_HOST: ${{ secrets.STAGING_SSH_HOST }}
      - name: Run npm run deploy
        run: |
          ssh staging 'cd ~/martingraham-dot-dev; npm run deploy'



이것을 분석해 보겠습니다.

on: 
  push:
    branches:
      - 'main'


이 비트는 작업이 실행되는 시기를 정의합니다. 광산은 매우 간단하지만 고급 배포를 위해 이벤트를 매우 구성할 수 있습니다.

작업 흐름에는 여러 작업이 있을 수 있습니다. 내 작업에는 제목이 하나만 있습니다Push-to-linode.

jobs:
  Push-to-linode:


이 조건문은 (내 이벤트 설정으로 인해) 아무 작업도 수행하지 않지만 향후 기능 참조를 위해 그대로 두었습니다.

if: github.event_name == 'push' && github.ref == 'refs/heads/main'

runs-on: ubuntu-latest 행을 언급해야 합니다. Github 작업은 소위 러너에서 실행됩니다. 우리의 경우 러너는 github에서 운영합니다. 이후 명령은 이 러너 환경에서 실행됩니다. 자신의 러너를 자체 호스팅할 수 있지만 잠재적으로 시스템이 임의의 코드 실행에 노출될 수 있으므로(예: PR 또는 포크에서 실행되는 작업이 있는 경우) 공개 리포지토리에서는 자체 실행을 호스팅하지 않는 것이 좋습니다.

jobs:
  Push-to-linode:
    runs-on: ubuntu-latest


SSH 및 비밀



우리의 작업은 몇 단계로 실행되며, 그 중 첫 번째는 내 VPS에 대한 SSH 연결을 구성하는 것입니다. run 명령은 러너 환경 내에서 명령을 실행하므로 여기서는 ssh 구성 파일을 만듭니다.

run: |
  mkdir -p ~/.ssh/
  echo "$SSH_KEY" > ~/.ssh/staging.key
  chmod 600 ~/.ssh/staging.key
  cat >>~/.ssh/config <<END
  Host staging
    HostName $SSH_HOST
    User $SSH_USER
    IdentityFile ~/.ssh/staging.key
    StrictHostKeyChecking no
  END

$SSH_USER는 내 VPS에서 사용하기에 꽤 이상한 사용자 계정입니다. 사실 저는 전체 인터넷이 제 VPS 내부 사용자 계정의 이름을 알기를 원하지 않습니다. 그리고 나는 그들이 내 개인 SSH 키의 사본을 갖는 것을 확실히 원하지 않습니다. 그것이 env:가 들어오는 곳입니다.

env:
  SSH_USER: ${{ secrets.STAGING_SSH_USER }}
  SSH_KEY: ${{ secrets.STAGING_SSH_KEY }}
  SSH_HOST: ${{ secrets.STAGING_SSH_HOST }}


이것은 내 작업에서 액세스할 수 있는 러너의 환경 변수를 설정합니다. Github 리포지토리에서 설정으로 이동하여 Github 작업에서 액세스할 수 있는 비밀(SSH 키, API 키 등)을 정의할 수 있습니다. 분명히 그들은 또한 로그에서 수정되지만 이러한 값을 기록하지 않도록 항상 주의해야 합니다.

NPM 스크립트



다음 단계에서는 새로 구성된 SSH 연결을 사용하여 VPS에 연결하고 명령을 실행합니다.

- name: Run npm run deploy
  run: |
    ssh staging 'cd ~/martingraham-dot-dev; npm run deploy'


알림ssh staging - 위를 보면 구성 파일에서 HOST staging를 작성하여 대상의 이름을 지정한 것을 볼 수 있으며 여기에서 참조하고 있는 내용입니다.

제 경우에는 빌드 단계가 필요한 노드 앱(정확히는 SvelteKit)을 실행하고 있으며 앱과 연결된 pm2 프로세스를 다시 시작해야 합니다. npm script를 활용하여 최신 버전의 저장소를 가져오고 앱을 빌드한 다음 프로세스를 다시 시작합니다. 빌드 프로세스를 변경해야 하는 경우 github 작업 구성을 망칠 필요가 없기 때문에 이 방법을 좋아합니다.

결론



Github Actions에 대한 간단한 소개가 있습니다. 가서 몇 가지 단계를 저장하세요!

사진 제공: Alex Knight on Unsplash

좋은 웹페이지 즐겨찾기