# PM2 自动化流程

URL: https://caijiao.org/pm2/deployment/automation
Source: docs/pm2/deployment/automation.md
Description: 掌握如何使用 PM2 配置自动化部署流程，利用 Git 集成和自定义部署脚本，实现应用的持续集成与持续部署（CI/CD），确保代码快速、安全地部署到生产环境。

PM2 不仅是一个强大的进程管理工具，还提供了自动化部署功能，帮助开发者实现持续集成与持续部署（CI/CD）。通过配置 Git 集成和自定义部署脚本，PM2 可以自动处理应用的部署过程，从拉取最新的代码、安装依赖到重启应用，全程自动化，极大提高了部署效率和可靠性。

## 1. **自动化部署概述**

自动化部署指的是通过脚本和工具链，将代码从开发环境自动部署到生产环境。PM2 提供了强大的部署功能，能够通过与 Git 集成来实现这一流程。开发者可以设置部署流程，使得每次推送代码时，自动拉取更新、安装依赖并重启应用。

## 2. **配置 Git 仓库和自动化脚本**

PM2 允许开发者通过 `ecosystem.config.js` 配置文件定义自动化部署流程。这个文件不仅用于管理应用的进程，还可以配置自动化的部署规则。

### 示例：`ecosystem.config.js` 配置文件

```javascript
module.exports = {
  apps: [
    {
      name: 'my-app',
      script: './app.js',
      env_production: {
        NODE_ENV: 'production',  // 生产环境配置
      },
    },
  ],
  deploy: {
    production: {
      user: 'deploy',  // 部署服务器的用户名
      host: ['your-server.com'],  // 服务器的 IP 地址或域名
      ref: 'origin/master',  // Git 分支
      repo: 'git@github.com:yourusername/your-repo.git',  // Git 仓库
      path: '/var/www/my-app',  // 服务器上的目标路径
      'pre-deploy': 'echo "Preparing to deploy..."',  // 部署前的操作
      'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production',  // 部署后的操作
    },
  },
};
````

在这个配置文件中：

* `user`: 指定部署服务器的用户名。
* `host`: 列出所有要部署的服务器地址。
* `ref`: 指定 Git 分支，这里使用 `origin/master`。
* `repo`: 提供 Git 仓库的地址，PM2 会从该仓库拉取代码。
* `path`: 设置服务器上的目标路径，PM2 会将代码放置到此目录。
* `pre-deploy`: 部署前执行的脚本，例如可以用来执行一些初始化操作。
* `post-deploy`: 部署后的操作，例如安装依赖和重启应用。

## 3. **常见的自动化部署命令**

PM2 提供了 `pm2 deploy` 命令来执行自动化部署。你可以通过以下命令进行代码的同步、依赖安装和应用重启：

### 部署命令

1. **初始化部署环境**：

   ```bash
   pm2 deploy ecosystem.config.js production setup
   ```

   该命令会在服务器上创建所需的目录结构，并且把 Git 仓库克隆到指定目录。

2. **更新应用代码**：

   ```bash
   pm2 deploy ecosystem.config.js production update
   ```

   该命令会拉取最新的代码更新并同步到服务器。

3. **重启应用**：

   ```bash
   pm2 deploy ecosystem.config.js production restart
   ```

   该命令会在部署完成后重启应用，确保新的代码生效。

### 自动化流程示例

假设你已经将应用部署到远程服务器并配置好 Git 仓库，那么每次推送代码到 Git 仓库时，PM2 会自动完成以下流程：

* 拉取代码并将其同步到目标服务器。
* 安装依赖（如 `npm install`）。
* 重启应用，确保新代码生效。

你只需执行一次 `pm2 deploy ecosystem.config.js production`，接下来的每次更新都会自动执行这些步骤。

## 4. **结合 CI/CD 实现自动化部署**

PM2 可以与常见的 CI/CD 工具（如 Jenkins、GitHub Actions、GitLab CI）结合使用，实现更加完善的自动化部署流程。通过在 CI 工具中配置 `pm2 deploy` 命令，可以在每次代码提交后自动部署到生产环境。

### 示例：与 GitHub Actions 集成

在 GitHub Actions 中，你可以创建一个工作流，实现在每次代码推送时自动部署应用：

```yaml
name: Deploy to Production

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Install dependencies
        run: npm install

      - name: Deploy with PM2
        run: |
          npm install -g pm2
          pm2 deploy ecosystem.config.js production update
```

在此配置中，当代码推送到 `master` 分支时，GitHub Actions 会执行以下步骤：

1. 克隆代码。
2. 安装 Node.js 环境。
3. 安装应用依赖。
4. 执行 `pm2 deploy` 命令将最新代码部署到生产环境。

## 5. **部署后的操作与监控**

PM2 提供了一些功能，可以在部署后进一步优化应用的运行。

* **自动重启**：可以通过配置文件中的 `autorestart: true` 来启用自动重启功能。
* **日志管理**：PM2 会自动管理应用的日志，你可以通过 `pm2 logs` 查看实时日志。
* **监控**：PM2 还提供了监控功能，可以通过 `pm2 monit` 来查看应用的运行状态和资源消耗。

## 6. **总结**

PM2 的自动化部署功能通过 Git 集成和自定义脚本，使得应用的持续集成与持续部署（CI/CD）变得简单而高效。你可以通过 PM2 配置自动拉取代码、安装依赖、重启应用等步骤，确保每次代码更新后都能够自动部署并生效。结合 CI/CD 工具的使用，PM2 可以为你的应用提供全面的自动化部署解决方案，提升开发效率，减少手动操作，确保应用的稳定性和可用性。
