前端推送仓库后,触发jenkins部署到云服务器
文件如下
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
}
}
stage('打包') {
steps {
echo '打包压缩开始'
sh '''npm i
npm run build
cd ./dist
tar -zcvf dist.tar.gz *
echo 已生成压缩包'''
}
}
stage('传输文件到服务器') {
steps {
echo '上传...'
script {
def remote = [:]
remote.name = 'web-server'
remote.allowAnyHosts = true
remote.host = '121.5.111.188'
remote.port = 22
remote.user = 'root'
// 把「CODING 凭据管理」中的「凭据 ID」填入 credentialsId,而 id_rsa 无需修改
withCredentials([sshUserPrivateKey(credentialsId: "4c7da146-84", keyFileVariable: 'id_rsa')]) {
remote.identityFile = id_rsa
// 删除文件
sshCommand remote: remote, command: "rm -rf /zyw/web/vision_admin/*"
// SSH 上传文件到远端服务器
sshPut remote: remote, from: './dist/dist.tar.gz', into: '/zyw/web/vision_admin/'
// 解压缩
sshCommand remote: remote, command: "tar -zxvf /zyw/web/vision_admin/dist.tar.gz -C /zyw/web/vision_admin/"
sshCommand remote: remote, command: "rm -rf /zyw/web/vision_admin/dist.tar.gz"
}
}
echo '部署完成'
}
}
}
}
后端代码推送到仓库后,触发coding构建,通过ssh登陆远程云服务器,触发shell执行
def remote = [:]
remote.name = 'server'
remote.host = '121.5.111.188'
remote.user = 'root'
remote.password = 'z6*'
remote.allowAnyHosts = true
pipeline{
agent any
stages{
stage("任务申请"){
steps{
script{
sshCommand remote: remote, command: "/zyw/web/egg/auto.sh"
}
}
}
}
}
下面是踩坑经历,执行shell读不到环境变量问题
1.不认识node环境,需要把node路径软连接到/usr/sbin/
whereis node
/opt/node/bin/node
ln -s /opt/node/bin/node /usr/sbin/
2.不认识pm2命令,需要把pm2路径软连接到/usr/sbin/
ln -s /opt/node/bin/pm2 /usr/sbin/
- auto.sh拒绝执行,权限不够,需要给它加权限
chmod 777 -R auto.sh
下面是一些积淀
jenkins执行shell读不到/etc/profile以及用户下.bash_profile设置的环境变量
是因为执行机制造成的
什么是交互式shell和非交互式shell
交互式的shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
非交互式shell是bash script.sh这类的shell。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
什么是登录式shell和非登陆式shell
需要输入用户名和密码的shell就是登陆式shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。不输入密码的ssh是公钥打通的,某种意义上说也是输入密码的。
非登陆式的就是在登陆后启动bash等,即不是远程登陆到主机这种
如果一个bash是交互式登录Shell或者使用--login参数的非交互式Shell,首先会执行/etc/profile文件。然后按顺序查找~/.bash_profile, /.bash_login,/.profile,这三个文件谁存在并且有读权限就执行谁,然后后面的就不会再执行。
可以通过指定--noprofile参数来禁止这种默认行为。
当登录Shell退出之后,bash会读取~/.bash_logout文件并执行。
如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。
通过上面的分析,对于常用环境变量设置文件,整理出如下加载情况表:
1.png
jenkins默认情况下是属于non-login + non-interactive
eggjs的npm run stop会停用所有eggjs服务,所以服务器上部署了多个egg服务的话,可以一次停用,多次启用
cd /data/xiaokang/xiaokang-server
npm run stop
git checkout .
git pull
npm install
npm run start
cd /data/vision/egg
git checkout .
git pull
npm install
npm run start
网友评论