介绍
本系列主要介绍如何自动化部署我们的前端和后端项目
本篇主要介绍如何自动化部署vue项目
下篇讲如何自动化部署nodejs项目
我这里是mac os,如果你用linux就不会碰到很多下面碰到的问题了。
相关应用
- jenkins
- docker
整个流程
首先我们把我们的电脑想象成一台服务器,当然如果你有服务器,也可以直接在服务器上,执行以下操作
我这里方便起见,就直接把我的电脑(mac)当做一台服务器,事实证明这里面很多坑!!!
注意区分以下本地和服务器的区别,其实我们这里都是我们的电脑
- 我们在服务器(这里是我们的mac)上安装docker
- 我们在服务器(这里是我们的mac)上用docker安装了jenkins
- 我们本地新建一个vue项目,并推到github
- 我们本地访问服务器上的jenkins,即打开网址http://localhost:8081 (如果是服务器这里localhost换成你服务器的ip)
- 我们用jenkins拉了github的项目到jenkins的安装目录里的
workspace/
目录 - jenkins使用
执行shell
跑了命令
npm install
npm run build
这里我们需要给jenkins安装nodejs插件
- 我们用jenkins ssh连接到我们的服务器
这里我们需要安装Publish Over SSH插件,并配置好服务器
- 在服务器(这里是我们的mac)上执行以下操作
把我们的vue项目打包成镜像vuenginxapp
用这个镜像创建一个容器vuenginxapp
安装docker
请参考 https://www.runoob.com/docker/macos-docker-install.html
我这里是mac, 安装成功之后,在状态栏有docker图标
![253a164ec7cd5f555a097b4e6ad088a4.png](https://i-blog.csdnimg.cn/blog_migrate/ef20d5029222416f32be46b632543733.jpeg)
这时命令行输入docker -v
![99f41c6580aa941b768acd026e6bbc48.png](https://i-blog.csdnimg.cn/blog_migrate/24079babf72032addeb0045e203b85aa.jpeg)
则说明安装成功
docker安装jenkins
题外话:你也可以不通过docker安装,可以参考我的另一篇文章Mac安装jenkins
搜索jenkins镜像
https://hub.docker.com/ 是docker存放image(镜像)的地方,界面如下:
![aaad62b3eda785fcb451f231071a9e12.png](https://i-blog.csdnimg.cn/blog_migrate/3940c01ef1dccebedbbbd94ba984323a.jpeg)
我们搜索一下要安装的jenkins镜像
![28738cfd43101d45435d963c5ce097d5.png](https://i-blog.csdnimg.cn/blog_migrate/dd19a345ff51333be9d441b35701f09b.jpeg)
注意: 虽然第一个是docker官方维护的版本,但它很长时间没有更新了,是一个过时的版本。所以这里我们要安装第二个,这个是jenkins维护的
ps:我们也可以通过命令行搜索,命令是docker search jenkins
docker安装jenkins
新建一个目录jenkins_home,如我这里是
![438ad64e4cc69cbb0c2a340f6fa7852a.png](https://i-blog.csdnimg.cn/blog_migrate/378c86d1056e02f08dc3be9f6cd2043d.jpeg)
执行命令
docker run --name jenkins_node -d -v /Users/isaacho/Documents/application/docker/jenkins_home:/var/jenkins_home -p 8081:8080 -p 50000:50000 jenkins/jenkins:lts
注意: 这里不要直接复制上面的命令,需要把/Users/isaacho/Documents/application/docker/jenkins_home替换成你新建的目录。同样下面如果出现/Users/isaacho/Documents/application/docker/jenkins_home都需要换成你的目录
等待安装过程。。。,如果能打开http://localhost:8081
则说明安装成功
同时我们可以看到/Users/isaacho/Documents/application/docker/jenkins_home目录下生成了很多文件
命令解释:
--name jenkins_node 表示你的容器名字叫jenkins_node
-d 表示在后台运行
-v /Users/isaacho/Documents/application/docker/jenkins_home:/var/jenkins_home 表示把我们新建的jenkins_home目录映射到容器的/var/jenkins_home目录
-p 就是端口映射
配置jenkins
浏览器打开http://localhost:8081
,界面如下:
![10998c91f815d1f82ab3cb6169c7d40c.png](https://i-blog.csdnimg.cn/blog_migrate/96989e35a84968675659e4fc2dd9b92b.jpeg)
我们通过以下命令获取管理员密码
cat /Users/isaacho/Documents/application/docker/jenkins_home/secrets/initialAdminPassword
点击继续
![5273d1d2961a1390bd668a02c8330dc2.png](https://i-blog.csdnimg.cn/blog_migrate/334caaa4afe7e14ea6677e38b809a198.jpeg)
选择推荐的插件,安装插件,然后等待。。。
创建管理员用户
![0f5930207d0cd69593b6ac0e4ddb5973.png](https://i-blog.csdnimg.cn/blog_migrate/ecdb5254f7bb76c6c74241362e5453e9.jpeg)
点击保存并完成
![a1f8f255b950d12b9913241e7d7a829a.png](https://i-blog.csdnimg.cn/blog_migrate/cc848cfb6ea6e58abe0c42a3d65ba4f6.jpeg)
点击开始使用jenkins
![e5ddebaf60cbfe9d9d2e60a710b0fb6b.png](https://i-blog.csdnimg.cn/blog_migrate/5588a279c687e91e93ec1aa267351375.jpeg)
安装ssh插件
点击系统管理
![d891853fb52b81594f578c83c5a40f69.png](https://i-blog.csdnimg.cn/blog_migrate/bec8152092e2656bb6b38e5b5b8fe6c2.jpeg)
![8562b178fa641401d459afa0cc0ec7fe.png](https://i-blog.csdnimg.cn/blog_migrate/652d2110d45f500f727115ee1c4f4961.jpeg)
搜索Publish Over SSH
,并安装
配置ssh
系统管理=》configure system =》拉到最下面
![ba68cb5c96a348c725a83af106e69ad9.png](https://i-blog.csdnimg.cn/blog_migrate/34cd0d9d448a669319732178f09a9792.jpeg)
点击 Test Configuration,显示success则说明配置成功,点击保存
![1af7cd5b05487f022e7436cf2bf4e3cd.png](https://i-blog.csdnimg.cn/blog_migrate/4c01417dbeae1627fb4e3bd26d5d68b3.jpeg)
如果不成功,说明我们的电脑没有开启远程登录
解决方案:
选择系统偏好设置->选择共享->点击远程登录
上面的hostname即你这里的IP地址
![e3034806e38e44f44607d2c62f6abfde.png](https://i-blog.csdnimg.cn/blog_migrate/1fc6d962935340dcb7a26b4e2e625e0b.jpeg)
安装node插件
node插件在跑node项目时需要使用,这里先安装好
点击系统管理
![d891853fb52b81594f578c83c5a40f69.png](https://i-blog.csdnimg.cn/blog_migrate/bec8152092e2656bb6b38e5b5b8fe6c2.jpeg)
![8562b178fa641401d459afa0cc0ec7fe.png](https://i-blog.csdnimg.cn/blog_migrate/652d2110d45f500f727115ee1c4f4961.jpeg)
![b956c694c7d4731bd0ea11feb37b7784.png](https://i-blog.csdnimg.cn/blog_migrate/2834092fc5bf39c99054cad6868a4ec3.jpeg)
![049ea32272ef514ee7ab233fb7768de5.png](https://i-blog.csdnimg.cn/blog_migrate/f5dc3e2dce76e9ec0a5399a6f16707a7.jpeg)
等待安装好
选择安装nodejs版本
![0546bcd919a543f70ad5541120605a98.png](https://i-blog.csdnimg.cn/blog_migrate/cf9ba1457118471d4b475faa99edc1ba.jpeg)
![933e39a654999fa143b9c0c4265d7e1f.png](https://i-blog.csdnimg.cn/blog_migrate/b095f0de4e1fbf02b2f7175195bd4492.jpeg)
![bdf79b8eb169b6a8bab02d03fbbc1d54.png](https://i-blog.csdnimg.cn/blog_migrate/9f4d9c8ce4bdc9c87192ea181316c1a1.jpeg)
![bc2a28cff2cc851a9f3ad3f50a2a8a21.png](https://i-blog.csdnimg.cn/blog_migrate/35c1dadd561affa5ec193ecfec02843a.jpeg)
准备一个vue项目
项目已经上传到github
vue cli创建vue项目
我们用vue-cli3直接创建一个vue项目
注意: 这里需要你的node版本大于8.9 或更高版本
vue create vueclidemoapp
改写
修改HelloWorld.vue组件,改写页面,并加入axios发送一个请求
import axios from 'axios';
axios.get('/api', {
params: {},
}).then((res) => {
console.log(res);
});
...
界面如下
![5a76444ae462ecffadbb3e7f79334033.png](https://i-blog.csdnimg.cn/blog_migrate/5b9234cf5473f68627cb72b1a70b5345.jpeg)
创建nginx配置文件
关于nginx配置请看前端想要了解的Nginx
在项目根目录下新建nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain application/javascript text/css;
# 虚拟主机server块
server {
# 端口
listen 80;
# 匹配请求中的host值
server_name localhost;
# 监听请求路径
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
include /etc/nginx/conf.d/*.conf;
}
创建Dockerfile
在项目根目录下新建Dockerfile
FROM nginx
EXPOSE 80
此时你的目录结构是这样
![dd2b265e820bd2051e2383882d689f20.png](https://i-blog.csdnimg.cn/blog_migrate/1fd657aca218420377f7d76cd0b2a89c.jpeg)
把这个项目上传到github
这里我就不演示了,我的这个项目的github地址是https://github.com/repototest/vueclidemoapp
jenkins部署vue项目
新建任务
![836f1b2d3001bf71830bce6b82aa1344.png](https://i-blog.csdnimg.cn/blog_migrate/7bcd9740a2770fa08a2cc14b172ccf68.jpeg)
![c5504c5f53f7512a62979958516762a4.png](https://i-blog.csdnimg.cn/blog_migrate/47a3c253beca53f2cfc5a8e3304dc928.jpeg)
![864628469904396a6f30456cdfa9de2b.png](https://i-blog.csdnimg.cn/blog_migrate/e130c555b14b5155703fdde550388a6e.jpeg)
![9f0e22461224f7f25a81a41892abdab7.png](https://i-blog.csdnimg.cn/blog_migrate/c5e9b6024522b70919c6a343b9373ad3.jpeg)
![7ef191fe16854462472cd7f0391f6b24.png](https://i-blog.csdnimg.cn/blog_migrate/c941d7e3478997d031be9bfda9547dc1.jpeg)
第一个shell命令是build我们的vue项目,会在项目根目录下生成dist目录
echo $PATH
node -v
npm -v
npm install
npm run build
第二个shell命令是用来构建docker镜像和跑docker服务的
docker stop vuenginxapp || true
&& docker rm vuenginxapp || true
&& cd /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp
&& docker build -t vuenginxapp .
&& docker run -d -p 8083:80 --name vuenginxapp -v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/dist:/usr/share/nginx/html -v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/nginx.conf:/etc/nginx/nginx.conf vuenginxapp
docker stop vuenginxapp
用于停止vuenginxapp容器
sudo docker rm vuenginxapp
用于删除vuenginxapp容器
cd /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp
进入我们的项目目录,这里需要改成你们自己的目录,即(yourpath)/jenkins_home/workspace/vueclidemoapp
, yourpath就是上面我们新建jenkins_home目录时的目录
docker build -t vuenginxapp .
表示build镜像,名称为vuenginxapp
docker run -d -p 8083:80 --name vuenginxapp -v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/dist:/usr/share/nginx/html -v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/nginx.conf:/etc/nginx/nginx.conf vuenginxapp
表示已我们上面的vuenginxapp为镜像生成容器vuenginxapp
详细解释 -d
在后台运行
-p 8083:80
把容器的80端口映射程我们访问的8083端口,注意80端口是nginx默认的端口号
--name vuenginxapp
容器名称为vuenginxapp
-v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/dist:/usr/share/nginx/html
把我们生成的dist目录挂载到容器的/usr/share/nginx/html,/usr/share/nginx/html是nginx默认的http目录
-v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/nginx.conf:/etc/nginx/nginx.conf
把我们的nginx.conf挂载到容器的/etc/nginx/nginx.conf,/etc/nginx/nginx.conf是nginx默认的配置文件
vuenginxapp
是我们的镜像名称
可能遇到的问题
- docker不是一个命令 出现这个问题的原因是,我们用ssh连接mac时,命令行只能使用/usr/bin里的命令,但我们的docker命令是放在/usr/local/bin里的,所以找不到,解决方案是用/usr/local/bin/docker 代替上面的docker
即
/usr/local/bin/docker stop vuenginxapp || true
&& /usr/local/bin/docker rm vuenginxapp || true
&& cd /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp
&& /usr/local/bin/docker build -t vuenginxapp .
&& /usr/local/bin/docker run -d -p 8083:80 --name vuenginxapp -v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/dist:/usr/share/nginx/html -v /Users/isaacho/Documents/application/docker/jenkins_home/workspace/vueclidemoapp/nginx.conf:/etc/nginx/nginx.conf vuenginxapp
构建项目
点击立即构建
![e1c1878734e5577d446a34f25e7a9c63.png](https://i-blog.csdnimg.cn/blog_migrate/e220985795d98ef47eb06f2f4a75fa18.jpeg)
等待部署。。。
点击这个小圆可以看控制台输出
![5cf9c8cc7fdb389085b30ebc9e0905d6.png](https://i-blog.csdnimg.cn/blog_migrate/902d621b4c6d3f7c1fa9f067833df16c.jpeg)
![f7f22cfd38db15492f5ad2e559e33405.png](https://i-blog.csdnimg.cn/blog_migrate/c7911ec884c860459264c5d773811bde.jpeg)
可以看到我们的项目被拉到(yourpath)/jenkins_home/workspace
下了
![6b1bf03390dcb27f72fe45c5a5d4c51d.png](https://i-blog.csdnimg.cn/blog_migrate/a31fb8cc2b85df95696f9515e003159a.jpeg)
访问http://localhost:8083/
![29e9effa9bd7479dfbc8bac7199edf7b.png](https://i-blog.csdnimg.cn/blog_migrate/d5742fd3ffee42c51ea35dc3c385643f.jpeg)
至此我们成功部署了我们的vue项目
可能遇到的问题
- Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
本篇文章由一文多发平台ArtiPub自动发布