Gitlab-ci:将一个 repo 从 Gitlab 推送到 Gitlab Runner 主机?

Gitlab-ci: pushing a repo from Gitlab to the Gitlab Runner host?

我正在使用 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 容器,它只是将数据添加到容器中而我没有请参阅将卷安装到主机的示例。

使用 gitlab-运行ner

进行简单(基于文件)部署有两种可能性

本地亚军

你自己已经提到了这一点。使用 shell 执行器在目标主机上有一个 gitlab-运行ner,然后简单地将文件复制到目标目录。正确设置权限可能有点棘手,但除此之外它非常简单。

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

使用 SSH 部署

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

  1. 在目标机器上创建部署用户
  2. 为该用户添加授权的 SSH 密钥
  3. 将该 SSH 密钥的私钥作为变量添加到您的 gitlab 存储库
  4. 使用密钥 运行 从 运行ner 到部署主机
  5. 的 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/

我禁用了共享运行器并注册了一个 gitlab-runner(docker 图像,docker 执行器)。我编辑了 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