-
2019-07-25 11:19:05
rebase current onto Selected
更多相关内容 -
Ubuntu上实现Gogs+Jenkins在代码提交时自动创建合并请求
2021-11-12 18:09:27).replace("\n", "") #合并的目标分支 targetBranch = str(sys.argv[4]).replace("\n", "") #代码审核的人名(登录名) codeReviewer = str(sys.argv[5]).replace("\n", "") #合并请求的标题,因为这个值是commit ...-
环境配置
- Ubuntu版本:Ubuntu 20.04.2 LTS
- Jenkins版本:2.303.3
- Gogs版本:0.12.3
-
安装Jenkins必要插件
1.安装Generic Webhook Trigger Plugin插件,方便监听Gogs的webhook。
2.安装Python Plugin插件,方便在构建时执行shell脚本(间接执行python脚本)
-
构建一个git push能触发的jenkins任务
-
新建Jenkins任务并配置参数。
在Jenkins首页,点击“新建任务”,输入任务名称,一般用“项目名+操作命名”,例如“project_name-push”表示仓库在push时触发此任务,点击“构建一个自由风格的软件项目”,然后确定即可创建一个新的任务,进入到任务配置界面,到”构建触发器”项的设置,勾选“Generic Webhook Trigger”,在“Post content parameters”中,设置Variable为ref,Expression设置为@.ref ,如下图所示:
然后在Header parameters设置中,设置Request header为X-Gogs-Event,在Request parameters设置Token,这个token在gogs的web hook中有用。如下图所示:
在Optional filter设置项,设置任务相应的事件,此处只响应仓库master分支的push事件,可根据实际情况修改。
具体设置为,Expression设置成:push_refs/heads/master,Text设置成:$x_gogs_event_$ref。如下图所示:
最后保存。
-
设置Gogs仓库Web 钩子。
Gogs登录后,在项目代码界面,点击右上角的“仓库设置”—“管理Web钩子”—“添加新的Web钩子”,选择“Gogs”类型。在配置界面,推送地址设置成:http://jenkins_ip:port/generic-webhook-trigger/invoke?token=xxx
将地址中的jenkins_ip:port和xxx替换为实际使用的jenkins地址和端口,以及在上述中jenkins任务中设置的Token。数据格式为:application/json,密钥文本不填,web钩子时间设置成:只推送push事件,勾选是否激活,最后点击“添加Web钩子”按钮。配置项如下图所示:
-
Ubuntu配置Python运行环境
-
安装Python脚本运行需要的selenium库和chromedriver
-
Ubuntu自带Python 3.8.10,只要安装脚本运行需要的的Selenium库和谷歌浏览器以及chromedriver即可。
1、安装chrome,我安装的版本是95.0.4638.69,以下命令即可安装最新版,命令如下
sudo apt-get install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb
google-chrome --version
当查看版本没问题,说明安装成功了。
2、下载chromedriver
#执行如下命令(第一条用于获取最新版本号,第二条用于下载):
LATEST=$(wget -q -O - http://chromedriver.storage.googleapis.com/LATEST_RELEASE)
wget http://chromedriver.storage.googleapis.com/$LATEST/chromedriver_linux64.zip
# 解压
unzip chromedriver_linux64.zip
# 修改权限
chmod +x chromedriver
# 可以移动driver 省的指定位置
sudo mv chromedriver /usr/bin/
# 查看版本
./chromedriver --version
如果最后一条命令显示如下说明没问题了。
ChromeDriver 95.0.4638.69 (6a1600ed572fedecd573b6c2b90a22fe6392a410-refs/branch-heads/4638@{#984})
3、安装selenium
1) 安装python3-pip,命令: sudo apt install python3-pip;
2) 安装selenium,命令:pip install selenium
若提示ERROR: pyopenssl 21.0.0 has requirement cryptography>=3.3, but you'll have cryptography 2.8 which,则去https://pypi.org/simple/pyopenssl/地址下载pyOpenSSL-21.0.0-py2.py3-none-any.whl文件,cd到文件目录,并执行以下命令安装:
pip install pyOpenSSL-21.0.0-py2.py3-none-any.whl
-
测试测试selenium库和chromedriver是否正常工作
输入以下命令:
python3 #进入python命令行模式
from selenium import webdriver #导入selenium的webdriver库
driver = webdriver.Chrome() #使用谷歌浏览器,会自动打开谷歌浏览器
driver.get("https://www.baidu.com/") #打开网页,浏览器打开百度首页
print(driver.title) #显示网页标题,即“百度一下,你就知道”
以上命令正确执行后,表示selenium库正确安装,且chromedriver正常使用。
-
Jenkins配置执行python脚本需要的参数
-
任务参数修改。
打开上述第三点中创建的jenkins任务,并进入配置界面,在General选项卡中,勾选“参数化构建过程”,添加五个选项参数,分别是projectName、projectOwner、sourceBranch、targetBranch、codeReviewer,表示仓库名称、仓库拥有者名(创建仓库时的 “拥有者”名称)、要合并的源分支,合并的目标分支、审核者(合并请求中的指派成员),例如projectName配置如下图所示。
为了让合并请求的标题和内容都设置成仓库的提交信息,在“构建触发器”—Post content parameters中再添加两个参数,Variable分别是pullRequestTitle、pullRequestContent,Expression都设置成$.commits[0].message,格式为:JSONPath,表示合并请求标题、合并请求内容(创建者的评论),配置如下图所示。
在“构建”选项卡中增加构建步骤,选择增加执行shell的步骤,配置如下图所示:
内容:python3 /home/当前用户名/gogs/AutoCreateGogsPullRequest.py $projectName $projectOwner $sourceBranch $targetBranch $codeReviewer "$pullRequestTitle" "$pullRequestContent" 192.168.197.129:3303
命令共8个参数,每个参数之间空格分开,若是参数值有空格,则用双引号将字符串引起来,最后的地址为gogs的访问地址,参数顺序不能变,参数值中最好不要有换行。
2. python脚本执行相关的修改。
1) 将脚本AutoCreateGogsPullRequest.py文件放到/home/当前用户名/gogs/目录下。
2) 修改脚本文件权限,使用Gogs的ubuntu用户需要有执行权限,执行命令:sudo chmod -R 777 /home/当前用户名/gogs/AutoCreateGogsPullRequest.py。
3) 为了防止jenkins在执行脚本时,报找不到python的第三方库错误:ModuleNotFoundError: No module named 'selenium',原因是jenkins的用户是jenkins,python库是当前用户,属于权限问题导致,需要修改python安装的第三方包的用户和所属组,执行命令:sudo chown jenkins:jenkins /home/gerrit/.local/lib/python3.8/site-packages,其中site-packages是python第三方所在位置,注意:修改site-packages用户后,在系统命令行执行脚本将出现找不到模块问题。
4) 确保AutoCreateGogsPullRequest.py文件中chromedriver path,正确,如下图所示,若按本文章安装的chromedriver,则无需修改。这么设置是为了防止jenkins执行脚本时出现:selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed.错误。
5.修改脚本中登录函数中的用户名和密码,该用户有管理员权限,有创建所有仓库的合并请求权限 。
3. AutoCreateGogsPullRequest.py代码。
import webbrowser import time import sys import os from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import UnexpectedAlertPresentException from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains #判断是否已经登录 def isLogin(driver): if driver is not None : try: driver.find_element(By.ID, "user_name") print("isLogin() return false") return False except NoSuchElementException as e: print("isLogin() return true") return True return False #去登录 drive 在登录界面 def login(drive): if driver is not None : try: #填登录的用户名,带管理员权限 driver.find_element(By.ID, "user_name").send_keys(u"admin") #填登录的密码 driver.find_element(By.ID, "password").send_keys(u"12345678") # name带空格,则空格用.代替即可,全名为:ui green button # see https://blog.csdn.net/yunmengdan/article/details/111614913 driver.find_element(By.CLASS_NAME, "ui.green.button").click() print("Login operate finished") except: print("login operate error") return #项目名 projectName = str(sys.argv[1]).replace("\n", "") #项目拥有者 projectOwner = str(sys.argv[2]).replace("\n", "") #要合并的源分支 sourceBranch = str(sys.argv[3]).replace("\n", "") #合并的目标分支 targetBranch = str(sys.argv[4]).replace("\n", "") #代码审核的人名(登录名) codeReviewer = str(sys.argv[5]).replace("\n", "") #合并请求的标题,因为这个值是commit message,带\n,所以必须替换掉制表符\n,否则会出现selenium.common.exceptions.UnexpectedAlertPresentException:错误 pullRequestTitle = str(sys.argv[6]).replace("\n", "") #合并请求的内容,因为这个值是commit message,带\n,所以必须替换掉制表符\n,否则会出现selenium.common.exceptions.UnexpectedAlertPresentException:错误 pullRequestContent = str(sys.argv[7]).replace("\n", "") #gogs服务器地址 gogsUrl = str(sys.argv[8]).replace("\n", "") #若driver send_keys 方法出现莫名其妙的错误,则可能是send_keys参数中的值带特殊符号,比如\n #创建合并请求的url newPullRequestUrl = "http://" + gogsUrl + "/" + projectOwner + "/" + projectName + "/compare/" + targetBranch + "..." + projectOwner + ":" + sourceBranch print("newPullRequestUrl=" + str(newPullRequestUrl) + ", pullRequestTitle=" + pullRequestTitle + ", pullRequestContent=" + pullRequestContent) #解决selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed. #参照 https://www.cnblogs.com/jingzaixin/p/11570444.html chrome_options = webdriver.ChromeOptions() #为驱动加入无界面配置 chrome_options.add_argument('--headless') #–headless”参数是不用打开图形界面 chrome_options.add_argument('--no-sandbox') #“–no - sandbox”参数是让Chrome在root权限下跑 #chrome_options.set_capability("unhandledPromptBehavior","accept") path = r"/usr/bin/chromedriver" #配置驱动路径 print("chromedriver path:%s" % path) driver = webdriver.Chrome(executable_path=path,chrome_options=chrome_options) driver.maximize_window() #窗口最大化 try: # 打开新建合并请求界面,若用户未登录,会自动跳转到登录界面 driver.get(newPullRequestUrl) isLogin = isLogin(driver) if isLogin == False: login(driver) print("user has login") # 登录后 # 判断是否已经有合并请求,或者两分支是否已经同步 try: # 名字全词匹配,使用这种方法,否则会按文档顺序去找到第一个包含名字的元素 driver.find_element(By.XPATH, "//*[@class='ui segment']") print("has created pull request, can not new a pull request") #关闭浏览器 driver.close() # 已经有合并请求,或不需要合并操作,则不做其他操作,直接退出 sys.exit(0) except NoSuchElementException as e: print("no has created pull request, can new a pull request") # 设置合并请求的“标题” driver.find_element(By.NAME, "title").send_keys(pullRequestTitle) # 设置“内容编辑”的内容 driver.find_element(By.XPATH, "//*[@class='ui bottom attached active tab segment']/textarea").send_keys(pullRequestContent) # 点击“指派的成员”按钮,弹出可选的评审人员(必须要此步骤,否则下一步的c.click()操作将失败) #driver.find_element(By.XPATH, "//*[@class='ui floating jump select-assignee dropdown']/span").click() selectReviewerParent = driver.find_element(By.XPATH, "//*[@class='ui floating jump select-assignee dropdown']") #selectReviewerParent = driver.find_elements(By.CLASS_NAME, "select-assignee")[0] selectReviewerParent.find_element(By.XPATH, "./span").click() # 找到可以评审的成员列表控件的父元素 listParent = selectReviewerParent.find_element(By.XPATH, "./div") # 找到所有可评审成员 childrens = listParent.find_elements(By.XPATH, "./*") #控件操作类 actionChainsDriver = ActionChains(driver) for c in childrens: #标签中夹着的内容,包含可用评审人员名称 divInnerContent = str(c.get_attribute("innerHTML")) #print("c innerHTML=" + divInnerContent) # 跟想要的评审人员名字对比,相同,则选择。 if divInnerContent.find(codeReviewer) >= 0: #移动到要选择的审核者位置 actionChainsDriver.move_to_element(c) actionChainsDriver.perform() c.click() # 点击 “创建合并请求”按钮 driver.find_element(By.XPATH, "//*[@class='ui green button']").click() print("create pull request finished") except NoSuchElementException as e: print("create pull request error=" + e.msg) #关闭浏览器 driver.close() sys.exit(0)
2021.11.15,修改python代码,解决有时候无法选择审核者问题。
参考文章
https://blog.csdn.net/xiaosongluo/article/details/80151474
https://www.jerrycoding.com/article/linux-selenium/
https://www.cnblogs.com/jingzaixin/p/11570444.html
https://blog.csdn.net/longhtml/article/details/102861343
-
-
gitlab-review:强制同行代码审查以合并 gitlab 中的合并请求
2021-06-18 10:02:38gitlab-review 强制同行代码审查以合并 gitlab 中的合并请求 -
用于管理GitHub合并请求的VSCode扩展
2019-08-14 10:02:32VS Code Pull Request Provider for GitHub -
Gitlab拉取_推送代码,提交合并请求.docx
2022-02-23 01:34:03Gitlab拉取_推送代码,提交合并请求.docx -
Gitlab合并请求相关流程
2021-06-22 14:00:19最近仓库以及完成切换,大家都已经用上了新的Gitlab,但是在合并分支,发起合并请求的时候有些疑惑,这里将对此进行解释说明、 入口: 仓库控制台的这两个地方都有合并请求入口。 点击 新合并...入口:
仓库控制台的这两个地方都有合并请求入口。
点击 新合并请求
源分支与合并分支:
Source branch: 源分支,代表想要合并的分支
Target branch:目标分支,代表被合并的分支
合并请求将使 Source branch -》合并至 -》Target branch
新建画面
处理合并请求
常见问题:
- 出现冲突怎么办:
- 首先每次在发起合并请求前,先rebase一下你的源分支,你的开发分支随时更新base分支。(请注意rebase和marge的区别)
- 如出现冲突,新建合并请求时,会出现无法合并的情况,需要线下解决,参考a
- 合并请求的受理人需要注意,若源分支落后目标分支,请不要进行合并,保证源分支需要rebase。
- 如果出现情况,需要修改代码后重新合并请求。这里可以不用关闭原来的合并请求,当分支重新修改完成后,合并请求将会随之更新
- 出现冲突怎么办:
-
merge-request-integration:Intellij IDE插件,可帮助您直接在IDE中管理合并请求和执行代码检查
2021-05-22 12:51:39合并请求集成是一个插件,可帮助您直接在IDE中进行代码审查。 你可以做什么: 过滤分配给您的合并请求,等待您的批准等 检查管道状态和批准状态。 选择并查看1个或所有提交 进行代码检查,直接在IDE中使用Diff ... -
mr-issue:问题先生-Gitlab合并请求以替换问题更新
2021-05-15 04:18:00但是,Gitlab git集成和代码审查的合并请求远远优于Redmine。 但是,使问题和合并请求保持同步是一场噩梦。 到现在... 引入了mr-issue,这是一个Gitlab Webhook侦听器,它能够查找合并请求正文中引用的问题,然后... -
vscode-gitlab-merge-request-upvotes:在您的GitLab的合并请求中遵循upvotes
2021-01-30 09:28:35Gitlab合并请求支持自述文件 借助Gitlab合并请求支持,您可以轻松地遵循GitLab MR上的支持或批准。 扩展的树形视图将显示您在实例创建的MR上的投票(或批准)。 产品特点 添加GitLab实例 删除GitLab实例 在树状视图... -
前端js文件合并的三种方式推荐
2021-01-19 15:27:32最近在思考前端js文件该如何合并,当然不包括不能合并文件,而是我们能合并的文件,想了想应该也只有三种方式。...这种方式就是不管三七二十一,所有js合并成一个大文件,所有页面都引用它,即使某些代码可能不 -
Gitlab合并代码的几种情况
2019-03-27 23:50:52开发者权限提交代码并请求合并如下图新建一个 Issue点击提交Issue创建在问题界面点击 Create merge request创建一个合并请求Issue界面点击之后...开发者权限提交代码并请求合并
如下图新建一个
Issue
点击提交Issue创建 在问题界面点击
Create merge request
创建一个合并请求Issue界面 点击之后会跳转至
合并请求
页面合并请求页面 正常的操作应该是把新建的分支
7-_1
拉到本地然后修改后推送到远端本地合并方式 为了方便起见,直接使用
在Web IDE中打开
web Ide修改 提交请求 合并请求
页面就可以看到其中的内容发生了改变分支提交之后的页面 之前是询问是否要创建一个新文件,现在直接就是问你这不是已经完成了这个半成品了,点击
Resolve WIP status
提示信息就会变成已可自动合并。 请具有仓库写入权限的用户来合并此请求
开发者看到的页面 下面登录管理员账户查看,可以看到
合并
按钮已经变成绿色了管理员看的的页面 两个合并先后修改了文件不同位置
这个情况比较简单,正常的合并操作也不会出现冲突,所以不赘述了。
两个合并先后修改了文件同一个位置
我们创建两个问题单:
两个合并先后修改了文件同一个位置_1
和两个合并先后修改了文件同一个位置_2
并为他们分别拉取分支,创建合并请求创建两个合并请求 修改1号请求 提交一号请求 同理,在第二个页面也修改第五行
修改2号请求 先同意提交1
管理员同意一号请求 然后查看提交2
管理员查看2号请求 我们就可以看到出现冲突了,可以本地合并
本地合并方式 也可以直接在页面进行
解决冲突
页面选择进行解决合并 同意哪个改哪个,如果都不同意就自己改
自行解决 去除多余的 〈〈〈符号就好了
合并方法 正常提交 之后就可以正常合并了
-
GitLab——提交合并请求
2019-06-18 18:38:07选中要提交合并请求的项目,进入此页面 见上图,右上角有个蓝色的按钮(Create merge request),翻译成中文就是 创建合并请求,点击进入下一个页面 title内容填写自己项目修改的内容标题就可以了,随意 咱们是要... -
SAP 合并请求
2020-09-16 12:05:11多个有先后顺序的传输请求可以合并传输,SAP会自动处理顺序 TCODE: SE03 ->合并对象清单 选择要合并的请求号->执行 执行合并->创建新的请求号 -
request-once:将多个异步请求合并为一个可合并的请求
2021-04-30 14:17:26本质上,如果您有大量不相关的代码路径尝试一次访问相同的资源,它可以节省资源。 一个示例用例是一个应用程序,它产生许多并发网络请求,这些请求可能正在访问相同的URL。 request-once使您无需考虑批处理即可优化... -
高并发场景下请求合并(批量)
2022-04-11 09:53:41目录前言技术手段代码实现查询用户的代码合并请求的实现控制层调用模拟高并发查询的代码测试效果要注意的问题使用队列的超时解决Java 8 的 CompletableFuture 并没有 timeout 机制核心代码小结代码地址参考 ... -
GitLab合并请求
2019-03-25 18:19:371、 进到项目里面,New merge request 2、选择源分支和目标分支,然后单击Compare branches and continue 按钮 3、点击Merge合并请求 -
Git-Fork后,发起PR请求,向原始仓库请求代码合并
2020-10-14 11:14:40在Git-Fork-请求PR 在github页面上, 点击fork按钮, 将B的项目拷贝一份到A自己的代码仓库中. 克隆A自己的代码仓库到本地. $ git clone https://github.com/A/A.git 将B的项目作为最新代码的参考标准(upstream ... -
vue基础知识--axios合并请求和slot
2020-10-15 06:00:20主要介绍了vue中的axios和slot,文中代码非常详细,对大家的工作学习有所帮助,感兴趣的朋友可以参考下 -
git 请求合并和审核请求合并
2020-10-04 17:31:584. 等待审批合并请求,审批人会看到有合并申请 5. 点击标识1 查看合并请求 6. 标识1 合并并提交, 里面有 “Merge” 直接点击就可以合并提交。标识2查看详情。由于是项目不好直接截图,望谅解! ... -
mrHelper:用于GitLab合并请求的桌面工具
2021-03-15 15:35:05合并请求助手 用于GitLab合并请求的桌面工具 简短的 它是一个桌面工具,用于管理git和GitLab,以支持从GitLab Web UI进行的合并请求审核。 特征 Beyond Compare 3支持:启动差异工具并使用热键报告所选代码行的新... -
用Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案)
2020-10-20 08:13:40主要介绍了用Promise解决多个异步Ajax请求导致的代码嵌套问题(完美解决方案),需要的朋友可以参考下 -
超详细-git提交代码拉取代码并合并一套流程
2022-02-12 16:31:07上传代码2.1 拉取代码2.2 查看当前状态2.3 提交代码到本地缓存区2.4 提交代码到本地git库2.5 提交代码到远程仓库创建分支总结 git提交代码的一套流程 我们经常听过github和gitee,诸如此类的代码托管平台,他们实际... -
php合并js请求的例子
2020-12-19 11:38:19看代码就会的小例子:php合并js请求复制代码 代码如下://页面保存为js.php//前台请求范例http://localhost/js.php?f=1,2//请求1.js,2.js两个文件<?PHPheader(“Content-Type:application/x-javascript”);header... -
详解git合并冲突解决方法
2020-10-15 02:03:45主要介绍了详解git合并冲突解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
请求合并
2019-08-27 23:28:26但有时候,请求更多的是单个接口,不能够直接调用批量接口,如果这个接口是高频接口,对其做请求合并就很有必要了。比如电影网站的获取电影详情接口,APP的一次请求是单个接口调用,用户量少的时候请求也不多,完全... -
使用gitlab网页将代码合并分支
2020-12-17 12:19:52下面将dev分支代码合并至master 1.点击request merge 2.源分支为当前分支,目标分支默认为master,确认无误,点击提交 3.提交后出现下面的界面,点击Merge进行合并 -
git 提交merge request合并请求
2021-09-24 10:11:521. 创建一个新分支,用来修改代码 创建完成后可以在新分支修改bug。代码修改完成后开始提交: 进入gitlab界面 点击右上角mergeRequests,进入到merge请求视图 点击创建新的merge request 分别待提交... -
(转)GitHub中PR(Pull request)操作 - 请求合并代码
2019-10-04 08:01:22提交你的说明,选择合并的分支即可,剩下等待合并。 image 结尾 开源的魅力就在于协同工作,提高效率。 作者:梁同桌 链接:... -
IDEA如何拉取gitlab代码?如何更新代码?如何上传代码?如何请求合并代码?
2021-03-05 10:35:081、拉取git代码 2、更新git代码 添加git代码地址 更新代码 3、上传git代码 上传到本地仓库 提交到git上 ...4、请求合并代码 ...选择刚提交的代码,选择目标分支(从派生代码合并到主分支) ... -
c#使用Socket发送HTTP/HTTPS请求的实现代码
2020-08-29 12:16:06主要介绍了c#使用Socket发送HTTP/HTTPS请求的实现代码,需要的朋友可以参考下