在合并到主分支后部署到服务器

85次阅读
没有评论

问题描述

目前使用Travis CI进行持续部署。所有的推送都会发送到staging服务器,而合并到主分支则会发送到production服务器。问题是,在合并请求被接受之前,部署到production服务器的操作已经完成。虽然持续集成测试必须全部通过,但部署操作在手动代码审查之前就已经进行了。

问题是,有没有一种轻量级的方法,可以确保只有在合并请求被接受后才进行到production服务器的部署?

以下是用于部署的参考代码:

#!/bin/bash
# exit with nonzero exit code if anything fails
set -e
# Add the SSH login key
chmod 600 veleda-deploy-key
mv veleda-deploy-key ~/.ssh/id_rsa
# Register the Veleda staging and production server SSH keys
echo '|1|BqdQKtUnA/AtCT/p2M7wgMq3wlY=|lH39cRtAE64wd6EG3ry2J9ewXic= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBH3antqwy3D4NVVfHQX3SQc/g4wl/SAVC9w9QEry7hhQmB0SJIprwNAq8Hy2DzVCS7kTj/q7fCiiL7oAznrax+0=' >> $HOME/.ssh/known_hosts
echo '|1|+Z7oOsZ+zdL6u8o8VSWp+bRzd2g=|XMw2HyJIHoekOYlJYw1n75plL2E= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCJ/fa/mr577/qCuRXqUNccfmhpUtmi46LSyE7nDbOgxv8kZFs7yQ/sh6TM5npR+ZIbe9I0qmdvA+cE1QfvN21E=' >> $HOME/.ssh/known_hosts
# Select the remote to push to depending on the branch
if [ $TRAVIS_BRANCH != 'production' ] ; then
    echo "Pushing to staging"
    export REMOTE=staging.veleda.io
else
    echo "Pushing to production"
    export REMOTE=veleda.io
fi
# Push to the remote server
git remote add deploy "deploy@$REMOTE:/home/deploy/repo/"
git push -f deploy $TRAVIS_BRANCH
# Unpack and update the Docker services
ssh -t deploy@"$REMOTE" "\    
mkdir -p veleda &&    
git --work-tree=./veleda --git-dir=./repo checkout -f $TRAVIS_BRANCH &&    
cd veleda &&    
./start.sh"

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

可以使用Travis CI的条件构建功能来实现只有在合并到主分支后才进行部署的需求。以下是一个示例配置:

jobs:
  include:
    - if: branch = master

或者使用阶段(stages)来实现:

stages:
  - name: deploy
    if: branch = master

在其他项目中,我更喜欢只部署标签(tags),以强制执行Git Flow(只有创建了标签才能部署到production)。以下是一个示例配置:

stages:
  - name: deploy
    if: tag =~ ^v1

还可以尝试在脚本部分使用if条件,例如:

script:
  - if [ $TRAVIS_BRANCH = 'master' ]; then
      echo "Deploying to production";
      # 在这里添加部署到production的命令
    fi

方案2

请注意,这是一种自定义的解决方案,可能会增加复杂性,并且需要确保分支和合并请求的设置正确。
另一种方法是创建一个长期存在的production分支,并且只有在创建合并请求到该分支后才部署到production服务器。这样,可以在feature分支上进行代码审查,而不需要推送到production。当主分支等同于production服务器上的版本时,这种方法非常适用。

如果使用这种方法,可以在条件中添加type子句,以避免随机的合并请求导致部署。例如:if: branch = master AND type = push

请注意,这种方法需要确保分支和合并请求的设置正确,以避免意外的部署。

正文完