繁体   English   中英

(Continuous Integration & GIT) - 如何简单地使用 bash 脚本

[英](Continuous Integration & GIT) - how to simply with bash script

在我的公司中,我遵循以下工作流程(我认为它可以定义为一种“持续集成”)

工作流程:

  • 我们有 3 个固定分支( staging / master / production
  • 每次推送到stagingproduction自动部署到暂存/生产服务器。

我们以如下方式使用 git:
(假设我正在研究新功能“A”)

  1. 我从 Master 创建了一个新分支(例如分支“A”)
  2. 如果我想向客户端显示我的更改,我会将 A 合并到声明并推送它。
  3. 完成我在 AI 上的工作后,在 Master 上合并回 A 并推送 master
  4. 实时发送更改我在生产分支中合并 Master 并推送生产

我发现git checkout ...非常无聊/耗时git checkout ... git pull .. bla bla 每次我必须实时部署/分阶段我的工作。

所以我制作了以下 bash 脚本,目的是将分支 A 部署到单个命令deploy.sh live A的过程简单化

#!/bin/bash
function merge() {  
    SOURCE=$1
    DEST=$2

    echo ''
    echo "--- Merging $SOURCE with $DEST ---" 
    echo "--> Checkout $DEST ..." 
    git checkout $DEST

    echo "--> Pull $DEST ..."
    git pull --ff-only origin $DEST
    if [ $? -ne 0 ]
    then
        echo "ERROR: Could not PULL" 
        return 1
    fi

    echo "--> Merging $SOURCE with $DEST ..."
    # --ff-only trigger errors if merge/pull is not possible 
    git merge --ff-only $SOURCE --no-edit  
    if [ $? -ne 0 ]
    then
        echo "ERROR: Could not MERGE"
        return 1
    fi

    echo "--> Push $DEST ..."
    git push origin $DEST
    return 0
}

function deploy() {
    MODE=$1
    SOURCE_BRANCH=$2

    echo ''
    echo "### START ###"
    echo ''
    echo "--- Pull changes from Master ---"
    git checkout $SOURCE_BRANCH
    git pull --progress --no-edit --no-stat -v --progress origin master


    merge $SOURCE_BRANCH 'staging'
    status=$?
    if [ $status -ne 0 ]
    then
        echo "ERROR: STEP 1" >&2
        exit 1
    fi

    if [ $MODE = "live" ]
    then
        merge $SOURCE_BRANCH 'master'
        status=$?
        if [ $status -ne 0 ]
        then
            echo "ERROR: STEP 2"
            return 1
        fi

        merge 'master' 'production'
        status=$?
        if [ $status -ne 0 ]
        then
            echo "ERROR: STEP 3"
            return 1
        fi
    fi

    echo ''
    echo "### END ###"
    echo ''
}

MODE=$1;
SOURCE_BRANCH=$2;

if [ -z "$MODE"  -o -z "$SOURCE_BRANCH" ]
then
    echo "Usage:"
    echo ""
    echo  "MODE BRANCH_NAME (MODE: live|staging)"
else
    if git show-ref --verify --quiet "refs/heads/$SOURCE_BRANCH";
    then
        deploy $MODE $SOURCE_BRANCH
    else
        echo ''
        echo "Error: Branch $SOURCE_BRANCH not found"
    fi
fi

问题:

我对 GIT 和 BASH 脚本都很陌生。 所以我想知道上面的工作流程/脚本是否可以? 欢迎任何推荐
(同时我很高兴将此作为资源分享)

如果脚本可以满足您的需求,那就很好了,您的 bash 技能也会变得更好。

恕我直言,整件事可以写成 10 行,会更好,但这是一个品味问题。

除了 ifs,您在之前的评论中得到了建议,不需要三行来回显状态、echo -e "\\n..." 或 printf,这减少了大约 10% 的行。

可以使用 ${v:?message} 完成检查和失败并出现错误

不需要这些函数,也不用返回来填充您的代码。

这是从 pytonish/任何编码风格到更紧凑的 bash 风格的一步。 不是每个人都喜欢它,也不是觉得它很好,所以你必须自己尝试。

例如,我用 5 行 bash 重写了 250 行(过于清晰)python; windows/python 同事认为这还不够清楚(但后来他不能写 bash)另外 5 条额外的注释行对他来说更好; 另一位同事发现它好多了(不滚动很长时间是一个原因)。

在花时间欣赏每一种风格之前,您必须亲自尝试并且不要忽视一种风格或另一种风格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM