V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
css3
V2EX  ›  程序员

gitlab ci 如何在提交到 master 分支前进行验证,通过验证才能 merge 或 push

  •  1
     
  •   css3 · 2020-08-27 11:09:02 +08:00 · 7028 次点击
    这是一个创建于 1584 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下各位大佬:

    • 写了个验证脚本,放到代码工程中,并且将执行任务加到 ci stage 里边了
    • 但现有的 ci 执行顺序是大家先 push 或 merge 然后才进入 stage 自动流程,然后才走的脚本验证流程,所以这个验证功能并没有什么用,验证未通过时,也还是合到 master 上了
    • 怎么才能在 merge 或 push 前验证出来结果呢?验证不过,就拒绝提交 master
    第 1 条附言  ·  2020-08-27 11:50:33 +08:00
    😂😂突发奇想,再加一个 git 回滚脚本,stage 里边的验证流程失败后,直接执行 git 回滚 stage 任务对本次提交进行回滚。不知道是否可行
    34 条回复    2022-01-12 16:07:41 +08:00
    virusdefender
        1
    virusdefender  
       2020-08-27 11:10:58 +08:00
    ci 中加一项跑你的验证,依赖 staging 那一步,跑完了整个 ci 才结束
    css3
        2
    css3  
    OP
       2020-08-27 11:14:10 +08:00
    @virusdefender
    加了啊,问题在于,现有顺序是先提交后才触发执行 ci 。应该要先执行 ci,验证结果通过后才能 push 或 merge
    Chingim
        3
    Chingim  
       2020-08-27 11:18:47 +08:00
    maichael
        4
    maichael  
       2020-08-27 11:19:51 +08:00
    锁分支,不给直接推送,然后手动在界面上提交合并请求
    AngryPanda
        5
    AngryPanda  
       2020-08-27 11:21:27 +08:00
    走 MR,不要给权限直接客户端操作
    virusdefender
        6
    virusdefender  
       2020-08-27 11:31:20 +08:00
    @css3 你们直接 push master ? 应该用 merge request
    NauxLiu
        7
    NauxLiu  
       2020-08-27 11:34:01 +08:00
    1. 将 master 设置为 protect branch,不允许直接 Push
    2. 打开项目的 Merge Request 设置里的 Pipelines must succeed
    css3
        8
    css3  
    OP
       2020-08-27 11:34:56 +08:00
    @virusdefender 有 MR,但大家不遵守规范,一股脑提过来,要人工检查,索性就写了个脚本自动验证,这不是没按预计想的那样运行么😂😂
    wxsm
        9
    wxsm  
       2020-08-27 11:42:02 +08:00 via iPhone
    我刚好也在搞这个。目前在尝试 gitlab 前面再对接一个 gerrit
    wxsm
        10
    wxsm  
       2020-08-27 11:45:46 +08:00 via iPhone
    但是不太顺利,怎么说呢,gerrit 能 push 的,人也能,人不能 push 的,gerrit 也不能。ce 没有评审功能很蛋疼。
    css3
        11
    css3  
    OP
       2020-08-27 11:57:18 +08:00
    @NauxLiu
    2 这个,是大家各自的分支上跑各自的 pipelines? 跑失败的时候,提不了 mr 吗?
    css3
        12
    css3  
    OP
       2020-08-27 11:58:11 +08:00
    @wxsm 有好的方案,分享一下哈😂😂
    NauxLiu
        13
    NauxLiu  
       2020-08-27 12:01:56 +08:00
    @css3 #11 是提交的 PR 对应的 Pipeline 如果没通过不能被 merge,
    taogen
        14
    taogen  
       2020-08-27 12:04:20 +08:00
    The branch you are building and testing on is only for building and testing.
    On your dev branch if any tests fail you just fix it and push it again.
    skyadmin
        15
    skyadmin  
       2020-08-27 12:09:24 +08:00
    master 分支设为保护分支,不允许任何人,直接推送代码至 master 分支。就可以让大家必须都在 merge request 了。
    skyadmin
        16
    skyadmin  
       2020-08-27 12:10:09 +08:00
    项目的 settings - repository - Protected Branches 里设
    skyadmin
        17
    skyadmin  
       2020-08-27 12:14:42 +08:00
    然后勾选 settings - General - Merge request,勾选 Only allow merge requests to be merged if the pipeline succeeds 。
    和#7 说的一样,只是给了下具体操作路径。
    1109599636
        18
    1109599636  
       2020-08-27 12:31:20 +08:00
    我的理解是个人提交到个人分支,然后个人分支跑 ci 各种流程,ci 通过了才可以 merge 到公共分支吧。如果在 commit 之前就做检查可以用 pre-commit hooks
    StarUDream
        19
    StarUDream  
       2020-08-27 12:34:54 +08:00
    目前用的就是 15-17 楼所说的方法,目测可以解决楼主问题。
    594duck
        20
    594duck  
       2020-08-27 12:41:58 +08:00
    @StarUDream 楼主回复说不想一个个看就想自动化跑跑测测。

    这种敏捷式开发,后面要吃瘪的。
    nightwitch
        21
    nightwitch  
       2020-08-27 12:57:37 +08:00
    禁止提交到 master,要提交到 master 发 pull request 。发 pull request 的时候自动触发 CI 测试,CI 测试不过不允许合并
    zmxnv123
        22
    zmxnv123  
       2020-08-27 13:04:15 +08:00
    git hook?
    Rwing
        23
    Rwing  
       2020-08-27 13:09:47 +08:00
    @nightwitch 这个是正解
    Sapp
        24
    Sapp  
       2020-08-27 13:43:38 +08:00
    coommit 可以添加钩子啊,前端就有个叫哈士奇的,不通过 commit 都没办法提交
    phy25
        25
    phy25  
       2020-08-27 14:21:43 +08:00 via Android
    比较优雅的办法,自动提交 MR:

    https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html

    https://docs.gitlab.com/ee/user/project/push_options.html

    git push -o merge_request.create -o merge_request.target=my-target-branch -o merge_request.merge_when_pipeline_succeeds
    janxin
        26
    janxin  
       2020-08-27 15:21:35 +08:00
    禁止 master 分支直接提交

    设置 Protected Branches

    合并 MR 需要在 pipelines 执行成功

    设置 Only allow merge requests to be merged if the pipeline succeeds
    maltoze
        27
    maltoze  
       2020-08-27 15:26:40 +08:00
    gen900
        28
    gen900  
       2020-08-27 15:33:51 +08:00 via iPhone
    gitlab 里 没有通过 pipeline 的 merge request 不让合并的。就是你 push 后就在做 ci 了如果失败 mr 不让合并
    wshcdr
        29
    wshcdr  
       2020-08-27 15:38:06 +08:00
    同意 MR 的做法
    otakustay
        30
    otakustay  
       2020-08-27 20:12:44 +08:00
    按照楼主的要求,其实你一开始就应该用 gerrit 而不是 gitlab
    dddd1919
        31
    dddd1919  
       2020-08-27 23:10:20 +08:00
    提 git 的人不按规范执行,总有方法绕过你的设置,不统一提交规范,其他的就别扯了
    用 git 靠的是约定,不是靠各种限制,如果大家都不遵守约定,那就找人专门来干这事,或者换个工具吧。
    统一 git flow,再用 ci 才能达到比较好的效果,比如配置 ci 在 feature 上执行,禁用 remote push master,合并 mr 前要 ci 通过,ci 同时配置 build 和 run test 等等
    icylogic
        32
    icylogic  
       2020-08-28 06:55:19 +08:00 via iPhone
    我们 master/develop 任何人都不能推的,所有更改都要通过其他分支提 mr,mr 只能由 reviewer 点合并,如果 ci pipeline 挂掉或者有 conflict,合并按钮都是灰的没法点(可以选项里改)
    wxsm
        33
    wxsm  
       2020-09-23 15:27:45 +08:00
    我通过 gitlab 的 webhook 和 api 自己实现了一套评审系统,详见: https://wxsm.space/posts/2020-09-23-gitlab-ce-code-review-bot.html
    dengxuejiu
        34
    dengxuejiu  
       2022-01-12 16:07:41 +08:00
    亲测可用,在 merge 之前做代码规范检查等工作还是挺好用的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:42 · PVG 01:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.