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

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

工作流程:

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

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

  1. 我从 Master 创建了一个新分支(例如分支“A”)
  2. 如果我想向客户端显示我的更改,我将 A 合并到声明并推送它。
  3. 一旦完成我在 A 上的工作,我就会在 Master 上合并回 A 并推送 master
  4. 要实时发送更改,我将 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 所说的)

标签: git bash shell deployment workflow


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2014-02-08
    相关资源
    最近更新 更多