Как дать Circle CI SSH доступ к моему серверу?

У меня есть некоторые вопросы и проблемы с моим решением CI и CD.

рельсы: 4.2

Капистрано: 3.4.0

приложение размещается на отдельном сервере.

прямо сейчас у меня есть рабочий процесс, работающий с развертыванием разработки, постановки и производства через терминал. Я также подключил Circle CI, хорошо работающий на этих ветвях.

Я не могу найти, как настроить Circle CI для использования Capistrano для развертывания. Все настроено пользователь сервера в конфигурации Capistrano.

Как дать Circle CI SSH доступ к my deploy пользователей? Потому что теперь я должен предоставить пароль для пользователя.

2 ответов


используйте ключи SSH для аутентификации. Вы также можете использовать его для своих собственных сеансов SSH, потому что это более удобно и безопасно (редкий случай!) чем аутентификация пароля. Проверьте в этом уроке о том, как установить его.

затем вставьте свой закрытый ключ в CircleCI в Project Settings -> SSH Permissions, как описано здесь. Вам нужно скопировать закрытый ключ с локального компьютера из пары ключей, открытый ключ которой вы добавили в deploy пользователей на сервере. CircleCI тогда будет иметь SSH-доступ к вашему серверу.

вы можете установить имя хоста в домен, который указывает на ваш сервер или IP вашего сервера, или оставить его пустым, чтобы этот ключ использовался во всех хостах.


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

и теперь приходит это заставляет все это работать (после того, как вы хотя бы раз вытащили необходимый материал на сервер, конечно). 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

конечно, вам не нужно использовать рабочие процессы. Вы также можете достичь этого в базовом водопаде. Но мне гораздо больше нравилось разбивать две части на разные согласованные работы.