Gitlab-ci:将回购从Gitlab推送到Gitlab Runner主机?

时间:2019-07-25 01:46:10

标签: gitlab-ci gitlab-ci-runner

我正在使用gitlab-ci在一些远程服务器上部署一些Docker堆栈文件。构建映像,推送到注册表,然后拉并部署,效果很好。

但是,我不知怎么地陷入了一个更简单的用例中-我只想将我在gitlab上的存储库推送到远程服务器上的文件夹中。目前,我有一个cron作业,每5分钟执行一次git pull,但我希望将其保存在gitlab-ci文件中,以便最终添加一些测试,等等。

这是我目前的尝试。我在这一点上已经尝试了很多变化。

 deploy:
  stage: deploy
  only:
    - master
  script:
    - apk update && apk add git
    - echo $CI_PROJECT_DIR
    - if [ ! -d .git ] ; then git clone ${CI_REPOSITORY_URL} . ; else echo "Respository already cloned" ; fi
    - git remote set-url origin ${CI_REPOSITORY_URL}
    - git pull origin ${CI_COMMIT_REF_NAME}
    - git reset --hard ${CI_COMMIT_SHA}
    - git submodule init
    - git submodule update
    - git reset --hard --recurse-submodule HEAD
    - git clean -f
    - git submodule foreach --recursive git clean -f
    - ls $CI_PROJECT_DIR ; echo

我的配置:

 [[runners]]
  name = "Docker Runner"
  url = "https://gitlab.com/"
  token = ""
  executor = "docker"
  [runners.custom_build_dir]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock",
               "/mnt/airflow/dags:/builds",
               "/cache"]
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

我的代码被添加到主机上的/ mnt / airflow / dags目录中,但是我想摆脱它的一些子文件夹(完整路径为/ dags / runner_id / 0 / project_name / project)。我的目标是使路径为/ mnt / airflow / dags / project。

我也尝试过使用Shell执行器,但是由于我的gitlab Runner是一个docker容器,它只是将数据添加到了该容器中,所以没有看到将卷安装到主机的示例。

2 个答案:

答案 0 :(得分:0)

使用 gitlab-runner

可以轻松(基于文件)部署两种方法

本地跑步者

您已经提到了这一点。使用shell执行程序在目标主机上具有 gitlab-runner ,然后只需将文件复制到目标目录即可。正确设置权限可能有些棘手,但除此之外,它非常简单。

如果只能在容器中运行运行程序,则仍然可以通过将部署的目标目录绑定安装到运行程序的容器中来使用此方法

使用SSH部署

为此,gitlab服务器必须能够通过SSH到达部署主机。

  1. 在目标计算机上创建部署用户
  2. 向该用户添加授权的SSH密钥
  3. 将该SSH密钥的私钥作为变量添加到gitlab存储库中
  4. 使用密钥从运行程序到部署主机运行scp / rsync操作

该脚本可能看起来像这样:

 before_script:
    - apt-get update
    - apt-get --yes install openssh-client rsync
    # Add host key of webserver to known hosts file
    - mkdir -p ~/.ssh
    - echo "|1|NBu3XQDeVt3ea6yoK55GC8esO4w=|Jn7zY5dvsrGno2yxK5EzZNyRJSI= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGaaaexlUD2C8fbxfUUv6651J+Dc+KXYZHlM+INppRmefRwNyAsmEQO2YobNpisleXqeJeapUyQuu0GIwhKNzrM=" >> ~/.ssh/known_hosts
    # 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
    - echo "$SSH_PRIVATE_KEY" | ssh-add -
  script:
    - rsync -az --delete --omit-dir-times . gitdeploy@web.my:/var/www/www.my.site/

答案 1 :(得分:0)

我禁用了共享运行程序,并注册了一个gitlab-runner(docker映像,docker executor)。我编辑了toml文件,并将一个卷从我的主机装载到下面的$ TARGET_DIR。完全按照我的要求工作

stages:
  - deploy

variables:
  TARGET_DIR: /home/gitlab-runner/$CI_PROJECT_NAME

deploy_airflow:
  stage: deploy
  only:
    - master
  script:
    - apk update && apk add rsync
    - mkdir -pv $TARGET_DIR
    - rsync -a --delete ./ $TARGET_DIR