暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Jenkins自动化部署Vue项目

BugProvider 2021-06-18
1398
目的:
1.利用Jenkins,在前端代码提交代码到远程git仓库后,在jenkins所在的服务器自动构建docker镜像,并运行容器。
2.所需资源:
 - 一台Ubuntu PC 装 Jenkins Docker
 - 远端Git仓库 github gitee 均可
 - 一个Vue前端项目

大致流程:

Jenkins + Docker + Nginx

image-20210618134540735

1.Jenkins

1.安装Jenkins

1.下载Jenkins的war包

清华源 Jenkins 2.298下载地址

2.下载tomcat包

下载Tomcat9地址

2.启动tomcat

  • tomcat压缩包,解压后,将下载的jenkins.war拷贝到 Tomcat/webapps下,并将webapps的其他文件全部删除。
  • 启动tomcat在终端执行:
bin/startup.sh

  • 在logs/catalina.out中查看启动日志。

注意:在日志中有jenkins默认生成的登录密码,要在启动jenkins后输入。所以我们先把这串随机密码复制下载:edf8911d8dca42e88ed67e00d9af3816

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

edf8911d8dca42e88ed67e00d9af3816

This may also be found at: /home/fanyao/.jenkins/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

  • 浏览器访问:localhost:8080/jenkins

  • 输入刚才复制的初始密码  edf8911d8dca42e88ed67e00d9af3816

  • 选择安装推荐插件

  • 进入主界面

3.替换国内源

由于jenkins默认的插件源地址,网络原因,我们将地址替换为国内源(清华源)。

在Manage Jenkins ==> Manage Plugins ==> Advance ==> 最下方的升级站点

替换为https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

再点击提交,再点击立即获取即可

4.安装必要的插件

  • Blue Ocean 可视化流水线工具
  • NodeJS 用于npm打包前端项目
  • Publish Over SSH 用于jenkins 远程登录其他服务器

5.配置全局配置

在Manage Jenkins ==> Global Tool Configuration

  • Git

    image-20210618131519353
  • JDK

    image-20210618131400300
  • MAVEN

    image-20210618131430801
  • NodeJS

    image-20210618131458067
  • 这些全部配置为当前电脑上的具体路径,所以要求在这之前当前电脑已安装了JDK MAVEN NodeJS等

2.准备前端项目

我们使用Vue-Cli 来构建一个初始程序

  • 安装Vue-Cli,在终端执行

    npm install -g @vue/cli @vue/cli-service-global
    # or
    yarn global add @vue/cli @vue/cli-service-global

  • 创建Hello-World程序

    vue create hello-world

  • 启动程序

    cd hello-world
    npm run serve

  • 测试访问是否成功,出现如下画面

    image-20210618130932913
  • 项目准备好build后,进入生成的dist文件夹,浏览器打开index.html,没问题

    npm run build

3.安装docker

# 更换国内软件源(略)
# 安装所需要的包
sudo apt install apt-transport-https ca-certificates software-properties-common curl

# 添加 GPG 密钥,并添加 Docker-ce 软件源,这里中国科技大学的 Docker-ce 源
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"


# 添加成功后更新软件包缓存
sudo apt update

# 安装 Docker-ce
sudo apt install docker-ce

# 设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略)
sudo systemctl enable docker
sudo systemctl start docker

# 测试运行
sudo docker run hello-world

# 添加当前用户到 docker 用户组,可以不用 sudo 运行 docker(可选)
sudo groupadd docker
sudo usermod -aG docker $USER

# 测试添加用户组
docker run hello-world

4.在项目中构建dockerfile

项目目录:

1.添加Dockerfile

引用nginx镜像 ,暴露 80端口

FROM nginx
EXPOSE 80

2.添加.dockerignore,用于忽略其他文件

**/node_modules
**/dist

5.项目中添加nginx.conf

user  root;
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;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}

6.提交到GitHub上

https://github.com/PittYao/vuedocker

7.设置Jenkins

7.1创建自由风格项目

image-20210618131044301

7.2配置

7.2.1添加 git配置

image-20210618131236102

7.2.2添加 node配置

因为要编译前端需要node环境

image-20210618131728795

7.3 构建执行脚本

7.3.1 编译项目

选择增加构建步骤按钮:

image-20210618133139363

写构建脚本

image-20210618133000369
#!/bin/bash
echo $PATH 
node -v 
npm -v 
cnpm -v 
cnpm install 
cnpm i vue-loader-v16
npm run build
echo "=============编译完成=========="

7.3.2 构建为docker镜像并运行

构建docker镜像并运行的脚本

image-20210618133231576
#!/bin/bash
docker stop vuenginxapp || true \
 && docker rm vuenginxapp || true \
 && cd /home/fanyao/.jenkins/workspace/vuedocker \
 && docker build -t vuenginxapp . \
 && docker run -d -p 8083:80 --name vuenginxapp -v /home/fanyao/.jenkins/workspace/vuedocker/dist:/usr/share/nginx/html -v /home/fanyao/.jenkins/workspace/vuedocker/nginx.conf:/etc/nginx/nginx.conf vuenginxapp

