GitHub webhook에 의해 트리거되는 원격 배포

11213 단어 devopsgithubgo
VPS에서 호스팅되는 애플리케이션이 있습니까? 이 경우 코드를 버전 제어로 푸시할 때마다 어떻게든 서버가 코드를 풀하고 프로세스를 다시 시작하도록 해야 합니다. 이제 매번 SSH를 사용하고 필요한 명령을 직접 실행하는 침팬지 방식으로 할 수 있습니다. 또는 자동화할 수 있습니다!

1~2주 전에 자동화할 수만 있다면 변경 사항을 GitHub에 푸시할 때마다 SSH를 통해 배포 스크립트를 실행할 필요가 없다는 사실을 깨달았습니다. 그때부터 이 문제에 대한 간단한 해결책을 찾기 시작했습니다.

첫 번째 중지는 수신 후 git hook이었지만 저에게는 전혀 효과가 없었습니다. 관련 기사를 많이 읽고 여러 번 시도했지만 스크립트가 실행되지 않았습니다.

다음으로 pm2(내가 알고 있는 프로세스 관리자)용 git-hooks 플러그인을 사용해 보았습니다. 그러나 그것은 또한 작동하지 않았으며 존재하지 않는 파일 충돌을 언급했습니다.

이 시점에서 Jenkins 또는 Travis와 같은 CD 서비스를 시도할 수 있었지만 대신 자체 솔루션을 작성하기로 결정했습니다. 이는 설치 및 실행이 쉽고 많은 유연성을 제공하는 것을 목표로 합니다. Go에서 제대로 된 첫 번째 프로젝트였기 때문에 그 과정에서 많은 것을 배웠습니다.

작동 방식



github-deploy-inator는 GitHub에서 webhook을 수신 대기하는 지정된 경로에서 웹 서버를 시작합니다. 웹후크(또는 일반적으로 POST 요청)가 수신되면 필요한 정보를 가져오고 지정된 디렉토리에 지정된 명령을 실행합니다. 어디서 정보를 가져오는지 궁금할 수 있습니다.

config.json 입력



필요한 모든 정보는 실행 파일과 함께 있어야 하는 config.json 파일에 지정됩니다. here 형식을 확인할 수 있습니다.

기본 구조:



구성에는 port , endpointlisteners 에 대한 필드가 포함되어야 합니다.

예:

{
  "port": ":80",
  "endpoint": "/github/webhook",
  "listeners": [
    {
      "name": "example-listener",
      "repository": "DeathVenom54/github-deploy-inator",
      "directory": "/home/dv/projects/docs-website",
      "command": "yarn deploy",
      "notifyDiscord": true,
      "discord": {
        "webhook": "webhook-goes-here",
        "notifyBeforeRun": true,
        "sendOutput": true
      }
    }
  ]
}


설정하기



설치 및 구성



시작하려면 here 에서 릴리스를 가져옵니다. VPS를 사용 중이라면 curl을 사용하여 다운로드할 수 있습니다. OS 및 아키텍처에 대한 링크를 복사하고 다음을 실행합니다.

curl -L [release link] > github-deploy-inator.zip && unzip github-deploy-inator.zip




이렇게 하면 실행 파일과 예제 구성 파일의 압축이 풀립니다. 요구 사항에 따라 구성을 편집하고 실행 파일을 실행하여 테스트하십시오.

./github_deploy-inator_linux_x64


이렇게 하면 구성이 로드되고 확인됩니다. 문제가 있으면 종료됩니다. "Listening for Github webhooks on port :PORT"메시지가 표시되면 구성이 유효한 것입니다.

Note that this does not verify if the provided Discord webhook url is valid or not, so take care of it.



실행



프로세스 관리자를 사용하여 실행 파일을 실행하고 실패하면 다시 시작해야 합니다. systemd 을 사용할 수 있지만 pm2 을 사용하는 것이 더 간단하기 때문에 선호합니다.



이것을 사용하여 간단한 API를 호스팅해 봅시다!

먼저 super simple express API(Typescript로 작성)을 복제했습니다.

$ git clone https://github.com/DeathVenom54/example-node-api.git


이 API를 실행하기 위해 pm2을 사용했습니다.

yarn build
pm2 start dist/main.js --name example-api




이제 배포자를 설정하려면...

올바른 빌드를 이미 다운로드했다고 가정하고 구성을 편집해 보겠습니다. 내가 끝내는 것은 다음과 같습니다.

{
  "port": "80",
  "endpoint": "/webhook/github",
  "listeners": [
    {
      "name": "my-api",
      "repository": "DeathVenom54/example-node-api",
      "directory": "/home/dv/projects",
      "command": "curl localhost:80",
      "notifyDiscord": true,
      "discord": {
        "webhook": "https://discord.com/api/webhooks/937660913748697088/wK8NGFKUT09ToiQRxMX83asMnaCxn47sagE7Hg1bcba7Nb7dEQm6zxag4K0S_3iLBLCw",
        "notifyBeforeRun": true,
        "sendOutput": true
      }
    }
  ]
}


Port 80 is a privileged port, which represents HTTP. To run this code, run this command first: sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary



구성이 유효한지 확인하려면 실행 파일을 한 번 실행하십시오.



죄송합니다. 포트 앞에 콜론을 잊어버렸습니다. 수정하겠습니다.

...
  "port": ":80",
...


이제 성공해야 합니다...



엄청난! 이제 pm2로 설정하자

pm2 start ./github_deploy-inator_linux_x64 --name deployer


실행 중이어야 합니다. 로그를 확인하여 확인하겠습니다.

pm2 logs deployer




완벽한! 마지막 단계는 저장소에 웹후크를 추가하는 것입니다. Content-Type이 application/json 인지 확인하십시오. 또한 비밀을 설정하고 구성에서 지정해야 합니다.

설정한 후 GitHub에서 ping 웹후크를 보낼 때 배포자에서 오류가 발생할 수 있습니다. 이것은 내가 해결할 수 없었던 알려진 문제입니다. 오류를 무시해야 합니다.

이제 무언가를 밀어서 시도해 봅시다... 작동합니다!

2022/03/24 04:45:51 Successfully executed webhook from DeathVenom54/example-node-api




다음 단계



이 프로그램을 사용하는 동안 버그나 어려움에 직면하거나 제안할 사항이 있으면 open an issue on Github 으로 연락하거나 Discord server 으로 알려주십시오.

행복한 개발!

좋은 웹페이지 즐겨찾기