Node.js 앱을 PM2를 사용하여 GitLab CI/CD에 자동 배포

개요



최근에는 Heroku에서 움직이는 경우가 많고, GitLab CI의 설정도 간단하기 때문에, 배포 자동화를 모리모리 진행하고 있습니다.

그런 가운데, Node.js어플리케이션을 자전 서버로 움직일 필요가 나오고, Heroku와 같이 간단하게 배포하고 싶다-, 라고 여러가지 조사해 자동 배포할 수 있도록 했습니다!

ref.
Easy Deploy with SSH | PM2
PM2 Deployment via Gitlab CI

Step.1 PM2로 로컬에서 배포


pm2는 Node.js용 프로세스 관리자입니다.
그 밖에도 forever 등이 있습니다만, 배포 기능이 없기 때문에, 이쪽을 사용합니다.

ref. PM2 Runtime - The Most Advanced Production Process Manager for Node.js

먼저 로컬에서 SSH를 통해 원격 서버에 배포할 수 있도록 설정합니다.


Step.1-1 SSH 설정



GitLab · 원격 서버 모두 암호없이 SSH 연결할 수있는 상태이면 다음 설정이 필요하지 않습니다.

SSH 키 쌍 생성



키 파일명은 임의(이번은 pm2_rsa로 했다)
$ cd ~/.ssh
$ ssh-keygen -t rsa -f pm2_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):  ←パスワードは空
Enter same passphrase again:  ←パスワードは空

공개키 등록



GitLab


~/.ssh/pm2_rsa.pub를 GitLab의 [프로필 화면> SSH Keys]에 등록합니다.

원격 서버


$ ssh-copy-id -i pm2_rsa ${user}@${target_host}
${user}@${target_host}는 배포할 원격 서버의 사용자 및 호스트 이름

Step.1-2 설치



※ 로컬, 원격 서버 모두에 설치
$ npm install pm2 -g

Step.1-3 배포 설정 파일 준비(로컬)



파일 작성



※프로젝트 루트로 실행
$ pm2 ecosystem

파일 수정



ecosystem.config.js
module.exports = {
  apps : [{
    name: 'API', // 任意のアプリ名に変更
    script: 'app.js', // 起動対象のファイル名に変更(ex. index.js)

    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    args: 'one two',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }],

  deploy : {
    production : {
      user : 'node', // デプロイサーバーにSSHログインするユーザー名
      host : '212.83.163.1', // デプロイサーバーのホスト名
      ref  : 'origin/master',
      repo : '[email protected]:repo.git', // デプロイ対象のGitリポジトリ
      path : '/var/www/development', // デプロイサーバーのデプロイ対象ディレクトリパス
      'post-deploy' : 'npm install && pm2 startOrRestart ecosystem.config.js --env production'
    }
  }
};

설정


$ pm2 deploy production setup

Step 1-4 원격 서버에 배포 (로컬)


$ pm2 deploy production

배포할 수 없는 경우



원격 리포지토리의 git clone 오류가 발생했을 가능성이 큽니다.
SSH clone errors 참조하여 암호 없이 git clone 수 있도록 해야 합니다.

Step.1-5 배포가 완료되었는지 확인(원격 서버)



프로세스 확인


$ pm2 list
┌──────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├──────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│   API    │ 0  │ 1.0.0   │ fork │ 10844 │ online │ 383     │ 0s     │ 0%  │ 61.8 MB   │ root │ disabled │
└──────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

대상 App의 status가 online이면 OK!

Step.2 GitLab CI로 배포



GitLab CI를 사용하여 master 브랜치에 변경 사항이 추가된 시점에서 원격 서버에 자동 배포합니다.

ref. Using SSH keys with GitLab CI/CD | GitLab



Step.2-1 .gitlab-ci.yml 정의



.gitlab-ci.yml
image: node:alpine

stages:
  - production

production:
  type: deploy
  stage: production
  before_script:
    # Install ssh-agent if not already installed, it is required by Docker.
    # (change apt-get to yum if you use a CentOS-based image)
    - 'which ssh-agent || ( apk add --update openssh )'

    # Add bash
    - apk add --update bash

    # Add git
    - apk add --update git

    # Run ssh-agent (inside the build environment)
    - eval $(ssh-agent -s)

    # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
    - echo "$SSH_PRIVATE_KEY" | ssh-add -

    # For Docker builds disable host key checking. Be aware that by adding that
    # you are suspectible to man-in-the-middle attacks.
    # WARNING: Use this only with the Docker executor, if you use it with shell
    # you will overwrite your user's SSH config.
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    # In order to properly check the server's host key, assuming you created the
    # SSH_SERVER_HOSTKEYS variable previously, uncomment the following two lines
    # instead.
    # - mkdir -p ~/.ssh
    # - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts'
  script:
    - npm i -g pm2
    - pm2 deploy production
  only:
    - master

Step.2-2 GitLab에 SSH 로그인을 위한 비밀키 등록



Step.1-1에서 작성한 비밀키를 SSH_PRIVATE_KEY의 변수명으로 GitLab CI의 환경 변수에 등록한다


Step.2-3 배포 확인



master에 병합되면 Pipeline이 실행되어 배포 할 수 있습니다.




이제 Node.js 앱을 GitLab CI에서 자동 배포할 수 있습니다.

사이고에게



개인 블로그에 오리지널(일본어&영어)을 UP하고 있습니다.
이 기사가 좋다고 느끼신 분은, 그쪽에도 리액션 받을 수 있으면 기쁩니다
htps : // bg. 11sh1. 이 m

좋은 웹페이지 즐겨찾기