我有一些与CI和CD解决方案相关的问题。
Rails:4.2
Capistrano:3.4.0
该应用程序托管在私有服务器上。
现在,我已经通过终端实现了部署开发、暂存和生产的工作流程。我还将Circle CI与这些分支连接起来了。
我找不到如何设置Circle CI以使用Capistrano进行部署。Capistrano配置中的服务器用户已经配置好了。
我该如何给Circle CI deploy
用户提供SSH访问权限?因为现在我必须为用户提供密码。
我有一些与CI和CD解决方案相关的问题。
Rails:4.2
Capistrano:3.4.0
该应用程序托管在私有服务器上。
现在,我已经通过终端实现了部署开发、暂存和生产的工作流程。我还将Circle CI与这些分支连接起来了。
我找不到如何设置Circle CI以使用Capistrano进行部署。Capistrano配置中的服务器用户已经配置好了。
我该如何给Circle CI deploy
用户提供SSH访问权限?因为现在我必须为用户提供密码。
假设有一个非常基本的PHP应用程序。Apache配置指向/web
。以*
结尾的文件和文件夹被Git忽略。
__repo
|__.circleci
| |__config.yml
|__.git
|__tests
| |__features
| |__behat.yml
|__scripts
| |__deploy.sh
|__web
| |__node_modules*
| |__index.php
| |__styles.scss
| |__gulpfile.js
| |__styles.css*
|__.gitignore
在服务器上创建一个新用户,并将其添加到www-data
组。让它递归地拥有整个仓库。假设此用户名为repo-boss
。
$ chown -R repo-boss:www-data repo/
/home/repo-boss/.ssh/authorized_keys
中。现在假设deploy.sh
脚本包含以下非常基本的命令。
#!/usr/bin/env bash
# Set script to exit on errors.
set -e
# Get script's absolute location.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Change to repo root.
cd ${DIR};
cd ..
# Git pull.
git status
git pull
# Run Gulp.
cd web/
gulp sass
现在是关于CircleCI的 config.yml
文件,它可以使整个过程工作起来(当然,在至少一次将必要的东西拉到服务器上之后)。只有在测试成功完成后,deploy
才会运行。
version: 2
jobs:
build:
docker:
- image: circleci/php:7.1-apache-node-browsers
working_directory: ~/repo-name
steps:
- checkout
- run:
name: Whatever you need to get your app up and running.
command: |
command1 # Have a look at https://github.com/leymannx/drupal-circleci-behat/blob/develop/.circleci/config.yml for a more detailed example.
command3
command4
- run:
name: Run Tests.
command: |
behat --no-snippets -f pretty -o std
deploy:
machine:
enabled: true
working_directory: ~/repo-name
steps:
- checkout
- run:
name: Fix ssh Could not resolve hostname
command: |
ssh-keyscan 123.45.67.89 >> ~/.ssh/known_hosts # Add live server IP to known hosts.
ssh-keyscan 555.45.67.89 >> ~/.ssh/known_hosts # Dev server, too.
- add_ssh_keys: # add private SSH key from CircleCI account based on fingerprint.
fingerprints:
- "14:09:a1:b2:b3:c4:d5:e6:f7:g8:h9:81:"
- run:
name: Deploy master.
command: if [ "${CIRCLE_BRANCH}" == "master" ]; then ssh repo-boss@123.45.67.89 'cd /var/www/repo/scripts && . deploy.sh'; else echo "Skipped"; fi
- run:
name: Deploy develop.
command: if [ "${CIRCLE_BRANCH}" == "develop" ]; then ssh repo-boss@555.45.67.89 'cd /var/www/repo/scripts && . deploy.sh'; else echo "Skipped"; fi
workflows:
version: 2
build-and-deploy:
jobs:
- build:
filters:
branches:
only:
- develop
- master
- deploy:
requires:
- build
filters:
branches:
only:
- develop
- master
当然,您不需要使用工作流程。您也可以在基本的瀑布模型中实现此目标。但我更喜欢将构建和部署这两个部分拆分为不同的协调作业。