这方面的探索到一段落。封装好之后,可以直接从web调用啦。
gitlab中的文件结构
2021-01-12 22_28_53-demo _ go-demo · GitLab.png
一,settings里定义好上传下载文件服务器。
FILE_UP_SERVER = 'http://192.168.1.111:9001/upload-file'
FILE_DOWN_SERVER = 'http://192.168.1.111:9002'
二,.gitlab-ci.yml里接受变量
stages:
- package
- test
- release
go_package:
image: golang
stage: package
only:
- triggers
script:
- echo ${APP_NAME}
- echo ${RELEASE}
- echo ${BUILD_SCRIPT}
- echo ${DEPLOY_SCRIPT}
- echo ${FILE_UP_SERVER}
- go version
- sh ${BUILD_SCRIPT}
- curl -F "file=@${DEPLOY_SCRIPT}" -F "token=654321" -F "uploadSubPath=/${APP_NAME}/${RELEASE}" ${FILE_UP_SERVER}
- curl -F "file=@go-demo.tar.gz" -F "token=654321" -F "uploadSubPath=/${APP_NAME}/${RELEASE}" ${FILE_UP_SERVER}
tags:
- runInDocker
三,编译脚本script/build.sh
#!/bin/sh
echo 'beging build demo-go app...'
go build -o bin/go-demo main/main.go
tar -zcvf go-demo.tar.gz env/ bin/
echo 'finish build demo-go app...'
四,部署启停脚本script/bifang.sh
#!/bin/sh
# release发布单参数
RELEASE=$1
# env环境参数
ENV=$2
# action服务启停及部署参数
ACTION=$3
# app部署根目录
APP_ROOT_HOME="/app"
# app名称
APP_NAME="go-demo"
# port服务端口参数
PORT="9090"
# 可执行文件所有目录
BIN_PATH="./bin"
# app软件包名
PACKAGE_NAME="go-demo"
# app压缩包名参数
ZIP_PACKAGE_NAME="go-demo.tar.gz"
# app软件包保存根目录
LOCAL_ROOT_STORE="/var/ops"
# repo_url构件仓库地址
REPO_URL="http://192.168.1.111:9002"
APP_HOME="$APP_ROOT_HOME/$APP_NAME"
LOCAL_STORE="$LOCAL_ROOT_STORE/$APP_NAME/current"
LOCAL_BACK="$LOCAL_ROOT_STORE/$APP_NAME/backup"
APP_URL="$REPO_URL/$APP_NAME/$RELEASE/$ZIP_PACKAGE_NAME"
LOG="$APP_HOME/$APP_NAME.log"
RETVAL=0
pid_of_app() {
pgrep -f ${PACKAGE_NAME}
}
# 先建立相关目录,备份上次部署的软件包,再从构件服务器上获取软件包,保存到指定目录。
# 只支持一次回滚,想回滚多次,最好再重新部署之前的发布单
fetch() {
if [ ! -d $APP_HOME ];then
mkdir -p $APP_HOME
fi
if [ ! -d $LOCAL_STORE ];then
mkdir -p $LOCAL_STORE
fi
if [ ! -d $LOCAL_BACK ];then
mkdir -p $LOCAL_BACK
fi
# 删除上上次备份的软件包(无多次回滚)
if [ -f "$LOCAL_BACK/$ZIP_PACKAGE_NAME" ];then
mv $LOCAL_BACK/$ZIP_PACKAGE_NAME /tmp/
fi
# 备份上次的软件包
if [ -f "$LOCAL_STORE/$ZIP_PACKAGE_NAME" ];then
mv $LOCAL_STORE/$ZIP_PACKAGE_NAME $LOCAL_BACK/$ZIP_PACKAGE_NAME
fi
# 获取本次的部署包
wget -q -P $LOCAL_STORE $APP_URL
echo "$APP_NAME prepare success."
}
# 回滚,从BACKUP目录解压恢复
rollback() {
rm -rf $APP_HOME/*
tar -xzvf $LOCAL_BACK/$ZIP_PACKAGE_NAME -C $APP_HOME
echo "$APP_NAME rollback success."
}
# 清除目录已有文件,将CURRENT解压到运行目录
deploy() {
rm -rf $APP_HOME/*
tar -xzvf $LOCAL_STORE/$ZIP_PACKAGE_NAME -C $APP_HOME
echo "$APP_NAME deploy success."
}
#启动应用,传递了port和env参数
start() {
pid=`pid_of_app`
if [ -n "$pid" ]; then
echo "Project: $APP_NAME (pid $pid) is running, kill first or restart."
RETVAL=1
fi
start=$(date +%s)
echo -n $"Starting $APP_NAME: "
cd "$APP_HOME"
#此处为真正启动命令
nohup $BIN_PATH/$PACKAGE_NAME >/dev/null 2>&1 &
RETVAL=$?
if [ $RETVAL = 0 ]; then
end=$(date +%s)
echo "start success in $(( $end - $start )) seconds. \n"
else
echo "Start failure, please check LOG. \n"
fi
}
stop() {
printf "Stopping $APP_NAME: "
pid=`pid_of_app`
# 先杀进程,如果还有进程,则再杀10次,每次隔一秒
[ -n "$pid" ] && kill -9 $pid
echo $pid
RETVAL=$?
cnt=10
while [ $RETVAL = 0 -a $cnt -gt 0 ] &&
{ pid_of_app > /dev/null ; } ; do
sleep 1
((cnt--))
done
printf "stop success\n"
}
status() {
pid=`pid_of_app`
if [ -n "$pid" ]; then
echo "APP_NAME: $APP_NAME (pid $pid) is success running..."
else
echo "APP_NAME: $APP_NAME is not running."
RETVAL=1
fi
}
case "$ACTION" in
fetch)
fetch
;;
deploy)
deploy
;;
rollback)
rollback
;;
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {3 args}"
RETVAL=1
esac
exit $RETVAL
五,gitlab封装
import gitlab
import time
def gitlab_trigger(git_url, git_access_token,
project_id, app_name, release,
git_branch, git_trigger_token,
build_script, deploy_script, file_up_server):
git_url = git_url
git_access_token = git_access_token
gl = gitlab.Gitlab(git_url, private_token=git_access_token)
project = gl.projects.get(project_id)
pipeline = project.trigger_pipeline(git_branch,
git_trigger_token,
variables={"RELEASE": release,
'APP_NAME': app_name,
'BUILD_SCRIPT': build_script,
'DEPLOY_SCRIPT': deploy_script,
'FILE_UP_SERVER': file_up_server})
while pipeline.finished_at is None:
pipeline.refresh()
time.sleep(1)
return pipeline
六,gitlab调用
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bifangback.settings")
django.setup()
from django.conf import settings
from cmdb.models import App
from utils.gitlab import gitlab_trigger
app = App.objects.get(name='go-demo')
git_url = app.git.git_url
git_access_token = app.git.git_token
git_trigger_token = app.git_trigger_token
project_id = app.git_app_id
app_name = app.name
release = '202101090245XX'
git_branch = 'master'
build_script = app.build_script
deploy_script = app.deploy_script
file_up_server = settings.FILE_UP_SERVER
job_pipeline = gitlab_trigger(git_url, git_access_token,
project_id, app_name, release,
git_branch, git_trigger_token,
build_script, deploy_script, file_up_server)
print(job_pipeline)
print(job_pipeline.id)
print(job_pipeline.status)
print(job_pipeline.ref)
print(job_pipeline.web_url)
print(job_pipeline.duration)
七,gitlab调用返回
D:\Code\bifang\bifangback\venv\Scripts\python.exe D:/Code/bifang/bifangback/deploy/gitlab_views.py
<class 'gitlab.v4.objects.ProjectPipeline'> => {'id': 25, 'sha': 'd8058c5958b43b050f5f72fb58f196f132e86d80', 'ref': 'master', 'status': 'success', 'created_at': '2021-01-12T14:33:07.636Z', 'updated_at': '2021-01-12T14:33:29.752Z', 'web_url': 'http://192.168.1.211:8180/demo/go-demo/-/pipelines/25', 'before_sha': '0000000000000000000000000000000000000000', 'tag': False, 'yaml_errors': None, 'user': {'id': 1, 'name': 'Administrator', 'username': 'root', 'state': 'active', 'avatar_url': 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon', 'web_url': 'http://192.168.1.211:8180/root'}, 'started_at': '2021-01-12T14:33:09.623Z', 'finished_at': '2021-01-12T14:33:29.734Z', 'committed_at': None, 'duration': 20, 'coverage': None, 'detailed_status': {'icon': 'status_success', 'text': 'passed', 'label': 'passed', 'group': 'success', 'tooltip': 'passed', 'has_details': False, 'details_path': '/demo/go-demo/-/pipelines/25', 'illustration': None, 'favicon': '/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png'}}
25
success
master
http://192.168.1.211:8180/demo/go-demo/-/pipelines/25
20
Process finished with exit code 0
八,salt封装
from saltypie import Salt
def salt_cmd(salt_url, salt_user, salt_pwd, eauth,
target_list, script_url, release, env, cmd):
salt = Salt(
url=salt_url,
username=salt_user,
passwd=salt_pwd,
trust_host=True,
eauth=eauth
)
arg_list = [script_url, '{} {} {}'.format(release, env, cmd)]
exe_return = salt.execute(
client=Salt.CLIENT_LOCAL,
target=target_list,
tgt_type='list',
fun='cmd.script',
args=arg_list,
)
# print(exe_return)
return exe_return['return']
九,salt调用
from saltypie import Salt
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bifangback.settings")
django.setup()
from django.conf import settings
from cmdb.models import App
from cmdb.models import Env
from utils.saltstack import salt_cmd
env = Env.objects.get(name='dev')
app = App.objects.get(name='go-demo')
salt_url = env.salt.salt_url
salt_user = env.salt.salt_user
salt_pwd = env.salt.salt_pwd
eauth = env.salt.eauth
target_list = ['192.168.1.211', '192.168.1.212']
app_name = app.name
release = '202101090245XX'
deploy_script = app.deploy_script
# 部署脚本在上传时,只取了最后的文件名,目录名被忽略,这里也要作转换
script = os.path.basename(deploy_script)
script_url = '{}/{}/{}/{}'.format(settings.FILE_DOWN_SERVER, app_name, release, script)
cmd = 'status'
ret = salt_cmd(salt_url, salt_user, salt_pwd, eauth,
target_list, script_url, release, env, cmd)
for server in ret:
for ip, detail in server.items():
print(ip, detail['retcode'], detail['stdout'], detail['stderr'], detail['pid'])
十,salt调用返回
D:\Code\bifang\bifangback\venv\Scripts\python.exe D:/Code/bifang/bifangback/deploy/salt_views.py
192.168.1.212 0 APP_NAME: go-demo (pid 3748) is success running... 3802
192.168.1.211 0 APP_NAME: go-demo (pid 18840) is success running... 20580
Process finished with exit code 0
十一,gitlab编译过程
2021-01-12 22_35_18-悬浮球.png
十二,文件服务器结构
2021-01-12 22_33_44-_go-demo_202101090245XX.png
十三,部署软件启动
2021-01-12 22_35_49-192.168.1.211_9090.png
网友评论