美文网首页
bifangback-封装gitlab,salt函数,进行脚本化

bifangback-封装gitlab,salt函数,进行脚本化

作者: 万州客 | 来源:发表于2021-01-12 22:36 被阅读0次

这方面的探索到一段落。封装好之后,可以直接从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

相关文章

网友评论

      本文标题:bifangback-封装gitlab,salt函数,进行脚本化

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