注意: 其中的 /home/fanyao/.jenkins/workspace/vuedocker 为jenkins的workspace路径。需根据自己安装的jenkins来修改为自己电脑的jenkins的工作路径。

如何看自己电脑的jenkins的工作路径?

不要7.3.2的一步,直接构建程序,在控制台会输出Jenkins的工作路径

image-20210618135037171
image-20210618134833814

脚本具体意义:

  • 停止、删除之前运行的镜像
  • 进入到Jenkins工作路径,用Dockerfile构建镜像
  • 启动刚刚构建的镜像
    • 挂载workspace中的dist到容器中nginx的/usr/share/nginx/html中
    • 挂载workspace中的nginx.conf到容器中nginx的默认配置路径 /etc/nginx/nginx.conf
    • 8083代理了容器里的80端口

7.3.3 可能会遇到的问题

7.3.3.1 执行docker报错

控制台输出:

dial unix /var/run/docker.sock: connect: permission denied

方案一:只要docker服务重启,就需要重新设置一次。

# 修改docker权限
cd /var/run 
sudo chmod 666 docker.sock

#
重启docker 
service docker restart

第二种:只需要操作一次

#添加docker用户组
groupadd docker 

#
把当前用户加入docker用户组
gpasswd -a ${USER} docker

#
查看是否添加成功
cat /etc/group | grep ^docker

#
重启docker 
service docker restart

#
更新用户组
newgrp docker

7.3.3.2 npm build报错

控制台输出:

Error: Cannot find module ‘vue-loader-v16/package.json‘

由于vue3,构建项目没有使用vite,而是通过vue cli来构建。vue cli 搭建vue3项目跟以前vue2差不多,但需要把vue cli升级为最新版本。

  1. 升级npm
npm i -g npm

使用cnpm的也要升级一下cnpm

cnpm i -g cnpm

  1. 重新安装node_modules依赖包
rm -rf node_modules // 先删除原来的依赖包

cnpm i // 重新安装

  1. 重新下载
cnpm i -D vue-loader-v16

7.3.4 测试访问

访问 localhost:8083,见到如下画面则成功

image-20210618130932913

7.3.5 查看docker镜像

image-20210618140519248

至此,开发人员提交代码到远程Git仓库的master上,Jenkins点击构建即可完成部署。但是我们希望的是Git提交后,Jenkins自动构建,不需要我们来点击,这就需要webhook

8.Webhook

我这里用的内部git仓库 gitea,所以以此为例,Github和Gitee也类似:

8.1首先安装Gogs插件

Manage Jenkins ==> Manage Plugins ==> 可选插件 ==> 搜索gogs,安装即可

8.2 gitea配置webhook

image-20210618141935759

URL配置规则为:

http(s)://<你的Jenkins地址>/gogs-webhook/?job=<你的Jenkins任务名>

设置钩子成功后,点击测试推送,看到测试成功:

image-20210618142135662

8.3 测试

修改源码首页添加 fanyao, 提交git后。看到Jenkins自动开始构建了。

image-20210618143038583

访问访问 localhost:8083,见到如下画面则成功,看到首页新增了fanyao。表明自动化构建成功。

image-20210618143100341

9.shell参数化

上面我们固定了docker代理端口是8083,我们想如果能构建的时候自己指定就更方便了,这个用到This project is parameterized属性

9.1添加WorkspacePath参数

image-20210618154723533

9.2添加git项目名参数

image-20210618154757121

9.3添加docker对外端口参数

image-20210618154826277

9.4添加启动docker容器的名称参数

image-20210618154857136

9.5修改docker的脚本

image-20210618155038045
#!/bin/bash
echo "WorkspacePath:$WorkspacePath"
echo "GitProjectName:$GitProjectName"
echo "DockerPort:$DockerPort"
echo "DockerContainerName:$DockerContainerName"

echo "workPath:$WorkspacePath$GitProjectName"

docker stop $DockerContainerName || true \
 && docker rm $DockerContainerName || true \
 && cd $WorkspacePath$GitProjectName \
 && docker build -t $DockerContainerName . \
 && docker run -d -p $DockerPort:80 --name $DockerContainerName -v $WorkspacePath$GitProjectName/dist:/usr/share/nginx/html -v $WorkspacePath$GitProjectName/nginx.conf:/etc/nginx/nginx.conf $DockerContainerName

将之前脚本的固定参数都替换为上述的变量即可。

9.6测试变量

image-20210618155204344

构建后访问

localhost:8082仍然能看到首页,证明参数化成功。这样其他想要变更的变量均可这样执行。


现在只在一台服务间做部署,后续介绍一台Jenkins部署多台服务器的服务示例

下一章介绍Jenkinsfile 流水线的方式部署


文章转载自BugProvider,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论