【问题标题】:Gitlab-ci configure docker runner for deployment with SSH keysGitlab-ci 配置 docker runner 以使用 SSH 密钥进行部署
【发布时间】:2019-01-07 16:39:26
【问题描述】:

我正在尝试使用 gitlab-ci 和 capistrano 来部署我的 symfony 应用程序。但是我无法通过将密钥注入docker来使用SSH进行部署,脚本在连接时不断提示输入密码。我正在使用 gitlab 的本地实例。

在 gitlab 的 SSH_PRIVATE_KEY 私有变量中,我添加了 git 用户的私有密钥,在 SSH_SERVER_HOSTKEYS 中,ssh-keyscan -H 192.168.0.226 命令的结果。
在部署的 .ssh 文件夹中的文件 authorized_keys 中,我放置了 git 用户的公钥。

这里是配置文件:

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, 'git@gitlab.local: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"

production.rb:

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

可能出了什么问题?我尝试将 forward_agent 设置为 true,但它不起作用。

如果我手动构建 docker 容器并安装所有依赖项,则无需输入密码即可建立 ssh 连接...

这是错误:

编辑:

在运行器配置中有什么要添加的吗?这里是:

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]

【问题讨论】:

    标签: symfony docker ssh capistrano gitlab


    【解决方案1】:

    bash ci/ssh_inject.sh 不起作用,因为它在不同的 shell 中运行。使用:

    source ./ci/ssh_inject.sh

    改为。

    【讨论】:

      【解决方案2】:

      您需要使用gitlab-runner 用户在 gitlab 运行器上创建一个 ssh 密钥。

      然后在authorized_keys文件中将此密钥的公钥添加到您的服务器。

      【讨论】:

      • 感谢您的回答。但这不起作用,我在部署用户的文件 authorized_keys 中添加了公钥,尝试删除 ssh_inject.sh 调用,用 gitlab-runner 私钥更改了 SSH_PRIVATE_KEY 但它仍然要求输入密码。我可以在没有密码的 gitlab-runner 用户的终端上执行 ssh deploy@192.168.0.226 。我想我错过了什么。
      • 我应该为跑步者使用哪个执行者?并行、ssh、virtualbox、docker+machine、docker-ssh+machine、docker、docker-ssh、shell、kubernetes?以前我使用的是 docker
      • 奇怪。对于我的纯部署运行器,我使用 shell 进行 ci 测试 docker+machine
      【解决方案3】:

      通过将 ssh_inject.sh 内容移动到 gitlab-ci.yml 中解决。

      如果有人知道它为什么需要在 gitlab-ci.yml 中,我想了解。

      【讨论】:

      • 如果你使用 docker,你必须在 docker 容器内操作,但这应该在 .gitlab-ci 和你的 cap skript 中工作。但老实说,我没有看到将部署运行器容器化的意义——如果你使用运行器进行部署和其他 (ci) 东西,那就是另一个故事了。
      • 我更喜欢使用 docker 进行更新。但是使用shell 似乎很棒!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2022-12-12
      • 2015-12-21
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多