在前端开发项目中,我们可能会遇到很多频繁重复的工作,尤其是是测试环境的缺陷修复与发版。手动部署多台服务器,也是一个体力活。而且很多公司规模并不是那么大,可能没有专门的团队来做这件事。这个时候我们就需要一个自动化的工具,来提高我们的效率。最典型的工具就是Jenkins。 接下来,我们讲探究一下怎么使用jenkins部署。本次内容,我们将学习或者巩固到如下知识点:
节点,简单来说就是一个拉取你的最新代码执行打包构建的服务器。
【Manage Jenkins】--> 【Manage Nodes and Clouds】
节点列表页面【新建节点】,节点命名 为 h5-slave,与配置填写。
,指定工作目录。(此处指定为/mnt)
配置填写完毕,点击保存,即返回到了节点列表页面:
我们可以发现外面刚才见 h5-slave节点 有个红色的叉,表面该节点不可用。服务还没启动。此前无法作为jenkins构建。
从节点列表点击该节点,进入到节点明细页面我们可以看到如下
在浏览器中启动节点
在命令行中启动节点
java -jar agent.jar -jnlpUrl http://xxx.xxx.x.x:8080/computer/h5-slave/slave-agent.jnlp -secret 8973d1ffe40afad5d9003cbf5ae3639dc49626e89567845cb5aabb2ac75cedc4 -workDir "/mnt"
Run from agent command line, with the secret stored in a file:
echo 8973d1ffe40afad5d9003cbf5ae3639dc49626e89567845cb5aabb2ac75cedc4 > secret-file
java -jar agent.jar -jnlpUrl http://xxx.xxx.x.x:8080/computer/h5-slave/slave-agent.jnlp -secret @secret-file -workDir "/mnt"
这像是一个操作指引,告诉我们在节点服务器执行如下命令即可启动成功。 同时,我们要想启动节点服务器,必须要具备如下环境与条件:
nodejs环境对于web前端开发来说再熟悉不过了,但是Linux系统下java环境怎么部署呢?也需要一个规范。这里可以给出一个参考给大家:
java -version
// 或者
yum list installed |grep java
从这个命令可以看到,我们确实没有安装java环境
首先,我们到官网上下载jdk8的稳定版本 Jdk官网,打开这个页面,我们可以看到如下:
这些版本看起来眼花缭乱的,但是我们注意以下几点:
一般情况下,选择Linux x64就行了。
这里下载也可以通过两种方式下载:
注意:这里官网下载需要你注册账号,登录
我们将jdkxxx.tar.gz放到/usr/local
目录下,然后解压
// tar.gz文件解压:
tar -xzvf jdk.xxx.tar.gz
// zip文件解压
unzip jdk.xxx.zip
// 如果没有zip命令,可以安装
yum install unzip -y
打开配置文件
vi /etc/profile
在最后两行添加:
export JAVA_HOME=/usr/local/jdk-xxxx
export PATH=$PATH:$JAVA_HOME/bin
随即,我们让配置生效
source /exr/profile
利用第一步中的命令:
java -version
// 或者
yum list installed |grep java
wget [右键复制超链接后的url]
拷贝此前新建节点后页面提示的一长串命令,然后用nohup方式 启动即可。
nohup java -jar agent.jar -jnlpUrl http://1xx.xx.1.2:8080/computer/h5-salve/slave-agent.jnlp -secret
2eb8b373985964a61d4a8fa40cd8b452bd575704254292510a2aeec4da18adfb -workDir "/mnt"&
注意:前面有一个nohup,结尾有一个&,且&前面不要有空格
节点启动成功后,我们即可用该节点自动部署了。
填写完后,一定要记得点击【应用】或者【保存】。
我们来看看流水线的标准语法结构:
pipeline {
agent {
label ‘[节点名]‘
}
stages {
stage(‘process name 1‘) {
steps {
// Get branch lastest code from a GitHub repository
echo ‘pull code start: get latest code‘
git branch: ‘1.0.0‘,
credentialsId: ‘59d70ec8-6236-4bba-add1-15447d212d62‘,
url: ‘https://gitlab.xxx.com/hjqh/future-am-admin.git‘
}
}
stage(‘process name2‘) {
steps {
}
}
stage(‘process name3‘) {
steps {
}
}
}
}
具体实际的配置,我们可以参考如下:
pipeline {
agent {
label ‘h5-slave‘
}
stages {
stage(‘Pull code‘) {
steps {
// Get branch lastest code from a GitHub repository
echo ‘pull code start: get latest code‘
git branch: ‘1.0.0‘,
credentialsId: ‘59sssc8-6236-4bba-add1-15447d212d62‘,
url: ‘https://gitlab.xxxx.com/hjqh/future-am-admin.git‘
}
}
stage(‘Build‘) {
steps {
// Get branch lastest code from a GitHub repository
echo ‘build start......‘
// 安装依赖
sh ‘npm install --registry=https://registry.npm.taobao.org‘
// 打包构建
sh ‘npm run build‘
// 重命名打包名
sh ‘mv dist ./admin‘
// 压缩,方便更快传输到目标应用服务器
sh ‘tar -czvf admin.tar.gz admin‘
// 控制台打印
echo "build success..."
}
}
stage(‘Deploy‘) {
steps {
echo ‘deploy start...‘
// 用ansible命令备份应用服务器上原有的文件
sh ‘ansible admin -i /mnt/hosts -m shell -a "mv /home/apps/admin /home/apps/backup/app-`date +%Y%m%d%H%M%S`"‘
// 用ansible命令将节点服务器部署包上传至应用服务器
sh ‘ansible admin -i /mnt/hosts -m copy -a "src=/mnt/workspace/xxx/admin.tar.gz dest=/home/apps"‘
// 用ansible命令操作应用服务器,解压应用服务器上的部署包(解压及完成部署)
sh ‘ansible admin -i /mnt/hosts -m shell -a "tar -zxvf /home/apps/admin.tar.gz -C /home/apps/"‘
// 用ansible命令操作应用服务器,删除节点服务器上的部署包
sh ‘rm -rf /mnt/workspace/xxx/admin.tar.gz /mnt/workspace/xxx/admin /home/apps/admin.tar.gz‘
echo ‘deploy success‘
}
}
}
}
从上述的实际流水线脚本,我们需要注意如下:
首次看到ansible,是否是一头雾水?先来看概念
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
从上述概念上,我们可以知道,ansible就是一个实现批量部署的工具。 假如你又10台服务器需要部署,部署的包、命令一模一样,操作10次就太费劲了。引入ansible,就可提升效率。
yum install ansible -y
安装后验证一下:
ansible --version
我们在节点服务器的/mnt
目录下,新建一个hosts文件:
// 新建或者编辑hosts文件
vi hosts
// 输入如下配置,并保存
[admin]
admin-01 ansible_connection=local
admin-02 ansible_connection=1xx.1xx.1xx.1
admin-03 ansible_connection=1xx.1xx.1xx.2
[h5]
h5-01 ansible_connection=local
h5-02 ansible_connection=1xx.1xx.1xx.1
h5-03 ansible_connection=1xx.1xx.1xx.2
从上述命令,我们可以推断出这么一个场景:
最终,我们的ansible配置如下:
由第二步,我们可以知道,ansible配置路径为 /mnt/hosts
,以此前我们用到的ansible命令为例
sh ‘ansible admin -i /mnt/hosts -m copy -a "src=/mnt/workspace/xxx/admin.tar.gz dest=/home/apps"‘
上述命令表示,将节点服务器的mnt/workspace/xxx/admin.tar.gz
(src=xxx)文件拷贝,批量上传到admin这个组里面的所有服务器的home/apps
路径下( dest=xxx)上去。admin这个组下面有哪些服务器?通过 -i /mnt/hosts
指定配置文件来读取。
sh ‘ansible admin -i /mnt/hosts -m shell -a "tar -zxvf /home/apps/admin.tar.gz -C /home/apps/"‘
上述命令,- m shell "[你的shell命令]"
,其实也很好理解。注意shell命令要有双引号。
想了解更多的ansible相关的信息,可点击Ansible中文权威指南。
点击构建之前一定要确保节点服务器 跟应用部署服务器之间是免密访问的(找运维人员处理即可)。 否者你的ansible命令就得重新写,带带上登录用户信息才行。
再者,我们一直没有强调节点服务器搭建nodejs环境,这个也是必备的。 至于何如安装nodejs环境,请参考Linux下nodejs环境搭建
我们打开新建的item页面,点击【build Now】
然后在构建任务列表,点击当前正在构建的任务
进入当前构建的详情页,--》【打开 Blue Ocean】
我们可以看到上面的几个步骤,就是我们流水线代码里面的几个stage,一一对应,模块层次分明。查看构建日志也方便,比传统的Publish over SSH远程部署方式要好很多。
作为一个前端开发,我们应该学会用工具,来提升提升日常开发的效率。本篇以最繁琐最笨的方式,来解决小公司小团队的自动化部署问题。掌握了这种基本的技能,朝着devOps又更进一步了。当然,技术无所谓优劣,能解决你的实际问题的,就是好的技术。
原文:https://www.cnblogs.com/ldld/p/14069784.html