前言
程序员忙碌了两个星期结束了开发任务,开始测试环节,准备上线。测试中我们要修改bug修改后需要部署,如果每次修改完成以后需要登录服务器或者手动部署一次会很麻烦。频繁操作会把程序员累坏的,今天介绍一下自动化部署应该怎样实现。
准备工作
首先准备一个前端项目我的项目是一个用Vue写的项目,自动化部署的工具Jenkins。准备一台Linux系统的服务器,以下工作都是在Linux服务器上完成的,安装nginx服务器。
如何让node服务在后台运行
这里我们使用pm2后台挂起node服务,同时可以监听node服务报错信息收集日志。
项目打包npm run build
vue-admin项目会构建服务端和客户端给出打包的产物,根据需求可以调整使用build:client或build:server,打包成功以后我们就可以部署项目了,package.json项目配置了npm satrt命令启动服务,但是不能在后台运行我们需要修改一下配置,配置成pm2后台运行。
haoxuan@haoxuandeiMac vue-admin % npm run build
> aming-project@ build /Users/haoxuan/Work/vue-admin
> rimraf dist && npm run build:client && npm run build:server
> aming-project@ build:client /Users/haoxuan/Work/vue-admin
> cross-env NODE_ENV=production webpack --config build/webpack.client.config.js --progress --hide-modules
95% emittingTotal precache size is about 2.19 MB for 14 resources.
Hash: 5769023a41b07fe5b986
Version: webpack 2.6.1
vue-ssr-server-bundle.json 167 kB [emitted]
pm2配置后台启动服务
安装pm2
yarn add pm2
或者
npm install pm2
配置pm2.config.js
配置node服务启动的端口号、服务名称、日志保存的位置、环境变量,运行时如需其他的配置可以根据需求增加。
module.exports = {
apps: [
{
name: 'vue_admin',
script: './server.js',
cwd: './', // 当前工作空间
watch: [
// 启动的时候监听文件夹内容的改变
'build',
'dist'
],
ignore_watch: [
// 忽略监听的文件夹
'node_modules',
'logs',
],
instances: 1, // start 2 instances
node_args: '--harmony',
env: {
NODE_ENV: 'production',
PORT: 3763,
DOMAIN: 'https://admin.soscoon.com'
},
out_file: './logs/out.log', // normal log
error_file: './logs/err.log', // error log
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm Z' // date format
}
]
};
配置package.json
配置npm start启动后台运行项目并且加以监控,npm stop关闭指定的服务。
"scripts": {
"dev": "node server",
"start": "pm2 start pm2.config.js",
"stop": "pm2 stop vue_admin",
"build": "rimraf dist && npm run build:client && npm run build:server",
"build:client": "cross-env NODE_ENV=production webpack --config build/webpack.client.config.js --progress --hide-modules",
"build:server": "cross-env NODE_ENV=production webpack --config build/webpack.server.config.js --progress --hide-modules"
}
到这里我们的前端项目已经完成了部署的配置,手动部署已经完成了,大概的流程是:
git clone https://github.com/Tecode/vue-admin.git // 拉取项目
cd vue-admin // 进入文件夹
yarn // 拉取依赖
npm run build // 构建项目
npm start // 启动后台运行
访问http://localhost:3763 端口号是
配置项目自动化构建
在这里我们要使用的工具是jenkins,以下讲解默认你已经在服务器安装了jenkins。
新建任务
新建任务选择构建自由风格化的任务。
配置需要构建的项目地址
我已经将项目放到了GitHub上,如果是其他的平台更换地址就可以。项目拉取是不需要授权的所有不需要配置凭证,如果项目是私有的点击添加就可以添加凭证。
配置构建的shell脚本
配置脚本构建项目然后启动服务,这里我们不需要去拉取代码,前一个步骤配置了项目地址在外面构建时会自动拉取代码到服务器。
我的服务器是Linux服务器所以我使用shell脚本构建项目,Windows服务器参考批处理命令。配置完成以后就可以点击保存了。
echo '开始构建项目'
node -v
yarn
npm run build
npm start
echo '项目构建完成'
手动构建
保存配置以后会跳转到项目哪,可以看到立即构建的按钮,点击就可以立即构建项目。
构建时控制台输出
Started by user xm
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/vue-admin
The recommended git tool is: NONE
No credentials specified
> git rev-parse --resolve-git-dir /var/lib/jenkins/workspace/vue-admin/.git # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url https://github.com/Tecode/vue-admin.git # timeout=10
Fetching upstream changes from https://github.com/Tecode/vue-admin.git
> git --version # timeout=10
> git --version # 'git version 2.27.0'
> git fetch --tags --force --progress -- https://github.com/Tecode/vue-admin.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision db4054a9a67aeda1ada54e2ea1e2cc5e3cf1cd56 (refs/remotes/origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f db4054a9a67aeda1ada54e2ea1e2cc5e3cf1cd56 # timeout=10
Commit message: "配置pm2运行项目"
> git rev-list --no-walk db4054a9a67aeda1ada54e2ea1e2cc5e3cf1cd56 # timeout=10
[vue-admin] $ /bin/sh -xe /tmp/jenkins8066741655429861045.sh
+ echo 开始构建项目
开始构建项目
+ node -v
v16.3.0
+ yarn
yarn install v1.22.5
[1/5] Validating package.json...
[2/5] Resolving packages...
success Already up-to-date.
Done in 0.51s.
+ npm run build
> build
> rimraf dist && npm run build:client && npm run build:server
> build:client
> cross-env NODE_ENV=production webpack --config build/webpack.client.config.js --progress --hide-modules
...
Version: webpack 2.6.1
Time: 6079ms
Asset Size Chunks Chunk Names
vue-ssr-server-bundle.json 167 kB [emitted]
+ npm start
> start
> pm2 start pm2.config.js
>>>> In-memory PM2 is out-of-date, do:
>>>> $ pm2 update
In memory PM2 version: 5.1.0
Local PM2 version: 5.1.1
[PM2] Applying action restartProcessId on app [vue_admin](ids: [ 1 ])
[PM2] [vue_admin](1) ✓
┌─────┬──────────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ front_end_manager_product │ default │ 1.0.0 │ cluster │ 944483 │ 36D │ 0 │ online │ 0% │ 71.0mb │ root │ enabled │
│ 1 │ vue_admin │ default │ N/A │ cluster │ 2191825 │ 0s │ 0 │ online │ 0% │ 31.8mb │ root │ enabled │
└─────┴──────────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[PM2][WARN] Current process list is not synchronized with saved list. Type 'pm2 save' to synchronize.
+ echo 项目构建完成
项目构建完成
Finished: SUCCESS
构建完成以后我们可以看到pm2服务列表已经了vue_admin项目在运行说明已经成功部署项目了。我们可以使用服务器的IP地址直接加上端口号访问到网站。
注意:购买的服务器需要去后台的安全规则修改开放的端口,不然网站是无法访问的。
IP地址访问网站 http://47.108.210.200:3763/
我使用的是阿里云的服务器,为了服务器的安全默认情况下只有80端口才是可以直接访问的,其它端口需要开放需要到购买服务器的后台配置。
配置域名
为了方便访问的用户记住我们的网站,我们需要配置一个域名。在这里我配置域名叫vue.soscoon.com的二级域名。
配置二级域名
首先,需要购买了域名并且已经备案成功。进入后台点击域名-》解析-》添加记录,二级域名添加如下图所示,点击保存我们就可以使用这个域名了。现在直接访问是不能访问到我们的网站的,我们需要去服务器上通过nginx代理到这个域名上。
通过nginx将项目代理到域名
如果使用nginx服务器使用其它服务器也是可以的,能够将端口代理到域名上就可以了,这里主要讲nginx的配置。
进入nginx配置文件夹新建vue_admin.conf,配置完成sudo nginx -s reload重新加载配置文件,访问vue.soscoon.com,到这里我们的自动化部署就完成了。
server {
server_name vue.soscoon.com;
location / {
proxy_buffers 8 1024k;
proxy_buffer_size 1024k;
proxy_pass http://localhost:3763/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
到这里我们就完成了代码的自动化部署,更新代码只需要上传到仓库然后点击构建就可以完成部署。