Github에서 서버로 자동 배포, 타사 어플리케이션 불필요

배치관을 구축하는 데 있어서 나는 야외에서 무수한 해결 방안이 있다고 믿는다.만약에 우리가 AWS에 있다면, 우리는Code Deploy, Heroku, Zeit Now, Netlify를 사용하여 자신들의 해결 방안을 제공할 수 있다. 물론 그 중 유행하는 해결 방안 중 하나는 당신의 CI/CD 서버 (Travis,Circle CI 등) 에 임무를 의뢰하는 것이다.Docker 컨테이너를 사용한다면 가장 좋은 orchestrator 도구는 AWS ECS, Swarm, Kubernetes 입니다.가장 가능성이 있는 상황은 만약에 당신이 더 큰 팀과 합작한다면 당신은 개발 운영팀의 파트너가 그것을 처리할 것이다. 당신은 당신의 인프라 시설이 당연하다고 생각할 수도 있다!😐 그러나 만약에 나처럼 초창기 회사에 가입하고 배치 과정이 수동(SSH에서 서버,git pull 등)이며 bash 스크립트를 작성해서 그들을 위해 이 일을 한다면 당신의 마음을 안아주고 싶은 책벌레일 수도 있다.🤓 당신의 배치 게임을 업그레이드하세요.이런 상황에서 Github에서 Pull 요청을 합병할 때 bash 스크립트를 자동으로 실행하는 것은 모든 사람을 기쁘게 할 것이다. 이것은 로켓 과학이 아니기 때문에 시작합시다!

목표


드래그 요청을 dev와 마스터 지점에 통합한 후 코드를 자동으로 배치합니다.

