如何为Circle CI提供SSH访问我的服务器?

14

我有一些与CI和CD解决方案相关的问题。

Rails:4.2

Capistrano:3.4.0

该应用程序托管在私有服务器上。

现在,我已经通过终端实现了部署开发、暂存和生产的工作流程。我还将Circle CI与这些分支连接起来了。

我找不到如何设置Circle CI以使用Capistrano进行部署。Capistrano配置中的服务器用户已经配置好了。

我该如何给Circle CI deploy用户提供SSH访问权限?因为现在我必须为用户提供密码。

2个回答

9
使用SSH密钥进行身份验证。你也可以在自己的SSH会话中使用它,因为它比密码身份验证更方便和安全(这种情况很少发生!)。查看这篇关于如何设置SSH密钥的教程
然后,按照这里所述,在“项目设置 -> SSH权限”中粘贴您的私钥。你需要从你的本地机器复制私钥,其公钥已经添加到服务器上的“deploy”用户的密钥对中。CircleCI将能够访问您的服务器的SSH。
你可以将主机名设置为指向您的服务器或服务器IP的域,或者将其留空,以便此密钥用于所有主机。

我应该使用什么“hostname”? - davidwessman
如果您有指向服务器的域名,请使用它。否则,请使用IP地址。 - p4sh4
本地SSH密钥正常工作,但在Circle上仍然要求密码,尽管我已经为我的域名设置了SSH密钥。 - davidwessman
如果您觉得合适,也可以将其留空。根据文档的描述:“如果您将主机名字段留空,则私钥将用于所有主机”。 - p4sh4
1
谢谢你所有的帮助! - davidwessman
显示剩余5条评论

4

使用工作流构建和部署CircleCI版本2

假设有一个非常基本的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
  1. 在服务器上创建一个新用户,并将其添加到www-data组。让它递归地拥有整个仓库。假设此用户名为repo-boss

    $ chown -R repo-boss:www-data repo/

  2. 在本地机器上创建一个新的SSH密钥对。将私钥添加到CircleCI的后端,并查看我们稍后需要的指纹。将公钥添加到/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

当然,您不需要使用工作流程。您也可以在基本的瀑布模型中实现此目标。但我更喜欢将构建和部署这两个部分拆分为不同的协调作业。


这是 CircleCI 的版本 1 还是版本 2? - Moses Liao GZ
@MosesLiaoGZ - 一年前,我猜这应该是v1版本。现在我是这样做的:https://github.com/leymannx/drupal-circleci-behat/blob/develop/.circleci/config.yml(请查看底部的注释部分,并且您需要向Circle CI后端添加私钥,并将配对的公钥添加到服务器上的authorized_keys文件中)。 - leymannx
但最好还是遵循fabric文件的方式来做,因为在SSH进入服务器后,需要运行很多命令。 - Moses Liao GZ
@MosesLiaoGZ - 你在服务器上运行的命令取决于你。提供一个部署脚本,可以在SSH连接到服务器后执行。这个脚本可以包含任何你需要的命令。 - leymannx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接