(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
)
每次推送到 staging
或 production
都会自动部署到登台/生产服务器。
我们使用 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; fi
或 git merge --ff-only || return 1
git merge 将打印出非常好的错误消息。如果您觉得确实需要在错误消息中添加更多内容,则必须将其写入 stderr 并使用echo 'ERROR: Could not MERGE' >&2
1. checkout
或 push
都没有打印错误消息的代码。 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))
DevOps - 持续集成(Continuous Integration)