代码之家  ›  专栏  ›  技术社区  ›  davidwessman

如何让Circle CI SSH访问我的服务器?

  •  14
  • davidwessman  · 技术社区  · 9 年前

    我对CI和CD解决方案有一些疑问和问题。

    轨道:4.2

    Capistrano:3.4.0

    应用程序托管在专用服务器上。

    现在,我有了通过终端部署开发、登台和生产的工作流程。 我还联系了Circle CI,在这些分支上工作得很好。

    我找不到如何设置Circle CI以使用Capistrano进行部署。 在Capistrano配置中使用服务器用户配置所有内容。

    我如何让Circle CI SSH访问我的 deploy 使用者因为现在我必须为用户提供密码。

    2 回复  |  直到 9 年前
        1
  •  9
  •   p4sh4    9 年前

    使用SSH密钥进行身份验证。您也可以将它用于自己的SSH会话,因为它更方便和安全(罕见的情况!)而不是密码验证。退房 this tutorial 如何设置。

    然后,将您的私钥粘贴到 Project Settings -> SSH Permissions ,如所述 here 。您需要将私钥从本地计算机复制到其公钥添加到 deploy 服务器上的用户。然后,CircleCI将具有对服务器的SSH访问权限。

    您可以将主机名设置为指向服务器或服务器IP的域,或将其留空,以便在所有主机中使用此密钥。

        2
  •  4
  •   leymannx    6 年前

    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
    

    当然,您不需要使用工作流。您也可以在基本瀑布中实现这一点。但我更喜欢将这两个部分拆分成不同的协同工作。