gpt4 book ai didi

gitlab - gitlab 部署 key 是只读的吗?

转载 作者:行者123 更新时间:2023-12-03 14:04:58 25 4
gpt4 key购买 nike

gitlab 部署 key 是只读的吗?
我需要使用部署 key 在 ci 服务器上进行克隆,然后推送 ci 进程创建的标签。
这可能使用部署 key 吗?

最佳答案

Edit2: This change currently has a sideeffect, as there are no users on deployment keys. So you will find some ugly messages like ERROR -> POST-RECEIVE: Triggered hook for non-existing user. The cache-invalidation (and possibly other things) are therefor not handled on write pushes through deployment-keys, which is a bit ugly. bundle exec rake cache:clear RAILS_ENV=production is your friend until I can find a way to fix that (see link to GitHub below) - and please remember, that clearing the Redis-cache logs out all users, too.



这是一个简短的解决方法,用于按 key 归档以下内容:
  • 制作 My SSH keys只读。这允许添加对帐户的所有存储库具有只读访问权限的机器。如果您使用 git 的火车负载,那就太好了子项目。
  • 使 Deploy-Keys 在开发人员级别具有读写权限。
  • 使 Deploy-Keys 在主级别上进行读写。

  • 这是通过在 key 标题前加上一些特殊字符来存档的:
  • *制作 My SSH keys只读
  • !使 Deploy-Keys 可读写
  • !!使 Deploy-Keys 成为主控(写入 protected 分支)

  • 因此,将 key 命名为“我的全局 key ”,您将其命名为“* 我的全局只读 key ”等。
    diff --git a/lib/api/internal.rb b/lib/api/internal.rb
    index ed6b50c..ce350b1 100644
    --- a/lib/api/internal.rb
    +++ b/lib/api/internal.rb
    @@ -30,7 +30,11 @@ module API


    if key.is_a? DeployKey
    - key.projects.include?(project) && DOWNLOAD_COMMANDS.include?(git_cmd)
    +return false unless key.projects.include?(project)
    +return true if DOWNLOAD_COMMANDS.include?(git_cmd)
    +return true if key.title.start_with? '!!'
    +return false if project.protected_branch?(params[:ref])
    +key.title.start_with? '!'
    else
    user = key.user

    @@ -42,6 +46,7 @@ module API
    then :download_code
    when *PUSH_COMMANDS
    then
    +return false if key.title.start_with? '*' # VAHI 2014-02-09
    if project.protected_branch?(params[:ref])
    :push_code_to_protected_branches
    else

    编辑1:此补丁现在以 cherry-pick 的形式提供在 GitHub 上,请参阅 https://github.com/hilbix/gitlabhq/wiki

    编辑3:您可能还需要以下解决方法,以防您推送部署 key 。这并不完美,因为它不会触发所有这些钩子(Hook),但它会使缓存无效,从而使网页不再显示陈旧数据:
    diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb
    index 6416aa6..2fe98d4 100644
    --- a/app/workers/post_receive.rb
    +++ b/app/workers/post_receive.rb
    @@ -26,6 +26,8 @@ class PostReceive

    unless user
    log("Triggered hook for non-existing user \"#{identifier} \"")
    + project.ensure_satellite_exists
    + project.repository.expire_cache
    return false
    end

    仍然存在一些问题:

    一个小问题,您不能同时在帐户级别和部署级别上使用相同的 key 。因此,对于仅在全局范围内具有只读访问权限的 key (这可能是使用的默认 key ),您需要第二个特殊的“仅推送” key ,它允许推送访问存储库。

    编辑3:最重要的是部署 key 没有附加用户,因此所有方便的东西都不起作用。如果这对您来说是个问题,唯一的方法是,为每个 SSH key 创建一个虚拟用户,并将其添加到组/项目中,并为该虚拟用户提供正确的权限。

    Linux 下的完整示例,用于在 git@gitlab.example.com:root/test.git 上的测试 repo
  • 将上述补丁应用到 GitLab
  • 重启 GitLab 以读入新代码
  • 添加您的~/.ssh/id_rsa.pubMy SSH keys 下的 GitLab 管理员并将其命名为 * my readonly key (或不同的东西,从 * 开始)。
  • 验证以下是否有效:git clone git@gitlab.example.com:root/test.git
  • 验证 git push 上的以下失败步:
    cd test
    date > DATE.tmp
    git add DATE.tmp
    git commit -m testing
    git push
  • 创建第二个 SSH key ~/.ssh/id_push : ssh-keygen -b 4096 -f ~/.ssh/id_push
  • 添加 ~/.ssh/id_push.pub作为 Deploy-Key repo root/test.git .给它起个名字! my push key (或不同的东西,以 ! 开头)
  • 将以下内容添加到 ~/.ssh/config
    Host gitlab-push
    Hostname gitlab.example.com
    User git
    IdentityFile ~/.ssh/id_push
  • 将此目标添加到您的克隆存储库中:git remote add to gitlab-push:root/test.git
  • 验证以下工作:git push to master

  • 笔记:

    我使用复制+粘贴来插入补丁。它可能不会完全适用。对不起。

    是的,这确实是一个非常粗暴的 hack,不应该进入主线。正确的实现是在数据库中有一个这样做的标志,这样您就可以通过 GUI 对其进行编辑。

    对于部署 key ,此“ key 级别”标志应位于 key 和项目之间的交叉表中。在非部署 key 变体中,它应该在 key 本身上。也许这个字段可以充当 default将部署 key 添加到另一个项目时的值并记录该 key 的最后使用情况。

    不幸的是,我自己无法正确实现这一点,因为我缺乏如何向 GUI 添加必要元素的知识,抱歉。 ;(

    关于gitlab - gitlab 部署 key 是只读的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20424814/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com