GitLab与jekins结合构建持续集成(cl)环境(2)

news2024/11/22 16:32:00

目录

GItlab配置邮箱

绑定邮箱

创建群组

添加人员

创建一个项目

添加文件

新建分支

如何拉取代码

Git bash 演示

 Git GUI演示

安装jenkins

更改插件镜像源

配置jenkins使用gitlab更新代码

安装jekins插件

配置jenkins免密拉取gatlab代码

jenkins创建项目

将代码发布到web服务器

测试

给不同的用户分配权限

开启role

设置角色

 给lyh用户分配角色

创建角色

分配角色

分支回滚

项目合并

回滚操作


GItlab配置邮箱

#修改配置文件
vim /etc/gitlab/gitlab.rb 

#去掉注释并修改内容
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "17633164083@163.com"
gitlab_rails['smtp_password'] = "BMEOXDBBMJGWOIHT"

#这是邮箱域名(可写可不写)
#gitlab_rails['smtp_domain'] = "example.com"

gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_pool'] = true
#手动添加
gitlab_rails['gitlab_email_from'] = '17633164083@163.com'

#重载gitlab
gitlab-ctl reconfigure

#登录控制台测试
gitlab-rails console

#往邮箱发送邮件
Notify.test_email('17633164083@163.com','test','lyh').deliver_now

绑定邮箱

创建群组

Gitlab中的组和项目有三种访问权限:Private、Internal、Public

Private:    只有组成员才能看到
Internal:   只要登录的用户就能看到
Public:     所有人都能看到
开源项目和组设置的是Internal

群组名称随便起,但最好是英文,不然访问的时候群组URL会变成别的

随便选,最后点击创建群组

添加人员

用户名是登录时候的用户名,访问级别是根据这个人来定的,这里选的是管理员,改完点击创建即可。

 登录这个账户

 会向qq邮箱里面发送一个初始密码

点击Click here to set your password会让他设置密码,跟着引导走即可

 改完密码也会发送一个邮件

将lyh加入到project group

  角色:

Guest:        可以创建issue、发表评论,不能读写版本库
Reporter:     可以克隆代码,不能提交,QA、PM可以赋予这个权限(总监)
Developer:    可以克隆代码、开发、提交、push,RD可以赋予这个权限(开发)
Master:       可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限(项目开发头头)
Owner:        可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限(运维人员)

也可以

在这里可以设置用户最大角色,和过期时间,同时也会发送一封邮件

创建一个项目

在首页点击新建项目到下图

空白项目就是一个空文档

从模板创建就是可以选择一些已经创好的模板 

 导入就是将其他地方导入到gitlab 

 我们选择创建空文档

 项目名称最好起英文名,可见界别根据具体情况而定,然后点击创建新建项目

 使用说明:跟使用GitHub一样,需要注意的是没有在账号中新建ssh公钥之前,将无法通过ssh拉取或推送代码

添加文件

新建分支

 创建两个分支wyb和lzz

 在wyb中添加文件

这个是在其他分支看不到的

 但是main是他们的主分支,在main里面新建文件,在其他子分支是看得到的

如何拉取代码

 首先公司的开发肯定用的是windows系统或者Mac系统,所以需要在他们的电脑上安装一个软件叫做“Git Bash”

下载地址https://git-scm.com/download/win

 下载完之后安装

 

 之后一直默认到下图,选择第一个

 之后一直默认安装即可。装完之后桌面上就有Git bash了

 Git bash是命令行

Git gui是图形化

Git bash 演示

打开Git bash输入ls 就会把你桌面上的内容

  git config --global user.name "lyh",作用是声明是谁,只需要声明1次 

 git config --global user.email "1684954874@qq.com",写的是当时创用户的邮箱

这时就可以直接拉代码了,复制第二个

 会弹出这个界面,这里写的用户名和密码是登录gitlab的用户名密码

确定以后,桌面上会有一个test目录,目录里的文件就是刚刚在gitlab上创建的

修改一下内容,重新上传到gitlab,再到gitlab看看数据是否更改

Git bush上传流程

工作区到暂存区是可以撤回的,一旦发送到本地仓库后,就不可以撤回了

 可以看到gitlab中的内容已经修改了

 Git GUI演示

 source源                target是目标地址

进到里面有五个按钮,一个一个点,注意是一个一个,就OK了

linux系统的操作方法跟Git bash的操作一样

安装jenkins

首先安装jdk

#安装jdk
yum -y install java-11-openjdk