우리가 사용하는 물건

  • 노드 JS
  • Bash 스크립트
  • Github Webhooks
  • SSH 명령행
  • 개시하다


    만약 우리가 두 버전의 사이트를 자동으로 배치해야 한다고 가정한다면.그 중 하나는 stage으로 최신 합병 제출을 대표한다.이러한 변경은 통상적으로 결함이 있고 믿을 수 없기 때문에 내부 팀만 접근할 수 있기를 바랍니다."Stage"는 Github의 dev 지사를 대표합니다.이 사이트의 두 번째 버전은'prod'로 Github의 master 지점을 다시 보여준다.이 지점은 안정적이고 QA팀의 테스트를 통과하여 최종 사용자에게 안전하다.이 버전은 회사 이외의 모든 사람들이 알고 있는 우리 사이트의 URL입니다.

    1단계: 클론 Git 저장소


    만약 서버에서github 저장소를 복제하지 않았다면, 이렇게 해야 합니다.prodstage이라는 두 개의 디렉터리를 만듭니다.
    mkdir live stage
    git clone [email protected]:p0o/your_repo.git
    cp -a your_repo/. ./prod/your_repo
    cp -a your_repo/. ./stage/your_repo
    rm -rf ./your_repo
    
    repo 다음에 .을 추가해야 합니다. 이것은 폴더에 숨겨진 파일과 폴더를 복사할 수 있는 특수한 cp 문법입니다. (우리도.git 폴더를 복사해야 합니다.)
    미친 가설: 저는 당신이 서버 관리의 기본 지식을 잘 알고 있고 적절한 SSL 인증서를 사용하여 원하는 URL에서 사이트를 실행할 수 있다고 가정합니다.내가 Nginx를 사용하는 것은 바로 이 목적을 위해서이지만, 나는 이 절차들을 게시물에 설명하지 않을 것이다.확실하지 않으면 검색할 수 있습니다.

    2단계: bash 스크립트 만들기


    우리는 모든 상황의 배치를 처리하기 위해 두 개의 bash 스크립트가 필요하다.파일을 구축할 필요가 있다면 서버의 홈 디렉터리에 디렉터리를 만들고 거기서부터 시작합니다.나는 이 목록을 scripts이라고 부른다.
    cd ~/
    mkdir scripts
    cd scripts
    
    좋습니다. bash 파일을 계속 만들겠습니다.
    touch ./deploy_stage
    touch ./deploy_prod
    
    라이센스 실행:
    chmod +x ./deploy_stage
    chmod +x ./deploy_prod
    
    (이 점을 지적해 주셔서 감사합니다)
    프로젝트 의존 관계에 따라 환경 변수가 다를 수 있는 예시 코드를 놓을 것입니다.
    #!/bin/bash
    echo "Deploying stage your_repo"
    
    cd ~/stage/your_repo \
    && git checkout dev \
    && git pull \
    && npm i \
    && npm run build \
    && (pm2 stop your_repo_stage || true) \
    && echo 'Installing:  done.' \
    && (pm2 delete your_repo_stage || true) \
    && NODE_ENV=development pm2 --name your_repo_stage start npm -- start \
    && echo "your_repo deployed successfully"
    
    이 bash 스크립트는 기본적으로github에서 최신 코드를 가져오고 의존항을 설치하며 스크립트를 구축하고 PM2으로 실행합니다.익숙하지 않은 경우 PM2는 매우 유용한 프로세스 관리 도구로 NPM을 사용하여 쉽게 설치할 수 있습니다.
    특히 나는 논리적인 AND(&&&&&)로 나의 전체 프로세스를 연결했다. 왜냐하면 나는 그 중 하나가 실패할 때 실행에서 물러나기를 원하기 때문이다.

    3단계: 웹훅 이벤트 처리를 위한 코드 작성


    Github에서 어떤 일이 발생할 때 통지를 받기 위해서, 우리는 반드시 그들의 Webhook API를 구독해야 한다. 이것은 기본적으로 Github에 정보를 보내기 위해 URL을 제공하는 것을 의미한다.이러한 URL은 반드시 공공이어야 한다. 스크립트를 실행하여 코드를 배치할 수 있기 때문에 Github 서버 이외의 모든 사람이 이 URL에 접근할 수 있게 하는 것은 심각한 안전 위험을 가져올 것이다. 예를 들어 서비스 공격 거부 등이다.
    Github은 SH1 HMAC 서명을 사용하여 JSON 객체에 전송되는지 확인합니다.헤더의 X-Hub-Signature 값에 이 서명 해시를 포함할 것입니다.이 모든 것을 처리하는 것이 좀 복잡하기 때문에 우리는 github-webhook-handler package을 사용할 수 있다. 이것은 같은 목적을 위해 만들어진 것이다.
    노드에서 bash 스크립트 파일을 실행해야 합니다.우리는 이 기계의 함수를 사용할 수 있지만, 간단하게 보기 위해서, 나는 shellJs을 더욱 좋아한다.
    자, 잔소리 그만해. 다음은 네가 필요로 하는 코드야.
    const http = require('http');
    const createHandler = require('github-webhook-handler');
    const shell = require('shelljs');
    
    // We avoid to hardcode the secret in the code, you should provide it with an ENV variable before running this script
    const { MY_SECRET } = process.env;
    // You might use the same script for multiple repositories, this is only one of them
    const REPO_NAME = 'my_repo';
    // port is default on 6767
    const PORT = process.env.PORT || 6767;
    
    var handler = createHandler({ path: '/', secret: MY_SECRET })
    
    http.createServer(function (req, res) {
      handler(req, res, function (err) {
        res.statusCode = 404
        res.end('no such location')
      })
    }).listen(PORT);
    
    handler.on('error', function (err) {
      console.error('Error:', err.message)
    })
    
    handler.on('pull_request', function (event) {
      const repository = event.payload.repository.name;
      const action = event.payload.action;
    
      console.log('Received a Pull Request for %s to %s', repository, action);
      // the action of closed on pull_request event means either it is merged or declined
      if (repository === REPO_NAME && action === 'closed') {
        // we should deploy now
        shell.cd('..');
        shell.exec('~/scripts/deploy_stage');
      }
    });
    
    
    서버의 폴더에 저장하고 종속성을 설치합니다.
    npm init
    npm i github-webhook-handler shelljs --save
    
    그런 다음 PM2를 사용하여 환경 변수를 항상 실행합니다.
    MY_SECRET=MyGithubWebhookSecret pm2 --name github-deployer start node -- ./index.js
    
    이게 다야!

    4단계:github webhook 설정


    지금 우리는 Github에 가서 Github에 우리의 웹훅을 소개하기만 하면 된다.그러나 이전 단계에서 포트 6767에서 웹훅을 실행했습니다. HTTPS가 없습니다.따라서nginx를 설정하고 HTTPS를 사용하여 적합한 영역을 제공해야 합니다.주역의 경로에 놓을 수 있지만, 이 과정은 본문의 범위에 있지 않습니다.이 밖에 인터넷에는 네가 찾을 수 있도록 여러 편의 문장이 있다.
    저장소의 설정 탭으로 이동한 다음 Webhooks 를 클릭합니다.페이지 오른쪽에서 Webhook 추가 버튼을 클릭합니다.

    Nginx에서 실행 중인 Node JS 애플리케이션에 도입한 URL을 입력합니다.가정: https://yourdomain.com/webhook
    콘텐츠 유형으로 application/json을 선택하고 서비스를 실행하는 데 사용할 비밀을 입력하십시오.내 예에서, 위에는 'My Github Webhook Secret' 이 있다.

    "이 웹훅을 터치하고 싶은 이벤트"부분에서단일 이벤트를 선택하도록 클릭한 후 끌어오기 요청을 찾아 확인합니다.

    다른 모든 내용이 선택되지 않았는지 확인하고 "Webhook 추가"를 누르면 저장합니다.저희 다 준비됐어요.🦸

    5단계: 테스트 및 검증


    PM2를 사용하여 방금 작성한 node js 응용 프로그램의 로그를 모니터링합니다.입력:
    pm2 log github_deployer
    
    이제 너는 어떤 변화가 생겼는지 볼 수 있다.저장소로 이동해서 새 지점에서 내용을 변경합니다.끌어오기 요청을 제출하고 병합합니다.로그에서 bash 스크립트가 실행되는 것을 보고 변경 사항을 사이트에 반영해야 합니다.만약 당신에게 어떤 잘못이 있다면, 당신은 일지에서 볼 수 있습니다. 그리고...뭘 좀 하다😂

    결론


    비록 나는 본고에서 제시한 해결 방안이 상당히 간단하다고 생각하지만, 그것은 이 특정한 문제를 해결하는 가장 좋은 방안이 아니다.제 personal blog도 Zeit Now Github 통합을 사용하여 배포하고 있습니다!그러나 다른 해결 방안은 제3자 응용 프로그램에 의존하고 일부 팀은 자원에 따라 이 응용 프로그램에 접근할 수 없다.내 예에서 스크립트를 배치하는 데 이미 존재하고 메모리 라이브러리에 docker를 사용하지 않았기 때문에 이 문제에 대한 시간은 매우 제한되어 있다.만약 너도 공교롭게도 같은 배에 탔다면 전진해라!
    이 글은 최초로 제 블로그에 발표되었는데, 제목은 Automatic deployment From Github to your server입니다. 더 많은 댓글을 보신 것을 환영합니다!👀
    너도 트위터에서 나를 찾을 수 있다=>

    좋은 웹페이지 즐겨찾기