服务器安装环境(Ubuntu)

安装node

推荐使用nvm安装,(不推荐apt)

  1. 安装nvm

    1
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

    或者

    1
    wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
  2. 是nvm命令生效

    1
    source ~/.bashrc
  3. 安装node版本

    1
    nvm install --lts // 安装稳定版本中最新的
  4. 测试node和npm是是否安装

    1
    2
    node -v
    npm -v
  5. nvm的使用

    1. nvm查看node版本

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      nvm ls
      -> v14.18.1
      v16.11.1
      v17.0.0
      default -> v14.18.1
      iojs -> N/A (default)
      unstable -> N/A (default)
      node -> stable (-> v17.0.0) (default)
      stable -> 17.0 (-> v17.0.0) (default)
      lts/* -> lts/fermium (-> v14.18.1)
      lts/argon -> v4.9.1 (-> N/A)
      lts/boron -> v6.17.1 (-> N/A)
      lts/carbon -> v8.17.0 (-> N/A)
      lts/dubnium -> v10.24.1 (-> N/A)
      lts/erbium -> v12.22.7 (-> N/A)
      lts/fermium -> v14.18.1
    2. nvm安装node版本

      1
      nvm install v16.11.1
    3. nvm 切换node版本

      1
      nvm use v16.11.1
    4. 设置默认版本(切记,不然下次打开shell, 版本还是原来的)

      1
      nvm alias default v16.11.1

查看全局指令

查看node ,npm,pm2等全局指令用的是不是自己设定的版本,通常用nvm安装的node,使用npm安装依赖包时,二进制指令都在 /root/.nvm/versions/node/v14.18.1/bin

1
2
whereis node
node: /root/.nvm/versions/node/v14.18.1/bin/node
1
2
whereis npm 
npm: /root/.nvm/versions/node/v14.18.1/bin/npm

建立软链接,写进系统全局变量

npm 安装的依赖包二进制文件在 ~/.nvm/versions/node/v14.18.1/bin,这个目录只是用户级别的,当使用任务调度的时候,是不会读取用户的全局变量,所以需要写进系统全局变量

系统全局变量目录在 /usr/local/bin

建立软链接

1
2
ln -s  ~/.nvm/versions/node/v14.18.1/bin/node /usr/local/bin # 单个
ln -s ~/.nvm/versions/node/v14.18.1/bin/* /usr/local/bin # 所有
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# node 命令已经和/root/.nvm/versions/node/v14.18.1/bin/node* 建立链接 npm 等命令也是

-rwxr-xr-x 1 root root 399 Sep 22 10:14 cloud-id*
-rwxr-xr-x 1 root root 403 Sep 22 10:14 cloud-init*
-rwxr-xr-x 1 root root 2108 Sep 22 10:14 cloud-init-per*
-rwxr-xr-x 1 root root 404 Sep 22 10:14 easy_install*
-rwxr-xr-x 1 root root 1003 Sep 22 10:14 jsondiff*
-rwxr-xr-x 1 root root 3858 Sep 22 10:14 jsonpatch*
-rwxr-xr-x 1 root root 1837 Sep 22 10:14 jsonpointer*
-rwxr-xr-x 1 root root 397 Sep 22 10:14 jsonschema*
lrwxrwxrwx 1 root root 42 Oct 21 19:59 node -> /root/.nvm/versions/node/v14.18.1/bin/node*
-rwxr-xr-x 1 root root 421 Sep 22 10:14 normalizer*
lrwxrwxrwx 1 root root 41 Oct 21 19:59 npm -> /root/.nvm/versions/node/v14.18.1/bin/npm*
lrwxrwxrwx 1 root root 41 Oct 21 19:59 npx -> /root/.nvm/versions/node/v14.18.1/bin/npx*
lrwxrwxrwx 1 root root 41 Oct 21 19:59 nrm -> /root/.nvm/versions/node/v14.18.1/bin/nrm*
lrwxrwxrwx 1 root root 41 Oct 21 19:59 pm2 -> /root/.nvm/versions/node/v14.18.1/bin/pm2*
lrwxrwxrwx 1 root root 45 Oct 21 19:59 pm2-dev -> /root/.nvm/versions/node/v14.18.1/bin/pm2-dev*
lrwxrwxrwx 1 root root 48 Oct 21 19:59 pm2-docker -> /root/.nvm/versions/node/v14.18.1/bin/pm2-docker*
lrwxrwxrwx 1 root root 49 Oct 21 19:59 pm2-runtime -> /root/.nvm/versions/node/v14.18.1/bin/pm2-runtime*
lrwxrwxrwx 1 root root 41 Oct 21 19:59 yrm -> /root/.nvm/versions/node/v14.18.1/bin/yrm*

使用Github Actions 实现自动化部署

  1. 提交代码至github仓库

  2. 在github setting面板创建token

    点击GitHub右上角头像 - Settings - Developer settings - Personal access tokens

    img

    输入密码,创建token,添加对仓库完全访问和操作的权限:

    img

    在这里插入图片描述

    生成的token只会出现这一次,如果没有记录,忘记了,只能重新创建一个新的。

  3. 在项目根目录创建 GitHub Actions 工作流配置文件

    创建目录./github/workflows,在里面创建.yml后缀的文件,文件名随意,将作为工作流的默认名称,GitHub会自动识别到这个文件并执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    on:
    push:
    # 提交tag名以v开头的tag时执行部署任务
    tags:
    - 'v*'

    jobs:
    build-and-deploy:
    # 运行环境
    runs-on: ubuntu-latest
    # 执行的步骤
    steps:
    # 下载源码
    - name: Checkout
    uses: actions/checkout@master

    # 打包构建
    - name: Build
    uses: actions/setup-node@master
    # with:
    # node-version: '14.16.1' # 指定node版本
    - run: npm install
    - run: npm run build
    # 生成压缩包(打包 .nuxt static nuxt.config.js package.json package-lock.json ecosystem.config.js)
    - run: tar -zcvf release.tgz .nuxt static nuxt.config.js package.json package-lock.json ecosystem.config.js


    # 发布 Release(创建Release分支)
    - name: Create Release
    id: create_release
    uses: actions/create-release@master
    env:
    GITHUB_TOKEN: ${{ secrets.TOKEN }}
    with:
    # 本次提交的tag的名称
    tag_name: ${{ github.ref }}
    # Release版本的名称
    release_name: Release ${{ github.ref }}
    # 是否是草稿
    draft: false
    # 是否是预发布
    prerelease: false

    # 上传构建结果(release.tgz)到 Release
    - name: Upload Release Asset
    id: upload-release-asset
    uses: actions/upload-release-asset@master
    env:
    GITHUB_TOKEN: ${{ secrets.TOKEN }}
    with:
    # 上传地址(创建的Release分支地址)
    upload_url: ${{ steps.create_release.outputs.upload_url }}
    # 上传的文件
    asset_path: ./release.tgz
    # 上传后的文件名
    asset_name: release.tgz
    # 上传的文件类型
    asset_content_type: application/x-tgz

    # 部署到服务器
    - name: Deploy
    uses: appleboy/ssh-action@master
    with:
    # 远程服务器地址
    host: ${{ secrets.HOST }}
    # 远程服务器用户名
    username: ${{ secrets.USERNAME }}
    # 远程服务器密码
    password: ${{ secrets.PASSWORD }}
    # 远程服务器端口号
    port: ${{ secrets.PORT }}
    # 命令超时配置 默认10m
    command_timeout: 20m
    # 运行在远程服务器的命令
    # 1. 进入项目目录
    # 2. 下载发布包
    # 3. 解压缩发布包
    # 4. 安装生产环境依赖
    # 5. pm2运行配置文件
    script: |
    cd /root/project/nuxt-test
    wget https://github.com/Galaxy-Rigel/nuxt-test/releases/latest/download/release.tgz -O release.tgz
    tar zxvf release.tgz
    npm install --production
    pm2 reload ecosystem.config.js

    工作流中使用到了 secrets 信息,即GitHub项目仓库 Settings 中配置的 Secrets。

    img

    需要配置的有(注意名称需要与文件中的保持一致)

    • TOKEN - 之前创建并记录的token
    • HOST - 服务器IP地址
    • USERNAME - 服务器用户名,Linux默认root
    • PASSWORD - 服务器 ssh 连接密码
    • PORT - ssh连接服务器的端口号,默认22

    img

    在这里插入图片描述

  4. Push 代码出发自动部署任务

    触发条件:push名称以v开头的 tag。

    1
    git push origin master v1.2.4

遇到的问题

请确认服务器已安装 git、nodejs、pm2 等工具。

本人服务器构建过程中 Deploy 失败,状态码 127。

报错:

1
2
-bash: npm: command not found
-bash: pm2: command not found

可是手动连接服务器执行都OK(本人是nvm安装的nodejs)。

打印环境变量 echo $PATH 也添加了路径的。

于是在actions任务中执行命令打印 echo $PATH,果然没有 node 路径。

尝试在/root/.bashrc 和 /etc/profile中都添加了 环境变量配置,都没有生效。

又在actions任务中查看文件目录,node、npm、pm2都有。

这个问题的原因是:

手动执行任务时,是在当前 shell 环境下进行的,程序可以找到环境变量。

而系统自动执行任务调度时,是不会加载任何环境变量的,因为它不是通过 shell 环境执行的。

解决办法:

  1. 临时办法:在actions任务中手动添加环境变量:
    这个方式就是在每次任务执行时,npm命令执行前手动配置环境变量。

    1
    2
    3
    4
    5
    #...
    script: |
    export PATH=/root/.nvm/versions/node/v14.18.1/bin:$PATH
    cd /root/project/nuxt-test
    #...
  2. 长久办法:创建软链接

    1
    ln -s ~/.nvm/versions/node/v14.18.1/bin/* /usr/local/bin