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

Posted

技术标签:

【中文标题】(Continuous Integration & GIT) - 如何简单地使用 bash 脚本【英文标题】:(Continuous Integration & GIT) - how to simply with bash script 【发布时间】:2016-10-06 19:28:06 【问题描述】:

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

工作流程:

我们有3个固定分支(staging/master/production) 每次推送到 stagingproduction 都会自动部署到登台/生产服务器。

我们使用 git 的方式如下: (假设我正在开发新功能“A”)

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

每次我必须部署实时/分期我的工作时,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 脚本都很陌生。 所以我想知道上面的工作流程/脚本是否可以?欢迎任何建议 (同时我很高兴将其作为资源分享)

【问题讨论】:

Jenkins 可以让您的工作变得轻松灵活。 我是一名开发人员,我想尽可能远离服务器管理的东西 :) 我不知道 J,但我认为这对我们的需求来说太多了,我觉得更容易编写一个 bash 脚本而不是安装一个应用程序研究/配置一个新应用程序......无论如何,我们使用 deployhq 来自动部署代码。 (无论如何谢谢) 更适合 Code Review SE 我只想对git merge --ff ...; if [ $? -ne 0 ]; then echo "ERROR: Could not MERGE"; return 1; fi 发表评论。不要那样做。将其简化为 if ! git merge --ff-only ...; then return 1; figit merge --ff-only || return 1 git merge 将打印出非常好的错误消息。如果您觉得确实需要在错误消息中添加更多内容,则必须将其写入 stderr 并使用echo 'ERROR: Could not MERGE' >&2 1. checkoutpush 都没有打印错误消息的代码。 2. $status$? 变量的用法似乎没有必要,即将:foo; s=$? ; if [ $s -ne 0 ] ; then bar ; baz ; fi 替换为:if ! foo ; then bar ; baz ; fi,甚至简单地:foo || bar ; baz ; (即 William Pursell 所说的) 【参考方案1】:

如果脚本能满足您的需要,那就太好了,您的 bash 技能也会变得更好。

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

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

可以使用 $v:?message 完成检查和失败的错误

不需要这些函数,也不需要在代码中添加返回值。

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

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

您必须自己尝试,在花时间欣赏每一种风格之前不要忽视其中一种风格。

【讨论】:

以上是关于(Continuous Integration & GIT) - 如何简单地使用 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

为什么我们迫切需要持续集成(Continuous Integration)

Docker-Compose +Jenkins +Github(续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD))

英语Continuous Integration怎么翻译?

DevOps - 持续集成(Continuous Integration)

利用Jenkins搭建iOS项目可持续化集成环境( Continuous Integration 简称CI)

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