Github资源中转至Gitlab

简单说下需求,由于公司内外网是隔离的,为了在内网能够学习github上的一些源码资源,故通过DMZ服务器在外网下载github的资源,然后上传至内网的gitlab服务器(这里为了与外网保持一致,所有代码仓库的资源全部用相应的owner进行上传,这样做可为后期的扩展提供更多可能性)。其中涉及的问题是,如何自动化去爬取github资源,然后上传至gitlab中。先给个简要流程:

  • 下载、安装并配置gitlab服务
  • 通过github api(v3 or graph v4)去查询github资源(查询所需下载的仓库是否更新以及是否发布最新release)
  • 通过python自动通过git去clone仓库,通过requests包爬取release资源
  • 通过gitlab的api去创建相应仓库的所有者
  • 通过python自动通过git去push代码至gitlab(这里还涉及修改.git/config文件中的信息)
  • 通过python自动通过git去push所有tag信息
  • 通过gitlab api去创建release信息
  • 通过nginx代理下载的release信息
  • 下载上传仓库的wiki信息(可选)

1 Gitlab的安装与配置

1.1Gitlab的安装

关于gitlab的安装可参考这篇博文
这里以centos7为例,先下载安装gitlab所需的依赖文件。

sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

关闭防火墙,或者开放http以及https的端口

sudo systemctl stop firewalld 临时关闭
sudo systemctl disable firewalld   然后reboot 永久关闭
sudo systemctl status  firewalld 查看防火墙状态。

安装邮件服务,gitlab有时需要邮件通知

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

下载gitlab官方提供的脚步,添加gitlab的yum源,也可以自己手动添加yum源

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh > rpm.sh
chmod +x rpm.sh
./rpm.sh

安装gitlab

#使用yum安装gitlab
yum install -y gitlab-ee

#可以看下gitlab-ee包的内容,看到gitlab安装在/opt/gitlab目录下
rpm -ql gitlab-ee | less

1.2Gitlab的配置

这里的配置主要包含两项,一项是gitlab的访问地址,一项是gitlab的监听端口。
首先打开配置文件gitlab.rb:

vim /etc/gitlab/gitlab.rb

通过配置external_url来设置访问地址,我这里就直接设置为github的网址,而且是通过https访问的。如果是通过https的访问那就就要涉及证书的问题,如果不想这么麻烦就设置http就行:

externel_url 'https://github.com'

1.2.1gitlab自带nginx的配置

如果你的gitlab服务器上没有下载使用nginx代理服务,那么可以直接在gitlab的配置文件中配置/etc/gitlab/gitlab.rb(gitlab自带nginx模块)
如果你是使用的http服务,那么监听80端口,如果有冲突可改为别的端口

nginx['enable'] = true
nginx['listen_port'] = 80
nginx['listen_addresses'] = ['*']

如果使用https服务,那么监听443端口,注意这里需要配置CA证书,如果没有https的CA证书,且懒得申请,可参考这篇博文自己生成一个

nginx['enable'] = true
nginx['listen_port'] = 443
nginx['listen_addresses'] = ['*']
nginx['ssl_certificate'] = "/path/to/CA.cer"
nginx['ssl_certificate_key'] = "/path/to/CA.pvk"

1.2.2配置自己下载的nginx

如果你的gitlab服务器上已经有使用nginx服务,为了不与gitlab中的nginx产生冲突,可以采取两个办法。
1)避免gitlab中的nginx监听端口与你自己使用的nginx服务监听端口重复。只要这两个nginx服务的监听端口不一样,是不会有冲突的。

2)关闭gitlab中的nginx服务,全部使用自己下载的nginx服务。
这里以第二种情况为例:
同样配置https服务,编辑/etc/gitlab/gitlab.rb这里监听127.0.0.1的8085端口,且不用配CA证书。

nginx['enable'] = false

gitlab_rails['trusted_proxies'] = ['127.0.0.1']
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "127.0.0.1:8085"

接着配置自己下载的nginx服务,将访问github.com(刚刚设置的external_url)的请求全部转发到gitlab服务。新建一个conf文件,这里监听的是443端口,然后同样要配置https证书。这里还配置了一个正向代理,代理的本机的release文件夹,就是从github上下载的所有release文件。