#解压
rpm -ivh jenkins-2.387.2-1.1.noarch.rpm 

#修改配置文件
vim /etc/sysconfig/jenkins 

...
JENKINS_USER="root"    #改成root
...


#启动
/etc/init.d/jenkins start

[root@localhost ~]# /etc/init.d/jenkins start
Starting jenkins (via systemctl):                          [  确定  ]

访问 jenkins服务器IP:8080 

主要把汉化包安装上

 

之后一直默认就行了

更改插件镜像源

Manage jekins ---->Manage Plugins --->Advanced在最下面的升级站点改成国内的

我用的是https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

除此之外还需要修改这个文件

cd /var/lib/jenkins/updates/
sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json 
sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json 

如果是手动安装插件,导致版本不匹配,则需要下载

wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/latest/jenkins.war

关闭jekins
然后把/usr/share/java/中的jekins.war替换掉
开启jenkins

配置jenkins使用gitlab更新代码

安装jekins插件

Manage jekins ---->Manage Plugins--->Avaiable plugins

搜索要安装的插件

Gitlab、Git、Git Clinet、Gitlab Authentication、SSH agent、Publish Over SSH

Geneic Webhook Trigger 、Build Authorization Token、Build Token、Role-based Authorization Strategy

等他下完自动重启即可 

配置jenkins免密拉取gatlab代码

