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 访问部署主机。
- 在目标机器上创建部署用户
- 为该用户添加授权的 SSH 密钥
- 将该 SSH 密钥的私钥作为变量添加到您的 gitlab 存储库
- 使用密钥 运行 从 运行ner 到部署主机
的 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
我正在使用 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 访问部署主机。
- 在目标机器上创建部署用户
- 为该用户添加授权的 SSH 密钥
- 将该 SSH 密钥的私钥作为变量添加到您的 gitlab 存储库
- 使用密钥 运行 从 运行ner 到部署主机 的 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