server {
    listen 443 ssl;

    server_name github.com;
    server_tokens off; ## Don't show the nginx version number, a security best practice

    ## Strong SSL Security
    ## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html & https://cipherli.st/
    ssl_certificate /path/to/CA.cer;
    ssl_certificate_key /path/to/CA.pvk;

    location / {
        proxy_cache off;
        proxy_pass http://127.0.0.1:8085; 
        proxy_redirect http:// https://; 
        # proxy_ssl_server_name on;
        proxy_set_header Host $host;
        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /release {
        alias /data/github_release/;
        autoindex on;  
    }
}

2 获取Github资源

这里主要获取仓库的源码以及release信息,而且需要定时检查更新。这里可以使用github的api去获取我们想要的信息。关于github的api有v3以及v4(graph)两种,v3的不需要验证token返回的信息很多(其中会包含很多无用信息),v4需要github的token可根据自己的搜索请求获得相应的信息(推荐v4)。

2.1 v3 api

这里给出两个url,一个是用于查看仓库信息的请求url,一个是查看最新release信息的请求url。
1)https://api.github.com/repos/alibaba/canal
这里以alibaba的canal仓库为例,通过请求https://api.github.com/repos/{owner}/{repository}就能获取该仓库的所有信息(以json格式返回),对于检查更新,我们只需关注其中的updated_atpushed_at两个参数即可。
api url12)https://api.github.com/repos/alibaba/canal/releases/latest
这里同样以alibaba的canal仓库为例,通过请求https://api.github.com/repos/{owner}/{reposirory}/releases/latest就能够获取到最新的release信息(以json格式返回)。这里通过tag_name字段能够知道是否有最新的release信息。通过assets字段(list列表)中每个元素的name以及url信息获取release文件的名称以及下载地址。然后可以使用python的requsts库去下载。
api url2

2.2 v4 graph api

v4版的api使用起来其实会更方便些,因为能够一次同时查询到仓库的更新时间以及release信息等(可根据自己的需求查询相应的信息)。这里先给个github的官方graph api网址,这个网址是需要登录github账号后才能使用的。关于v4 api的使用,自己可查官方文档。
下图展示了使用graph api查询的示例,通过graphql语句一次性查询到所需的仓库信息。

{
  repository(name: "canal", owner: "alibaba") {
    releases(last: 1, orderBy: {field: CREATED_AT, direction: ASC}) {
      nodes {
        description
        tagName
        releaseAssets(last: 50) {
          nodes {
            downloadUrl
            size
            name
          }
        }
        isPrerelease
      }
    }
    pushedAt
  }
}

api url3
这里需要注意,使用该api时,需要github的token,这个token是在自己用户的设置中生成的:
Settings -> Developer settings -> Personal access tokens

在python3中发起查询请求的方式:
请求的url就是https://api.github.com/graphqlPOST请求
请求时需要将token添加至请求的header中,注意在token(a2xxxf)前加上bearer字段

headers = {"Authorization": "bearer a2xxxxxxxxxxxf"}

接着将刚刚的查询语句graphql语句转成json格式放在请求的body中。

2.3 clone 仓库源文件

这里可以使用python的subprocess库调用git工具clone项目(需提前下载好git分工具)。大致方法如下:

import subprocess as sub

url = "https://github.com/alibaba/canal.git"
commands = "git clone {}".format(url)
sub.run(commands, cwd=path, shell=True, 
        timeout=3600, encoding='utf-8', check=True)

3 上传资源至Gitlab

这里为了和github上的仓库信息保持一致,所以在上传至gitlab之前,先创建好相应用户,比如刚刚下载的alibaba的canal仓库,我们需要创建一个名为alibaba的用户,然后将canal源码push到alibaba的用户仓库下。
那么这里就涉及gitlab的用户查询,用户创建等操作,而且push完后,还要修改代码仓库的可见性(默认是私有的)。这里就需要使用gitlab的api了。下面给了个查看gitlab的api网址,其中{gitlab_url}是你自己搭建的gitlab服务访问地址。
https://{gitlab_url}/help/api/README.md

