如何创建自定义Docker映像并将其用作GitLab CI / CD服务?

时间:2019-08-07 14:10:25

标签: docker gitlab gitlab-ci cloudfoundry ssh-tunnel

我正在使用CloudFoundry部署我的服务,而E2E测试是通过Postman(CLI上的Newman)完成的。情况是,我无法直接从GitLab CI / CD访问某些服务,因此我需要创建一个SSH隧道(cf ssh),以便能够在CI / CD管道中通过隧道执行邮递员集合。

这是我的Dockerfile:

FROM my-private-registry/cf-cli-image

COPY ./images/cf-ssh-tunnel-service/docker-entrypoint.sh /docker-entrypoint.sh

EXPOSE 9001

ENTRYPOINT ["/docker-entrypoint.sh"]

这是docker-entrypoint.sh

#!/bin/bash
set -eo pipefail

# usage: file_env VAR [DEFAULT]
#    ie: file_env 'XYZ_DB_PASSWORD' 'example'
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
#  "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
file_env() {
    local var="$1"
    local fileVar="${var}_FILE"
    local def="${2:-}"
    if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
        echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
        exit 1
    fi
    local val="$def"
    if [ "${!var:-}" ]; then
        val="${!var}"
    elif [ "${!fileVar:-}" ]; then
        val="$(< "${!fileVar}")"
    fi
    export "$var"="$val"
    unset "$fileVar"
}

file_env 'CF_SSH_SERVICE_APP_NAME'
file_env 'CF_SSH_SERVICE_REMOTE_PORT' 8080
CF_SSH_SERVICE_LOCAL_PORT=9001

echo "Logging in ..."
cf login -a $CF_URL -u $CF_DEPLOY_USER -p $CF_DEPLOY_PASSWORD -o $CF_ORG -s $CF_SPACE --skip-ssl-validation
cf target

echo "Creating the CF SSH Tunnel to $CF_SSH_SERVICE_APP_NAME:$CF_SSH_SERVICE_REMOTE_PORT though the local port $CF_SSH_SERVICE_LOCAL_PORT."
cf ssh -k -T -N $CF_SSH_SERVICE_APP_NAME -L $CF_SSH_SERVICE_LOCAL_PORT:0.0.0.0:$CF_SSH_SERVICE_REMOTE_PORT
echo "DONE!"

最后,这就是我在GitLab管道中将图像用作服务的方式:

stages:
    - e2e-test

newman:test:development:
  image: my-private-registry/curl-image
  stage: e2e-test
  services:
    - name: my-private-registry/cf-ssh-tunnel-service:latest
      alias: cf-ssh-tunnel-service
  variables:
    CF_SSH_SERVICE_APP_NAME: $APP_NAME
  script:
    - curl http://cf-ssh-tunnel-service:9001/endpoint

如您所见,我正在基于该图像创建服务。然后,当我运行管道时,curl请求返回一个Could not resolve host: cf-ssh-tunnel-service

问:我如何创建Docker映像以在GitLab中用作服务?
问:我应该如何创建CF SSH隧道以用作GitLab的侦听服务?

1 个答案:

答案 0 :(得分:0)

除非您的图像存储在GitLab container registry中,否则您将无法访问您的自定义图像(因为它需要登录到专用存储库才能拉出它)。

我可以考虑两种解决方案:

  1. Creating a custom docker runner在个人计算机上:
sudo gitlab-runner register

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com

Please enter the gitlab-ci token for this runner
xxx

Please enter the gitlab-ci description for this runner
[hostname] my-runner

Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag

Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

Please enter the Docker image (eg. ruby:2.1):
alpine:latest

一些注意事项:

  • 您可以在项目中的设置> CI / CD>赛跑者中找到您的gitlab-ci令牌
  • Gitlab-runner注册需要您指定默认的docker映像(以防您在未指定要使用的映像的情况下调用运行程序),但是它将使用您告诉它使用的映像。

如果选择该选项,则必须将tags: [docker-runner-tag]命令添加到.gitlab-ci.yml中的作业中。不要忘记在注册了自定义dockerRunner的计算机上执行docker登录,否则拉取仍然会失败。您可能还必须add gitlab-runner to the group of docker's authorized users

sudo usermod -aG docker gitlab-runner

  1. Create a GitLab container registry。我从未使用过该选项,因此我将不做详细介绍,但是您应该在项目的Packages> Container Registry部分中找到创建全新容器注册表的说明。

我认为Docker Hub还提供了针对私有注册表的选项,但我不知道此类服务是否可以免费使用。