2017-04-13 2 views
0

Ich versuche gitlab-ci und capistrano zu verwenden, um meine Symfony-Anwendung bereitzustellen. Aber ich kann nicht mithilfe von SSH bereitstellen, indem ich Schlüssel in den Andockfenster einfüge. Das Skript fordert bei der Verbindung weiterhin zur Passworteingabe auf. Ich verwende eine lokale Instanz von gitlab.Gitlab-ci konfigurieren docker runner für den Einsatz mit SSH-Schlüssel

In SSH_PRIVATE_KEY privaten Variable Gitlab, habe ich den privaten Schlüssel des git Benutzers und in SSH_SERVER_HOSTKEYS, das Ergebnis des ssh-keyscan -H 192.168.0.226 Befehl.
In Datei authorized_keys aus dem Ordner .ssh deploy, ich den öffentlichen Schlüssel des Git-Benutzers.

Hier sind die Konfigurationsdateien:

Gitlab-ci.yml:

image: php:7.1 

cache: 
    paths: 
    - vendor/ 

before_script: 
# Install dependencies 
- bash ci/docker_install.sh > /dev/null 
- bash ci/ssh_inject.sh 

stages: 
    - deploy 

deploy: 
    stage: deploy 
    script: 
    - apt-get install ruby-full -yqq 
    - gem install capistrano -v 3.8.0 
    - gem install capistrano-symfony 
    - cap production deploy 
    environment: 
    name: production 
    url: http://website.com 
    only: 
    - master 

ssh_inject.sh:link

#!/bin/bash 

set -xe 

# Install ssh-agent if not already installed, it is required by Docker. 
# (change apt-get to yum if you use a CentOS-based image) 
which ssh-agent || (apt-get update -y && apt-get install openssh-client -y) 

# Run ssh-agent (inside the build environment) 
eval $(ssh-agent -s) 

# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store 
ssh-add <(echo "$SSH_PRIVATE_KEY") 

mkdir -p ~/.ssh 
[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts 

deploy.rb:

# config valid only for current version of Capistrano 
lock '3.8.0' 

set :application, 'symfony' 
set :repo_url, '[email protected]:symfony.git' 

# Default deploy_to directory is /var/www/my_app_name 
set :deploy_to, '/home/symfony' 

set :symfony_env, "prod" 

set :composer_install_flags, '--no-dev --prefer-dist --no-interaction --optimize-autoloader' 

set :symfony_directory_structure, 3 
set :sensio_distribution_version, 5 

# symfony-standard edition directories 
set :app_path, "app" 
set :web_path, "web" 
set :var_path, "var" 
set :bin_path, "bin" 

set :app_config_path, "app/config" 
set :log_path, "var/logs" 
set :cache_path, "var/cache" 

set :symfony_console_path, "bin/console" 
set :symfony_console_flags, "--no-debug" 

# asset management 
set :assets_install_path, "web" 
set :assets_install_flags, '--symlink' 

# Share files/directories between releases 
set :linked_files, %w(app/config/parameters.yml) 
set :linked_dirs, %w(web/uploads) 

# Set correct permissions between releases, this is turned off by default 
set :permission_method, false 
set :file_permissions_paths, ["var/logs", "var/cache"] 
set :file_permissions_users, ["apache"] 

before "deploy:updated", "deploy:set_permissions:acl" 
after "deploy:updated", "symfony:assetic:dump" 

und production.rb:

server '192.168.0.226', user: 'deploy', roles: %w{app db web} 

Was könnte falsch sein? Ich habe versucht, forward_agent auf true zu setzen, aber es funktioniert nicht immer.

Wenn ich die Docker Behälter manuell und installieren Sie alle Abhängigkeiten aufbauen kann die SSH Verbindung ohne zu fragen, für Passwort festgelegt werden ...

Hier ist der Fehler: password error

EDIT:

Gibt es etwas in der Läuferkonfiguration hinzuzufügen? Hier ist sie:

concurrent = 1 
check_interval = 0 

[[runners]] 
    name = "Docker runner" 
    url = "http://gitlab.local/ci" 
    token = "mytoken" 
    executor = "docker" 
    [runners.docker] 
    tls_verify = false 
    image = "php:7.1" 
    privileged = false 
    disable_cache = false 
    volumes = ["/cache"] 
    [runners.cache] 

Antwort

0

von ssh_inject.sh Inhalt in Gitlab-ci.yml Bewegen gelöst werden.

Wenn jemand eine Idee darüber hat, warum es in gitlab-ci.yml sein muss, würde ich gerne verstehen.

+0

Wenn du docker verwendest, musst du im docker Container agieren, aber das sollte in .gitlab-ci und in deinem cap Skript funktionieren. Aber um ehrlich zu sein, ich sehe keinen Punkt in Container ein Deployment Runner - andere Geschichte, wenn Sie den Läufer für die Bereitstellung und andere (ci) Zeug verwenden. – Rufinus

+0

Ich bevorzuge Docker für Updates Zweck zu verwenden. Aber 'shell' zu verwenden, scheint großartig! –

0

Sie benötigen einen SSH-Schlüssel auf dem Gitlab Läufer mit dem gitlab-runner Benutzer zu erstellen.

Dann fügen Sie den Pubkey dieses Schlüssels zu Ihrem Server in der Datei authorized_keys.

+0

Danke für Ihre Antwort. Aber das funktioniert nicht, ich habe den öffentlichen Schlüssel in der Datei authorized_keys des deploy-Benutzers hinzugefügt, habe versucht, den Aufruf ssh_inject.sh zu entfernen, den SSH_PRIVATE_KEY mit dem privaten Schlüssel gitlab-runner geändert, fragt aber immer noch nach dem Passwort. Ich kann ssh [email protected] von einem Terminal mit Gitlab-Runner-Benutzer ohne Passwort tun. Ich denke, ich vermisse etwas. –

+0

Welchen Executor sollte ich für den Läufer verwenden? Parallelen, ssh, virtualbox, docker + maschine, docker-ssh + maschine, docker, docker-ssh, shell, kubernetes? Zuvor war ich mit Docker –

+0

seltsam. Für meine pure Deployment Runner benutze ich 'shell' für ci Tests' docker + machine' – Rufinus

Verwandte Themen