调用gitlab的api同样需要一个访问api的token,在gitlab中:
Settings -> Access Tokens -> Add a personal access token

3.1 push源码资源

1)首先通过以下接口去查询该代码仓库的owern是否存在。其中gitlab_url为自己搭建的gitlab服务器的url,owner为该仓库的所有者。
"https://{gitlab_url}/api/v4/users?username={owner}", GET请求

2)如果返回为空,说明该owner不存在,则调用api自动创建用户(这要是管理员用户的token才行)。由于该接口涉及的参数很多,所以请参考gitlab的user模块接口文档,其中gitlab_url为自己搭建的gitlab服务器的url。
https://{gitlab_url}/help/api/users.md

3)修改clone项目的中的.git/config文件
在clone的项目文件夹下的.git文件夹中有个config文件。我们修改下[remote "origin"]下的url参数,这里是以alibaba的canal为例,
url = git@{gitlab_url}:alibaba/canal.git其中的gitlab_url为自己搭建的gitlab服务器地址。

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@{gitlab_url}:alibaba/canal.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master

4)push文件,在修改完config文件后同样使用python的subprocess库去调用git工具去push资源。假设该仓库的默认分支是master,直接通过git push origin master指令即可将源码push至gitlab中。如果要上传所有分支的数据直接通过git push --all origin指令即可。

3.2 push tags信息

在push完源码后,接着push所有的tags信息。同样使用python的subprocess库去调用git工具去push资源。指令:git push --tags

3.3 push release信息

如果前面下载了相关仓库的release文件,那么这里将相应的release信息push到项目中。所使用到的api地址如下,其中gitlab_url为自己搭建的gitlab服务器的url,project_id为项目的id号,可以在project模块的相关api中查询到(根据owner和仓库repositoty名称)。
https://{gitlab_url}/api/v4/projects/{project_id}/releasesPOST方法
在body中需要传入如下字典,其中name为仓库的名称(可自定义);tag_name为我们获取release信息时得到的tag_name这个参数是与仓库的tag版本号对应的,不能随便填; description为描述信息,assets为release中下载文件的名称以及对应下载地址(下载文件的地址就是自己下载文件后通过nginx做的正向代理地址)。

data = {"name": repository_name,
        "tag_name": tag_name,
        "description": description,
        "assets": {"links": new_assets}}
# for example
new_assets = [{'name': 'canal-1.14.tar.gz',
               'url': 'gitlab.xxx.com/canal-1.14.tar.gz',
               'size': 123432},
               {'name': 'canal-admin-1.14.tar.gz',
               'url': 'gitlab.xxx.com/canal-admin-1.14.tar.gz',
               'size': 2512342}]

3.4 修改项目可见性

1)首先查看该项目的可见性,其中gitlab_url为自己搭建的gitlab服务器的url,user_id为用户的id号,project_name为项目仓库的名称。
https://{gitlab_url}/api/v4/users/{user_id}/projects?search={project_name}GET方法

2)若可见性为私有,设置为公开。其中gitlab_url为自己搭建的gitlab服务器的url,project_id为项目仓库的id号。
https://{gitlab_url}/api/v4/projects/{project_id}?visibility=publicPUT方法

4 WIKI的下载与上传

1)首先查看该项目的仓库是都否有WIKI,例如alibaba的canal,点击wiki后可以看到是否有wiki资源。
wiki如果有的话,在右侧目录的最下方会有clone的地址,例如alibaba的canal:
https://github.com/alibaba/canal.wiki.git

2)使用python的subprocess库通过git工具clone该wiki
git clone https://github.com/alibaba/canal.wiki.git

3)修改.git/config文件
这里依旧以alibaba的canal为例,在wiki项目的.git/config文件中修改[remote "origin"]下的url。其中gitlab_url为自己搭建的gitlab服务器的url。

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = git@{gitlab_url}:alibaba/canal.wiki.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master

4)push资源:同样使用python的subprocess库去调用git工具去push wiki资源。假设该仓库的默认分支是master,直接通过git push origin master指令即可将wiki push至gitlab中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳花的小绿豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值