分类目录归档:自动化运维

Golang操作Gitlab实现MR自动合并


2021年3月26日 17:26:22   4,407 次浏览

通过gitlab api实现merge requests的自动合并,在使用api前我们需要先安装依赖及需要在gitlab配置帐户的token, 因为接下来需要用到token

go get -u github.com/xanzy/go-gitlab

package main

import (
	"fmt"
	"github.com/xanzy/go-gitlab"
	"log"
	"time"
)
var (
	// Your gitlab token
	token = ""
	// Your gitlab url
	url = "http://"
	// Name of your GITLAB project team
	groupName = "ops"
)
func main() {

	for {
		git, err := gitlab.NewClient(token, gitlab.WithBaseURL(url))

		if err != nil {
			log.Fatalf("Failed to create client: %v", err)
		}

		log.Println("开始获取所有组信息")

		u := &gitlab.ListGroupsOptions{
			Search: gitlab.String(groupName),
		}
		group, _, err := git.Groups.ListGroups(u)

		if err != nil {
			fmt.Printf("获取组信息异常:%v", err)
			panic(err)
		}

		for _, group := range group {
			log.Println("组名:",group.Name, "创建时间:", group.CreatedAt.Format("2006-01-02"))
			if group.Name == groupName {
				// Get Merge Requests List
				log.Printf("获取:%v项目Merge Requests开始...", groupName)
				ListMergeOps := &gitlab.ListGroupMergeRequestsOptions{
					OrderBy: gitlab.String("updated_at"),
					State: gitlab.String("opened"),
					Scope: gitlab.String("all"),
				}
				// List Group Merge
				mr, _, err := git.MergeRequests.ListGroupMergeRequests(group.ID, ListMergeOps)
				// List All Merge Requests
				//mr, _, err := git.MergeRequests.ListMergeRequests(ListMergeOps)
				if err != nil {
					panic(err)
				}
				for _, mr := range mr {
					log.Printf("用户:%v发起了一个MR请求,描述信息:%v, MR_ID: %v, 项目ID: %v", mr.Author.Name, mr.Title, mr.IID, mr.ProjectID)
					// Auto merge request
					MergeSave := &gitlab.AcceptMergeRequestOptions{}
					merge, code, err := git.MergeRequests.AcceptMergeRequest(mr.ProjectID, mr.IID, MergeSave)
					if err != nil {
						fmt.Println(err)
					}
					switch code.StatusCode{
					case 405:
						log.Println("当前Merge Requests存在草稿,暂时不能合并")
					case 406:
						log.Println("Merge Requests合并失败,当前代码存在冲突请解决后再试!")
					case 200:
						log.Println("恭喜你,Merge Requests合并成功.")
					default:
						log.Println("等待下一次检查中.")
					}
					log.Println(merge)
				}
			}
		}
		time.Sleep(time.Duration(30)*time.Second)
	}
}

接下来我们向gitlab发起一个merge requests,等待30s秒将会自动合并。

2021/03/26 16:34:12 开始获取所有组信息
2021/03/26 16:34:12 组名: ops 创建时间: 2021-03-08
2021/03/26 16:34:12 获取:ops项目Merge Requests开始...
2021/03/26 16:34:12 用户:张三发起了一个MR请求,描述信息:新增ibe配置, MR_ID: 6, 项目ID: 77
2021/03/26 16:34:14 恭喜你,Merge Requests合并成功.

基于Python 版本的gitlab requests 自动合并脚本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File  : GitLab-API.py
# @Author: 风哥
# @Email: gujiwork@outlook.com
# @Date  : 2021/3/25
# @Desc  : gitlab自动合并请求
import gitlab
from gitlab.exceptions import GitlabMRClosedError
import time


url = 'http://'  # gitlab安装地址
private_token = ''  # gitlab 登录密钥 需自己设置


while True:
    # 登录 获取gitlab操作对象gl
    gl = gitlab.Gitlab(url, private_token)
    group = gl.groups.get('ops')
    mrs = group.mergerequests.list(state='opened', order_by='updated_at')
    for i in mrs:
        msg = "用户:{0}发起了一个MR请求, 描述信息:{1}, MR_ID: {2}, 项目ID:{3}".format(i.author['name'], i.title, str(i.iid), str(i.project_id))
        project = gl.projects.get(i.project_id, lazy=True)
        mr = project.mergerequests.get(i.iid, lazy=True)
        try:
            print("开始自动合并代码")
            mr.merge()
            print("自动合并MR成功!")
        except GitlabMRClosedError as e:
            if e.response_code == 405:
                print("MR存在Draft草稿, Closed关闭, Pipline状态, 返回状态码405不允许操作")
            elif e.response_code == 406:
                print("自动合并失败, 当前存在冲突,请手动解决后再试!")
            else:
                print("出现异常,暂时无法自动合并!")

        # print(mr)
    time.sleep(30)

ansible register以及循环,判断


2020年7月02日 12:41:19   2,543 次浏览

register

注意:

register变量的命名不能用 -中横线,比如dev-sda6_result,则会被解析成sda6_result,dev会被丢掉,所以不要用-
ignore_errors这个关键字很重要,一定要配合设置成True,否则如果命令执行不成功,即 echo $?不为0,则在其语句后面的ansible语句不会被执行,导致程序中止。

拉取远程主机 /tmp/test/目录下所有文件

- hosts: ansible-demo3 
  tasks:
    - name: find
      find: paths=/tmp/test/ patterns="*" recurse=yes
      register: file_list

    - name: get
      fetch:src="{{ item.path }}" dest=./
      with_items: "{{ file_list.files }}"

