nuxt项目持续集成部署至阿里云
服务器安装环境(Ubuntu)
安装node
推荐使用nvm安装,(不推荐apt)
安装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
是nvm命令生效
1
source ~/.bashrc
安装node版本
1
nvm install --lts // 安装稳定版本中最新的
测试node和npm是是否安装
1
2node -v
npm -vnvm的使用
nvm查看node版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16nvm 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.1nvm安装node版本
1
nvm install v16.11.1
nvm 切换node版本
1
nvm use v16.11.1
设置默认版本(切记,不然下次打开shell, 版本还是原来的)
1
nvm alias default v16.11.1
查看全局指令
查看node ,npm,pm2等全局指令用的是不是自己设定的版本,通常用nvm安装的node,使用npm安装依赖包时,二进制指令都在 /root/.nvm/versions/node/v14.18.1/bin
1 | whereis node |
1 | whereis npm |
建立软链接,写进系统全局变量
npm 安装的依赖包二进制文件在 ~/.nvm/versions/node/v14.18.1/bin
,这个目录只是用户级别的,当使用任务调度的时候,是不会读取用户的全局变量,所以需要写进系统全局变量
系统全局变量目录在 /usr/local/bin
建立软链接
1 | ln -s ~/.nvm/versions/node/v14.18.1/bin/node /usr/local/bin # 单个 |
1 | node 命令已经和/root/.nvm/versions/node/v14.18.1/bin/node* 建立链接 npm 等命令也是 |
使用Github Actions 实现自动化部署
提交代码至github仓库
在github setting面板创建token
点击GitHub右上角头像 - Settings - Developer settings - Personal access tokens
输入密码,创建token,添加对仓库完全访问和操作的权限:
生成的token只会出现这一次,如果没有记录,忘记了,只能重新创建一个新的。
在项目根目录创建 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
85on:
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。需要配置的有(注意名称需要与文件中的保持一致)
- TOKEN - 之前创建并记录的token
- HOST - 服务器IP地址
- USERNAME - 服务器用户名,Linux默认root
- PASSWORD - 服务器 ssh 连接密码
- PORT - ssh连接服务器的端口号,默认22
Push 代码出发自动部署任务
触发条件:push名称以
v
开头的 tag。1
git push origin master v1.2.4
遇到的问题
请确认服务器已安装 git、nodejs、pm2 等工具。
本人服务器构建过程中 Deploy 失败,状态码 127。
报错:
1 | -bash: npm: command not found |
可是手动连接服务器执行都OK(本人是nvm安装的nodejs)。
打印环境变量 echo $PATH 也添加了路径的。
于是在actions任务中执行命令打印 echo $PATH,果然没有 node 路径。
尝试在/root/.bashrc 和 /etc/profile中都添加了 环境变量配置,都没有生效。
又在actions任务中查看文件目录,node、npm、pm2都有。
这个问题的原因是:
手动执行任务时,是在当前 shell 环境下进行的,程序可以找到环境变量。
而系统自动执行任务调度时,是不会加载任何环境变量的,因为它不是通过 shell 环境执行的。
解决办法:
临时办法:在actions任务中手动添加环境变量:
这个方式就是在每次任务执行时,npm命令执行前手动配置环境变量。1
2
3
4
5#...
script: |
export PATH=/root/.nvm/versions/node/v14.18.1/bin:$PATH
cd /root/project/nuxt-test
#...长久办法:创建软链接
1
ln -s ~/.nvm/versions/node/v14.18.1/bin/* /usr/local/bin