美文网首页
go项目部署脚本

go项目部署脚本

作者: arthur25 | 来源:发表于2019-01-16 10:38 被阅读26次

部署脚本

目录结构

bin # 目录,用于存放每次 build 之后存放的二进制文件
app.log # 用来记录的日志文件
log.sh # 实时查看日志
build.sh # 构建
run.sh # 启动某一次编译版本
start.sh # 启动最新版本,并且备份之前前一次运行的版本
shutdown.sh # 停止
rollback.sh # 回滚到上一版本

本例中的 GOPATH=”/go”

  • log.sh
tail -f -n 200 app.log # 实时查看最后 200 条日志的情况
  • build.sh
#!/bin/bash

# 项目地址,/go 在 GOPATH 里面
baseProjectDir="/go/src/monitor"

# targetDir 编译后的二进制文件目录
targetDir="bin"

# branch 编译的分支
branch="master"

pwd=`pwd`
# targetFile 编译后的输出文件名称
targetFile=`basename $pwd`

# buildPkg 编译的包名,main.go 所在的包
buildPkg="monitor"

# buildResult 编译结果
buildResult=""

if [ -n "$1" ]; then
branch="$1"
echo "Switch branch to ${branch}"
else
echo "Building Branch: ${branch}"
fi

gitPull() {
pushd .

cd "$baseProjectDir"
git checkout "$branch"
git pull

popd
}

goBuild() {
buildResult=`go build -o "${targetDir}/${targetFile}" "$buildPkg" 2>&1`

if [ -z "$buildResult" ]; then
buildResult="success"
fi
}

gitPull
goBuild

if [ "$buildResult" = "success" ]; then
cp ${targetDir}/${targetFile} ${targetFile}-new
chmod +x ${targetFile}-new
else
echo "build error $buildResult"
exit
fi

echo "All Complete"
  • run.sh
#!/bin/bash

# 以后台方式启动程序,并且将日志记录到 app.log
nohup ./$1 >> app.log &
  • start.sh
#!/bin/bash

pwd=`pwd`
target=`basename $pwd`
# kill
pid=`ps -C ${target} -o pid=`
if [ -n "$pid" ]; then
echo "Stopping old version, PID: ${pid}"
if [ "$1" = "-f" ]; then
# force shutdown
echo "Force shutdown..."
kill -9 $(ps -C ${target} -o pid=)
else
kill -s 2 $(ps -C ${target} -o pid=)
fi
# wait for program to stop
pid=`ps -C ${target} -o pid=`
while [ -n "$pid" ]; do
sleep 1
done
fi

# upgrade
if [ -f "${target}-new" ]; then
echo "Upgrading..."
if [ -f "${target}-backup" ]; then
backupdt=`date +%Y%m%d-%H`
mv "${target}-backup" "${target}-backup-${backupdt}"
fi

mv ${target} ${target}-backup
mv ${target}-new ${target}

echo "Upgrade Complete"
fi

# run
echo "Starting..."
./run.sh ${target}
echo "Done"
  • shutdown.sh
#!/bin/bash

pwd=`pwd`
target=`basename $pwd`

# kill
pid=`ps -C ${target} -o pid=`
if [ -n "$pid" ]; then

echo "Stopping old version, PID: ${pid}"
if [ "$1" = "-f" ]; then
# force shutdown
echo "Force shutdown..."
kill -9 $(ps -C ${target} -o pid=)
else
kill -s 2 $(ps -C ${target} -o pid=)
fi

# wait for program to stop
pid=`ps -C ${target} -o pid=`
while [ -n "$pid" ]; do
sleep 1
done

fi

echo "Done"

需要注意的是 kill -s 2 发送的是 Interrupt 中断信号,在项目中要有监听该信号的处理程序,eg:

package main

import (
"log"
"os"
"os/signal"

"github.com/robfig/cron"
)

func main() {
i := 0
c := cron.New()
spec := "*/3 * * * * ?"
c.AddFunc(spec, func() {
i++
log.Println("cron running:", i)
})
c.Start()

go signalListen()

select {}
}

func signalListen() {
c := make(chan os.Signal)
// 监听 os.Interrupt 并且退出程序
signal.Notify(c, os.Interrupt, os.Kill)
for {
<-c
os.Exit(0)
}
}
  • rollback.sh
#!/bin/bash

pwd=`pwd`
target=`basename $pwd`

# Kill running program
pid=`ps -C ${target} -o pid=`
if [ -n "$pid" ]; then

echo "Stopping old version, PID: ${pid}"
if [ "$1" = "-f" ]; then
# force shutdown
echo "Force shutdown..."
kill $(ps -C ${target} -o pid=)
else
kill -s 2 $(ps -C ${target} -o pid=)
fi

# wait for program to stop
pid=`ps -C ${target} -o pid=`
while [ -n "$pid" ]; do
sleep 1
done
fi

# Rollback
if [ -f "${target}-backup" ]; then
echo "Rolling back..."
if [ -f "${target}" ]; then
rm "${target}"
fi
mv ${target}-backup ${target}
echo "Rollback Complete"
fi

# run
echo "Starting..."
./run.sh ${target}
echo "Done"

相关文章

  • go项目部署脚本

    部署脚本 目录结构 bin # 目录,用于存放每次 build 之后存放的二进制文件app.log # 用来记录的...

  • 使用 Jenkins 部署 PHP Laravel 项目

    目标: 通过脚本手动部署项目到远程服务器 使用 GitHub webhook 在分支变更时自动部署 部署脚本 分析...

  • GO打包部署脚本

    GO打包部署脚本 $ Linux 打包 build_linux.bat $ Windows exe 打包 bu...

  • jenkins项目部署

    jenkins部署 项目部署shell脚本: Linux git\maven安装部署 服务器ssh免登 4.配置执...

  • Go项目如何部署到阿里云

    Golang 项目开发结束后,如何部署到阿里云ECS,go项目部署简单很多,不会像Java 那么复杂 需要配置很多...

  • springboot 通过代码自动生成pid

    springboot项目部署 平时我们在部署springboot打成jar方式部署得时候,大多数都会编写启动脚本,...

  • 2018-09-24

    project-复盘项目聚金融-快乐水组 环境 部署脚本 注:前端dev部署方式如下暂无 后端dev部署方式如下暂...

  • 在emacs中使用go

    在emacs中,只加载基础配置。项目配置用脚本加载。go语言使用go-langserver和lsp-mode,其他...

  • Jinkens 部署rails 服务

    最近把rails项目改为使用脚本部署后,每次发版都需要登录服务器,而且java项目使用的jenkins部署,故改为...

  • 使用pm2部署vue(node)项目

    1、准备 2、项目打包 3 配置启动脚本 4、部署、启动管理等

网友评论

      本文标题:go项目部署脚本

      本文链接:https://www.haomeiwen.com/subject/ecipdqtx.html