Git - 基于GitLab API操作Depoly Keys [附代码]

2019/03/19 Git

使用GitLab API为指定项目开启DepolyKeys

背景

  • 为什么使用DepolyKeys?
      1. 安全
      1. 不需要像SSH Keys一样开通用户
      1. Depoly Keys是全局的,每个项目都可以enable
      1. Depoly Keys不需要担心用户离职删除账户问题
      1. Depoly Keys 只有git pull的权限,没有git push权限,用于发布足够安全
  • 我们这里发布流程大概是这样子:
      1. gitlab提交代码,打Tag出发update钩子
      1. 钩子逻辑匹配,像运维平台提交对应发布任务
      1. 运维平台连接指定SaltServer服务器进行代码分发操作
      1. 代码发布:enable depoly keysgit clone–>git pull—>git checkout <tag>—>rsync_code—>code_backup—>publish code从而完成整个操作

实现

  • 官方文档:https://docs.gitlab.com/ee/api/deploy_keys.html

    以上问题,除了每次都要登陆gitlab找到对应的版本库信息进行Enabled DepolyKeys外,所有的都已经全自动化操作,懒顿即美德,所以想着Gitlab既然有API,那就用API来让他自动操作吧,所以本章主要记录下GitLab API 开启 Depoly Keys的过程。

授权

GitLab生成Access Token

既然要用APi,认证信息必然不可少。

  • 我们登陆GitLab 找到账户信息,生成一个Token,登陆进入Profile Setting — Account

image

image

  • API使用
#get就可以列出所有的keys
GET /deploy_keys
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/deploy_keys"

image

简单了解下API用法,直接上我们用到的Enable Depoly key

官方链接:https://docs.gitlab.com/ee/api/deploy_keys.html#enable-a-deploy-key

以上,开启需要知道你的Depoly KeysID和项目ID


curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/5/deploy_keys/13/enable

以下是我的python脚本实例,仅供参考

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/3/19 14:06
# @Author  : Fred Yangxiaofei
# @File    : depoly_key_enable.py
# @Role    : 通过API启用Deploy_key

import os
import sys

Base_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(Base_DIR)

from yanghongfei.settings import GITLAB_TOKEN
import json
import requests
import fire


class GitLabAPI():
    def __init__(self, project_name):
        """
        :param project_name:  项目名字,简写,如:gitlab里面的项目名字
        """
        self.access_token = GITLAB_TOKEN
        self.gitlab_url = 'http://doamin.com'
        self.project_name = project_name

    def get_project_id(self):
        project_url = "{}/api/v4/projects/".format(self.gitlab_url)
        headers = {
            "PRIVATE-TOKEN": self.access_token
        }
        resp = requests.get(project_url, headers=headers)
        if resp.status_code == 200:
            projects_info = json.loads(resp.text)
            for project in projects_info:
                if self.project_name in project['name']:
                    return project['id']
        else:
            print('[Error]: GitlabALy访问失败!')
            exit(-1)

    def enable_project_depoly_keys(self):
        project_id = self.get_project_id()
        depoly_key_id = '4'  # 我们只有一个id,就不写脚本获取了,直接写在这里,获取方式:curl --header "PRIVATE-TOKEN: <your_access_token>" "http://domain.com/api/v4/deploy_keys"
        project_url = "{}/api/v4/projects/{}/deploy_keys/{}/enable".format(self.gitlab_url, project_id, depoly_key_id)
        headers = {
            "PRIVATE-TOKEN": self.access_token
        }
        resp = requests.post(project_url, headers=headers)
        if resp.status_code == 201:
            print('[Sucess]: {} DepolyKeys Enable sucessfully!'.format(self.project_name))
        else:
            print('[Error]: {} DepolyKeys Enable falied!'.format(self.project_name))
            exit(-2)


def main(project_name):
    obj = GitLabAPI(project_name)
    obj.enable_project_depoly_keys()


if __name__ == '__main__':
    fire.Fire(main)

Search

    扫码加微信进入OpenDevOps群

    Yangxiaofei

    Table of Contents