Github에서 서버로 자동 배포, 타사 어플리케이션 불필요
14408 단어 nodedevopsgithubjavascript
목표
드래그 요청을 dev와 마스터 지점에 통합한 후 코드를 자동으로 배치합니다.
우리가 사용하는 물건
개시하다
만약 우리가 두 버전의 사이트를 자동으로 배치해야 한다고 가정한다면.그 중 하나는
stage
으로 최신 합병 제출을 대표한다.이러한 변경은 통상적으로 결함이 있고 믿을 수 없기 때문에 내부 팀만 접근할 수 있기를 바랍니다."Stage"는 Github의 dev
지사를 대표합니다.이 사이트의 두 번째 버전은'prod'로 Github의 master
지점을 다시 보여준다.이 지점은 안정적이고 QA팀의 테스트를 통과하여 최종 사용자에게 안전하다.이 버전은 회사 이외의 모든 사람들이 알고 있는 우리 사이트의 URL입니다.1단계: 클론 Git 저장소
만약 서버에서github 저장소를 복제하지 않았다면, 이렇게 해야 합니다.
prod
과 stage
이라는 두 개의 디렉터리를 만듭니다.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입니다. 더 많은 댓글을 보신 것을 환영합니다!👀
너도 트위터에서 나를 찾을 수 있다=>
Reference
이 문제에 관하여(Github에서 서버로 자동 배포, 타사 어플리케이션 불필요), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/p0oker/automatic-deployment-from-github-to-your-server-with-no-third-party-app-3f5j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)