ubuntu+nginx+jenkins自动化部署项目
这几日闲来无事,想着琢磨一下jenkins自动化部署,解决一下每次更新都要手动部署的问题,经过这几天的各种踩坑,现在记录下配置过程,供各位及自己以后查看,写的不对或者不妥的地方还请各位指出;
1.准备
ubuntu,nginx以及jenkins的安装此地就不再赘述,网上搜一下教程还是蛮多的,直接上干货吧.
2.配置系统设置及全局凭据
任务创建完毕后需要先配置系统设置并添加全局凭据
点击面板manage Jenkins->configure System;
步骤一:找到github server(因为我用的是github托管,所以这里用的也是github的项目),其他的代码托管网站也是可以的,这里主要是为了让jenkins能连上代码仓库,原理类似;
但是仅有这些是不够的,就这些怎么能连上代码仓库呢,所以我们还得添加凭据,让jenkins能连接代码仓库
步骤二:添加全局凭据
添加全局凭据有以下几种类型:
- 用户名和密码
- giahub app
- ssh密钥
- secret
这里用的是secret,首先在添加Secret text全局凭证之前得先在github生成一个secret;
打开github,点击settings->Developer settings->Personal access tokens->Generate new token;
验证完毕github密码后进入secret 设置页面,如下:
填写完毕后点击最下方Generate token创建一个secret text
创建完毕后会在Personal access tokens里显示刚刚创建的secret,复制并保存,复制并保存,复制并保存,重要的事情说三遍,因为这个一旦关闭,你就再也看不到了,只能重新创建;
拿到secret后回到jenkins,添加凭据:
- 首先类型选择Secret text
- 输入上一步在github拿到的secret
- 点添加就可以了
回到步骤一,添加secret后凭据列表中就会出现刚刚添加的列表,如图:
选择刚刚添加的凭据,点击连接测试,测试下是否有效,出现类似以下提示则说明成功啦,现在jenkins可以拿到github中的项目代码了,离成功就又近了一步.
3.任务创建及配置
登录jenkins页面,一般是服务器IP地址+端口号(默认是8080),点击左侧新建item,填写任务名称,选择freestyle project,然后确定,任务就创建好啦
创建完任务后就进入到了项目配置页面,总的来说,项目配置分为以下几部分:
- General
- 源码管理
- 构建触发器
- 构建环境
- 构建
- 构建后操作
现在来一个个看看怎么配置吧
1.Genral
Genral设置分两部分
2.源码管理
因为我采用的是git管理源码,所以这里填的是git地址,填入git地址,以及凭证(这里的凭证使用类型为SSH Username with private key),生成方式参照上方secret添加,只是对象由secret换成了ssh,分支的话就是天你想要自动化部署项目中的某个分支就好了
3.构建触发器
在这里可以选择什么条件下处罚,这里我选的是轮询,填入五个星号(星号之间有空格)表示每分钟查询一次,若代码有变动则发起构建,实现代码推送后自动构建部署的功能;
4.构建环境
这里因为我的项目是基于node环境构建的,所以这里选择node环境进行构建
有的人可能没有这个选项,是因为没有安装jenkins的NodeJS Plugin插件
解决办法:首页点击Manage Jenkins –> Manage Plugins –>在可选插件中搜索node,安装一下插件就可以了
至此,jenkins的项目代码拉取,构建触发器都设置好了,接下就是开始构建项目了
5.构建
这部分中只有一个Execute shell,表示要执行的命令脚本,按照vue项目的启动规则,一般是npm i && npm run build(安装项目依赖后打包成dist文件),所以在这里就填入以下内容,具体项目看具体情况吧
ok,到了这一步,你的项目可以说是基本配置好了,但是….
事情没有那么简单,当我按照以上步骤配置完毕后发现,跑是可以跑起来,但是打包出来的dist文件呢,找了半天,终于在jenkins的workspace目录下找到了,但是dist文件放这里有啥用啊,我得移到nginx部署的项目文件夹下才能完成部署啊
天真的我又回到构建步骤在npm run build后加了一句:cp xxx/xxx/xxx xxx/xxx/xxx
信心满满又开始新的构建
果不其然,报错了,提示权限不足!!!愣了一下,然后回到构建环节在cp 命令前加了一句sudo
信心满满又开始新的构建
结果当然是失败了,sudo是要输入密码的嘞,总不能直接在构建环节把密码输进去吧,太不严谨了,有没有不用输密码也能传输文件的招不
一翻搜索,终于,锁定了jenkins的一款插件—Publish Over SSH,即通过ssh发送文件,就不需要输入密码了,
关于该插件,点击官方文档查看
好家伙,这插件的使用又是一部血泪史啊
4.publish-over-ssh插件的使用
步骤一:生成ssh密钥
首先,安装publish-over-ssh插件,在使用这个插件之前需先生成ssh秘钥,执行以下代码:
ssh-keygen -t rsa //生成ssh秘钥
cd /xxx/xxx/.ssh //进入.ssh, 将/xxx/xxx/.ssh路径替换为你的秘钥文件夹路径
sudo cat id_rsa.pub >> authorized_keys //将公钥拷贝到authorized_keys文件这一步很重要,没有拷贝的话后面会报错
复制代码
步骤二:配置SSH Server
生成密钥后回到jenkins,点击Manage Jenkins –> Configure System
找到Publish over SSH,按下图填入对应信息,其中Disable exec不要勾选,Disable exec不要勾选,Disable exec不要勾选
步骤三:jenkins任务构建配置
回到任务配置,为了方便,先找到构建,将Execute shell中的代码修改为:
npm i //安装依赖
npm run build //打包
cd dist && tar -zcvf dist.tar.gz * //将打包好的文件压缩到dist.tar.gz
复制代码
继续往下拉,找到构建后操作,或者在构建环境中勾选Send files or execute commands over SSH after the build runs,即为构建完毕后执行的文件传输过程,填入内容是一样的,功能也是一样的,二者选其一即可
重点说明!!!
重点说明!!!
重点说明!!!
- Source files相对路径问题,不是.Jenkins/workspace,而是jenkins/workspace/[project]/,即wokspace下你得项目路径
- Remove prefix: 文件复制时要过滤的目录
- Remote directory: 文件得到到远程机上的目录,此目录是相对于“SSH Server”中的“Remote directory”的,如果不存在将会自动创建。
- Exec command: 传输完毕后要执行的脚本,上面我将构建完毕打包成了一个压缩包(dist.tar.gz),构建后操作配置是将jenkins/workspace/[project]/dist/dist.tar.gz传输到Remote directory,但此时它还是个压缩包,所以在传输完毕后要进入Remote directory后将dist.tar.gz解压缩,就完成部署了
至此,jenkins自动化部署暂时告一段落,回到jenkins首页,执行构建,构建成功!!!!
提交新代码至github,一分钟(触发器选择的是每分钟轮询,所以需要一分钟)后jenkins开始自动构建,构建成功,打开网址,发布成功!!!
撒花~~~~