循环

ansible中的循环都是借助迭代来实现的。基本都是以”with_”开头。以下是常见的几种循环。

with_items迭代列表

ansibel支持迭代功能。例如,有一大堆要输出的命令、一大堆要安装的软件包、一大堆要copy的文件等等。

例如,要安装一堆软件包。

---
    - hosts: localhost
      tasks: 
        - yum: name="{{item}}" state=installed
          with_items: 
            - pkg1
            - pkg2
            - pkg3

它会一个一个迭代到特殊变量{{item}}处。

with_dict迭代字典项

使用”with_dict”可以迭代字典项。迭代时,使用”item.key”表示字典的key,”item.value”表示字典的值。

例如:

---
    - hosts: localhost
      tasks:
        - debug: msg="{{item.key}} & {{item.value}}"
          with_dict: { address: 1,netmask: 2,gateway: 3 }

另一种情况,字典是已存储好的。例如ansible facts中的ansible_eth0.ipv4,其内容如下:

"ipv4": {
    "address": "192.168.100.65",
    "netmask": "255.255.255.0",
    "gateway": "192.168.100.2"
}

这种情况下,with_dict处可以直接指定该字典的key。即:

---
    - hosts: localhost
      tasks:
        - debug: msg="{{item.key}} & {{item.value}}"
          with_dict: ansible_eth0.ipv4

再例如,直接引用playbook中定义的vars。

---
 - hosts: 192.168.100.65
   gather_facts: False
   vars:
     user: 
        longshuai_key: 
           name: longshuai
           gender: Male
        xiaofang_key: 
           name: xiaofang
           gender: Female
   tasks:
      - name: print hash loop var
        debug: msg="{{ item.key }} & {{ item.value.name }} & {{ item.value.gender }}"
        with_dict: "{{ user }}"

with_fileglob迭代文件

例如,拷贝一堆用通配符匹配出来的文件到各远程主机上。

---
    - hosts: centos
      tasks: 
        - copy: src="{{item}}" dest=/tmp/
          with_fileglob:
            - /tmp/*.sh
            - /tmp/*.py

注意,通配符无法匹配”/”,因此无法递归到子目录中,也就无法迭代子目录中的文件。

with_lines迭代行

with_lines很好用,可以将命令行的输出结果按行迭代。

例如,find一堆文件出来,copy走。

---
    - hosts: localhost
      tasks:
        - copy: src="{{item}}" dest=/tmp/yaml
          with_lines:
            - find /tmp -type f -name "*.yml"

with_nested嵌套迭代

嵌套迭代是指多次迭代列表项。例如:

---
    - hosts: localhost
      tasks:
        - debug: msg="{{item[0]}} & {{item[1]}}"
          with_nested: 
            - [a,b]
            - [1,2,3]

结果将得到”a & 1″、”a & 2″、”a & 3″、”b & 1″、”b & 2″和”b & 3″共6个结果。

条件判断

在ansible中,只有when可以实现条件判断。

tasks: 
  - name: config the yum repo for centos 6
    yum_repository:
       name: epel
       description: epel
       baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
       gpgcheck: no
    when: ansible_distribution_major_version == "6"

注意两点:

when判断的对象是task,所以和task在同一列表层次。它的判断结果决定它所在task是否执行,而不是它下面的task是否执行。

when中引用变量的时候不需要加{{ }}符号。

此外,还支持各种逻辑组合。

tasks:

# 逻辑或
  - command: /sbin/shutdown -h now
    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
          (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

# 逻辑与
  - command: /sbin/shutdown -t now
    when:
      - ansible_distribution == "CentOS"
      - ansible_distribution_major_version == "6"

# 取反
  - command: /sbin/shutdown -t now
    when: not ansible_distribution == "CentOS"

还可以直接直接引用布尔值的变量。

---
    - hosts: localhost
      vars:
        epic: False

      tasks:
        - debug: msg="This certainly is epic!"
          when: not epic

此外,可以使用jinja2的defined来测试变量是否已定义,使用undefined可以取反表示未定义。例如:

tasks:
    - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined

    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is undefined

 

 

 

自动化测试之UI Recorder问题整理


2019年5月09日 10:25:35   2,429 次浏览

问题1: nodejs安装在c盘,我想把uirecorder安装在d盘命令怎么修改?

例如

npm config set prefix "D:\nodejs\node_global"

npm config set cache "D:\nodejs\node_cache"

问题2:配置了浏览器,但是在webdriver界面上为什么只显示了IE 8??

检查: DB 有没有数据,wd_nodes 表,wd_browsers表

因为之前是只上报了IE浏览器,后面新加的chrome 和FireFox,把这两个表的数据wd_browsers、wd_nodes, 这个节点关联的数据清空一下,然后它会重新上报,就能看到

问题3:我录制的时候浏览器不是最大化录制的,后来点击了最大化,在进行回归测试的时候那一步失败了,请问录制的时候必须要全屏吗?

录制的时候,终端提示要输入分辨率,然后固定窗口录制就可以了,手动点击最大化录制过程是没监听到的。

问题4:日历菜单我录制的时候捕获不到,添加悬停回测还是无法捕获

触发事件是 click 还是 hover?在触发事件后加延迟试试?日历控件的DOM节点加载应该需要一点时间。

问题5:运行多次uirecorder,生成的报告会覆盖上一次的报告,怎么解决?

运行完之后,copy报告保存就可以了。

问题6:生成的报告怎么只关注失败用例情况?

目前只能通过写脚本的方式去解决, uirecorder官方后期会进行一个优化将报告生成json文件,可以更方便脚本去调用。