[root@bogon ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:NDVi5sr6a7jorx9Rvs/cG7xKrk+SGMAIyVqVSd/SRds root@bogon
The key's randomart image is:
+---[RSA 2048]----+
|o. ooo  +.=      |
|o+. o. * + +     |
|o.o   + * . E    |
|.  . + + .       |
|    o + S        |
|     = o .       |
|    +.+ o o      |
|   ..o.O . o     |
| .+++o++B.+.     |
+----[SHA256]-----+'

[root@bogon ~]# cat .ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwAlMU1euHJwb0bbc9f0ceqjL7zTchKMkH/3AUEqZG4p6e81f
h9e0jQ5VeT7p4+zvRbN7BM8W6SlWZwuNIi/lAw/NqADdhMHZq1Q/WGzzBavvBZF4
OmGTZj++2385jRyl1V+vle2W0/g9bXM47WlKP00Rtny0D8qA5oaEXef2tTqLKqzZ
YE1fmlQyCOu6n6/CzYTJr+OOlymM06vVyl38Q7iaZIOs6vYKbC8eZv6X0N8qKtXQ
EYpHDUye1ZCtvK4QZcijsQkiVXDZdeIBz9rww2WMQ92Ks5AQtSk6Y6uAPOQU84m8
ieDEISc9W/Y3DEguEsL4KaiOquwaFzTcb2A3EwIDAQABAoIBAGyv1ocFBQIkSIp1
GLIQw2GYz3NfU7+uJfAFSicnUWiJA7G2Fu9nYkTDbBTnSrE5lGK6plGec7UbNE+1
9fb3bIJDG36OntFYdb3GPOPrJdB78xgPsSA5wZcJVRgd9ZCsOh99vH76rXbi9MFR
iVK1WNRi5jeGdNLLJhFS6O/NLZB7yNyaxokHBlULK6egYlCwVb+B5LNh3lF7v88e
1N50bK3ux0+dEyd4JNEcpZuhkeCNpESiN6S2FuBDIoF+SOlRVa/2HKQ1wr5G8Fht
Ef3bOmc3kh4o/gzQH4vZzsFkNVSFMkidlzPs2XPbokwcns7WQe7Y609QIF8ymnDw
yliGtmECgYEA/Ee+fMVEj1r6bEMcDLWPYvN7Qr4oDZmV5d9iB4w8YBuiTfjrxpKo
60jU1WvZYW6QIx9+641/gR+UBue6KTOg96NNILIw9kykpkikgcxxZJdxK88IzF4d
fKc3H/k5CJ8yTgqgzsaiU2IAaYdhTToiwx0lfeigpvKiJyAV7mef+cUCgYEAwt4o
V6pRZZLL3hpQ7AzywDOKq9+o4o7p3CkqR0poUUwzalRtq2Zw3upcldZLr6y2hUaK
EvxeghT24ij3fdRgEA32I1IzecaHd8jZ7rKD6RSAqp/gZGe8bLbyVWrlYGS5REnW
ys08vzNz3SK+opIlTVRXwUH5MVo9IMvPiXLi8vcCgYEA+yIUHrJlAGupdBIOHxyx
ougL4LHYv0kPbehD9o2EIIwBsqrDUkX2f1ld/SJCH/pm43/b4XJW5dvgiEsvBwrN
Bxb5lT2s/dHn6VvQ3yD8FA2pa9nJwV9C7S6r8lkujEWlVwi/cXdMacLZ9DL/Clh/
+EjQZJkpK2fHQTlwe4WOO50CgYAVS6Xo/qnqicJRwVp6kWet7XQIGGciay/PaYg/
RjhkOgmcYyGhC47mLYJ0tXiL+DnyEqVgMcg6OwRH7uYtEBp3Zq8xaPhLJJEFXCPE
3CliPWVaQCKLlnKXBt8wyn/Kqvc8KT2Z6BftZTgSQIvIxGPjMYZtjkInTI9FmEBT
6wQ2PQKBgQDY6nU+BVZm5wFKwFSeHQVsT7P6yZxsXzp08hYhAvKmKyhsACQVEnBO
SilPkJqpePaFOTlsxoMM9K7ZBaVIJi5iMM32MVQcrANERxRZ6xv6EFP7r9ke2VLJ
Da27rah7tCs1si70YVXTRYAJ9cR41/mv8/CFiocDWrhyGPWseCBgMg==
-----END RSA PRIVATE KEY-----

[root@bogon ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDACUxTV64cnBvRttz1/Rx6qMvvNNyEoyQf/cBQSpkbinp7zV+H17SNDlV5Punj7O9Fs3sEzxbpKVZnC40iL+UDD82oAN2EwdmrVD9YbPMFq+8FkXg6YZNmP77bfzmNHKXVX6+V7ZbT+D1tczjtaUo/TRG2fLQPyoDmhoRd5/a1OosqrNlgTV+aVDII67qfr8LNhMmv446XKYzTq9XKXfxDuJpkg6zq9gpsLx5m/pfQ3yoq1dARikcNTJ7VkK28rhBlyKOxCSJVcNl14gHP2vDDZYxD3YqzkBC1KTpjq4A85BTzibyJ4MQhJz1b9jcMSC4SwvgpqI6q7BoXNNxvYDcT root@bogon

jenkins创建项目

 

 这只是一个描述信息,随便写,之后点击源码管理

 如果出现这样的

 就需要打开 Manage jenkins --> Configure Global Security ,找到 Git   Host Key Verification Configuration,按下图修改后保存。警告信息可以忽略

 或者改成Known hosts file就OK了

 就不报错了

 构建一次

 在gitlab里面修改文件再重新构建,看看内容是否修改

 

 

 查看内容,免密构建成功 

将代码发布到web服务器

这里我开了一台docker机器模拟网站服务,nginx和apache都可以

[root@localhost ~]# docker run -itd -p 80:80 -v /var/www/html/:/usr/local/apache2/htdocs/  httpd:2.4.57 

将本地的/var/www/html/挂载到容器内部的/usr/local/apache2/htdocs/  

配置免登

[root@localhost ~]# ssh-copy-id root@192.168.100.10

写脚本

vim /root/deploy.sh

#!/bin/bash
scp /var/lib/jenkins/workspace/web-test/index.html root@192.168.100.10:/var/www/html

#将/var/lib/jenkins/workspace/web-test/index.html复制到192.168.100.10的/var/www/html目录下


#给权限
[root@localhost ~]# chmod 777 deploy.sh 

在jenkins上配置

 

保存 

测试

到jenkins服务器把之前的文件全删掉

[root@localhost ~]# rm -rf /var/lib/jenkins/workspace/*

 如果报错没权限,如下图:

 则需要

#首先
vim /etc/sysconfig/jenkins 

....
JENKINS_USER="root"
JENKINS_GROUP="root"
....

#然后
vim /usr/lib/systemd/system/jenkins.service 

....
User=root
Group=root
....

systemctl daemon-reload 
systemctl restart jenkins.service 

访问网站 

给不同的用户分配权限

开启role

Manage jenkins --> Configure Global Security--->授权策略

设置角色

开启了Role-Based后,系统管理里多了个Manage and AssignRoles

 他有两个角色需要配置:一个是global roles全局角色,另一个是item roles项目角色

 

 给lyh用户分配角色

创建角色

 添加baserole,给予权限

添加role1 ,pattern里面是项目名称,再把上面的√点上,然后点击save保存

分配角色

 点击save保存,登录lyh

能够进行相应的操作

 在创建一个用户alex,在创建一个item过程省略,向上面找

 

 有项目以后分配权限

 登录lyh,只能看到web-test项目

登录alex,只能看到web-test项目

分支回滚

首先先说一下项目合并

#在linux上git下载
git config --global user.name "lyh"
git config --global user.email "1684954874@qq.com"
git clone http://192.168.100.5/liuyuhao/test.git
cd test

#查看所有分支,前面的*表示当前在那个分支
[root@localhost test]# git branch 
* main

#创建分支
[root@localhost test]# git branch lyh

#切换分支
[root@localhost test]# git checkout lyh
切换到分支 'lyh'

#创建并切换分支
[root@localhost test]# git checkout -b lzz
切换到一个新分支 'lzz'

#列出所有分支
[root@localhost test]# git branch 
  lyh
* lzz
  main

#在lzz分支创建一个文件,名字和内容随意
vim 123.txt

#将文件上传到暂存区--->本地仓库--->远程仓库
[root@localhost test]# git add 123.txt
[root@localhost test]# git commit -m "add 123.txt"
[lzz da2e3f1] add 123.txt
 1 file changed, 1 insertion(+)
 create mode 100644 123.txt
[root@localhost test]# git push origin lzz
Username for 'http://192.168.100.5': liuyuhao
Password for 'http://liuyuhao@192.168.100.5': 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for lzz, visit:
remote:   http://192.168.100.5/liuyuhao/test/-/merge_requests/new?merge_request%5Bsource_branch%5D=lzz
remote: 
To http://192.168.100.5/liuyuhao/test.git
   aac72a4..da2e3f1  lzz -> lzz

在gitlab仓库的项目查看

项目合并

方法一:

 main主分支就有123.txt了

方法二:在linux上操作

#切换到lyh分支
[root@localhost test]# git checkout zmy
切换到分支 'zmy'

#内容随意
[root@localhost test]# vim lzz.txt

#上传
git add .
git commit  -m "add lzz.txt"
git push origin zmy

#切换至main
git checkout main 

#合并
git merge zmy

#上传
git push -u origin main

回滚操作

删除没用的文件 

 lzz里面是合并前的文件,main里面是合并后的文件。

现在网站发布的是合并后的网页(即2.0),现在2.0出现问题了,想让网站发布合并前的网站(1.0)

#在jenkins服务器上
#写脚本
vim test.sh
#!/bin/bash
cd /root
git clone -b lzz git@192.168.100.5:liuyuhao/test.git
cd /root/test
scp -r ./* root@192.168.100.10:/var/www/html

#给予权限
chmod 777 test.sh 

#手动执行
[root@localhost ~]# ./test.sh 
正克隆到 'test'...
remote: Enumerating objects: 59, done.
remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 59 (delta 5), reused 0 (delta 0), pack-reused 20
接收对象中: 100% (59/59), 7.72 KiB | 0 bytes/s, done.
处理 delta 中: 100% (7/7), done.
index.html                                                100%   16     7.2KB/s   00:00    

回滚成功!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种vivado联合vcs仿真以及verdi查看波形的方法

上一篇中提到vivado仿真xilinx官方的axi vip耗时过长、且每次缩放波形时加载慢的问题。后来用了正点原子的AXI DDR例程,将AXI DDR换成了AXI RAM进行读写测试,用以学习了解AXI的工作方式。详见此文读写AXI4接口RAM的简单示例_给米PHY的博客-CSDN博客。 在…

力扣题库刷题笔记20-有效的括号

1、题目如下: 2、个人Python代码实现如下: 第一次读题就理解错了题意,以为是只判断小括号闭合,大括号、中括号只是干扰元素。再次读题后,代码实现如下: 以上代码仍旧是没有理解清楚题意,以为是只…

Linux Shell 实现一键部署二进制docker+docker_compose

docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 d…

协议篇之以太网UDP协议

协议篇之以太网UDP协议一、写在前面二、TCP/IP协议分层三、UDP协议数据报格式2.1 MAC层/物理层:2.2 IP层/网络层:2.3 UDP层/传输层:2.4 应用层:四、总结四、写在后面一、写在前面 TCP/IP协议是指一个协议簇,可以理解为…

测试包的更新

有的项目有配了ci自动打包更新,开发有权限,就不用测试更新;有的是在阿里云上,测试没有权限,也是开发更新;测试自己的测试服务器,部分开发没有上传下载的权限,所以需要测试来进行更新…

CentOS 8自动化安装MongoDB并安装和实验master-slave集群、副本集群(Replica Set)、分片集群(Sharding)

文章目录CentOS 8自动化安装MongoDB安装Master-Slave集群安装并测试副本集(Replica Set)集群安装副本集(Replica Set)集群实验测试安装并测试分片集群(Sharding)注意实验使用的是ARM架构的CentOS 8 虚拟机 CentOS 8自动化安装MongoDB 首先,更…

分布式事务-概念-实现方式

分布式事务 文章目录分布式事务一、分布式事务相关概念1.分布式事务架构图2.理解本地事务相关概念3.理解分布式事务相关概念1.CAP理论2.刚性事务(CP)与柔性事务(AP)3.基于AP模型衍生下的BASE理论4 .如何从大方向选择分布式事务&am…

MySQL正则表达式 | 事务详解

目录 一、正则表达式 实例操作 二、事务 事务控制语句 MYSQL 事务处理主要有两种方法 SQL测试代码 PHP中使用事务实例 使用保留点 SAVEPOINT 一、正则表达式 MySQL可以通过 LIKE ...% 来进行模糊匹配。 MySQL 同样也支持其他正则表达式的匹配, MySQL中使用…

【嵌入式Linux内核驱动】GPIO子系统

GPIO子系统 总体框架 通用功能 可以设为输出:让它输出高低电平;可以设为输入,读取引脚当前电平;可以用来触发中断 通用属性 Active-High and Active-LowOpen Drain and Open Source 开漏和开源 GPIOLIB向上提供的gpiod相关接…

数据结构与算法之手撕排序算法

前言 为什么要学习排序算法? 根据统计,早起大型机CPU资源的四分之一都花在了数据排序上面。排序算法作为最基础的算法,各种操作系统、编程语言都提供了内置的实现。既然排序实现随处可见,我们为什么还要自己动手实现呢&#xff1…

文章伪原创-文章伪原创工具

伪原创原理 文章伪原创的原理是将一篇原始文章进行修改、改写、调整或者替换一些词句等方式,生成与原始文章类似但又不完全相同的新文章。 文章伪原创的实现需要用到自然语言处理技术和相关的算法。具体的过程包括以下几个步骤: 分析原始文章&#xff…

YML是一种数据存储格式

读取yml配置信息 Value("${province}") private String province; Value("${user.sname}") private String name1; Value("${user1[1].name}") private String name; Value("${server.port}") private int port; server:port: 8099 #…

大数据现在找工作难么

大数据行业工作好找还是难找不是光靠嘴说出来的结合实际,看看市场上的招聘需求和岗位要求就大致知道了 要想符合企业用人规范,学历,工作经验,掌握技能都是非常重要的~ 先来看几个招聘网站的报告数据: Boss直聘发布的…

Linux应用编程(系统信息与系统资源)

在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息,譬如获取系统时间、日期以及设置系统时间、日期等&#xf…

java拦截器怎么实现

Java拦截器是一种对象拦截器,它可以拦截任何的类、方法和字段。拦截器还可以用于检查类是否已经加载以及对字段的访问权限是否符合规范。下面就让我们来了解一下 java拦截器怎么实现吧。 在 Java中,可以通过重写方法和代码块来实现拦截功能,但…

通俗讲解什么是Socket通讯

Socket通讯原理 1、什么是Socket? Socket,即套接字。就是两台主机之间逻辑连接的端点。(通俗来说:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket)。 Socket是一套…

【python】类和对象 | 一些混淆的知识点再复盘 | 魔术方法(特殊方法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、魔术方法二、构造方法三、__ getitem __方法四、__ len __方法前言 参考视频:视频 一、魔术方法 首先看一看chatgpt对魔术方法(特…

一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlsxwriter 模块:用于创建 Excel .xlsx 文件, 资料整理笔记(大全)摘要模块图类关系图模块全展开【xlsxwriter】统计常量模块1 xlsxwrite…

数据爬虫爬数据时常遇到的问题

第一,可能不能直接通过pyppeteer简单的直接page.querySelectorAll()获取所有元素然后直接 str(await (await element_songer_name.getProperty("title")).jsonValue()) 得到数据值,主要原因可能是#document问题, 所以遇到这个问题…

vue项目配置不同环境打包指令(vue-cli2、vue-cli3项目)

目录 一、vue-cli3项目:1、项目根目录创建环境文件2、 配置打包指令3、打包生成不同的dist文件夹 二、vue-cli2项目1、配置指令2.创建环境文件3、config/index.js中添加 三、遇到的问题1.vue-cli3项目配置打包指令,没有生成css文件--mode test2、vue-cli…