如何使用构建代理对接私有代码仓库
对于搭建在内网的私有代码仓库,可以通过部署构建代理与代码仓库进行对接。构建代理是一个运行在与代码仓库同一内网的服务,负责接受与处理代码仓库的webhook请求,并根据请求中所包含的信息向代码仓库拉取指定版本的代码快照,并将代码快照上传到灵雀云构建服务器上,同时触发构建。
构建代理所支持的代码仓库
目前灵雀云构建代理支持如下的代码仓库:
对接Gitlab
搭建Gitlab
安装环境基于ubuntu14.04
,其它环境的安装说明可参考Gitlab的官方文档。
安装和配置必须的依赖:
sudo apt-get install curl openssh-server ca-certificates postfix
在安装
postfix
会出现如下配置界面:- 如果不需要邮件功能,使用方向键选中
No configuration
确认即可。 - 如果想通过
postfix
来发送邮件,选择Internet Site
回车确认,确认后根据页面提示填入mail name
(例如alauda.cn
)。
- 如果不需要邮件功能,使用方向键选中
安装Gitlab
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo apt-get install gitlab-ce
配置Gitlab
sudo gitlab-ctl reconfigure
打开浏览器进行登录
打开浏览器输入http://<server_ip>
打开gitlab页面,使用root
和5iveL!fe
作为用户名和密码以管理员身份进行登录。
根据提示重设密码后,再次登录即可在图形界面创建用户组、用户和代码仓库。
创建镜像构建仓库
登录灵雀云控制台,进入镜像构建仓库创建页面,并选择文件上传:
输入镜像仓库的名称并点击创建即可创建文件上传类型的镜像构建仓库。
安装并配置构建代理
编写配置文件
用户需要使用配置文件向服务提供运行所需的用户的账号与仓库信息,在启动docker容器时用户需要使用-v
参数将自己编写的配置文件挂载到docker容器中指定的位置(/var/alauda_silencer_cfg.
)。
配置文件使用json
格式进行编写,配置文件样例:
{
"auth": {
"username": "<alauda_user>",
"password": "<alauda_password>"
},
"repositories": {
"<code_repo_name1>": {
"image_repo_name": "<alauda_repo_name>",
"namespace": "<alauda_repo_namespace>",
"code_repo_account": {
"username": "<code_repo_username>",
"password": "<code_repo_password>"
}
},
"<code_repo_name2>": {
...
},
...
}
}
样例中使用<>
包含起来的字段需要根据自己的代码仓库信息和对应的灵雀云的镜像构建仓库的信息填写。各个字段的含义如下:
<alauda_user>
: 灵雀云账号的用户名。<alauda_password>
: 灵雀云账号的密码。<code_repo_name>
: 代码仓库的名称。<alauda_repo_name>
: 镜像构建仓库的名称。<namespace>
: 镜像构建仓库所在的namespace
。(即镜像构建仓库的创建者的用户名,或镜像仓库所属的组织名称)<code_repo_username>
: 代码仓库的用户名(agent server在clone代码时需要用到,请确保该用户有权限下载该仓库的代码)。<code_repo_password>
: 代码仓库的密码。
下面是一个实际应用场景中的例子:
小文在灵雀云平台上有一个帐号,账号名是:xiaowenalauda,密码是:12345。 小文在Gitlab上的帐号是:xiaowen-gitlab,密码是:54321。
现在小文想要对他Gitlab仓库中的Django-blog项目进行持续构建,项目截图如下:
小文在灵雀云平台上为Django-blog项目创建了一个镜像构建仓库django-blog-image:
上述场景中,小文需要编写的配置如下:
{
"auth": {
"username": "xiaowenalauda",
"password": "12345"
},
"repositories": {
"Django-blog": {
"image_repo_name": "django-blog-image",
"namespace": "xiaowenalauda",
"code_repo_account": {
"username": "xiaowen-gitlab",
"password": "54321"
}
}
}
}
保存配置文件
更改配置文件之后,将配置文件以alauda_silencer_cfg
命名,并保存至/etc/alauda/
(如果没有/etc/alauda
目录,则使用sudo mkdir -p /etc/alauda
创建该目录)目录下。
运行服务
sudo docker run -d -p 8081:80 --restart=on-failure:10 \
-v /etc/alauda/alauda_silencer_cfg:/var/.alauda_silencer_cfg \
--name=alauda_build_agent \
index.alauda.cn/mathildedev/silencer:v0.14
运行上述命令后可以使用如下命令来查看容器的运行状态:
sudo docker ps
使用gitlab webhook对接构建代理
进入gitlab的代码仓库的settings
页面:
填入web hook的回调url地址,即将上图urlhttp://54.68.2.83:8081/api/v1/gitlab/build/
的ip地址(54.68.2.83
)换成agent server所在机器的ip地址。并勾选push events
和tag push events
作为webhook的触发条件。这样当代码仓库有新的提交时webhook就会向指定的回调地址发送POST请求,并在该请求中携带此次提交的详细信息。
对接Gitolite
搭建Gitolite
本指南安装是在ubuntu:14.04环境下进行的,更加详细的安装与配置说明可以参考官方文档。
安装gitolite:
- 安装依赖环境:
gitolite依赖于git
和ssh
,ssh
在ubuntu的发行版本中已经安装了,只需安装git
即可:apt-get update && apt-get install git
创建
git
用户并为其添加sudo
权限:- 切换到
root
用户:sudo -s
- 创建名为
git
的新用户:adduser git
根据提示填写密码和其它信息。 - 为
git
用户添加sudo
权限:vi /etc/sudoers
打开该文件,并在root ALL=(ALL:ALL) ALL
下面添加如下一行:git ALL=(ALL:ALL) ALL
- 切换到
安装
gitolite
:- 切换到
git
用户并切换到其家目录:su git && cd
- 在家目录下创建
bin
目录并将其添加到$PATH
中:
运行mkdir $HOME/bin
打开$HOME/.bashrc
文件,并在文件末尾添加如下一行:export PATH=$HOME/bin:$PATH
保存文件后运行source $HOME/.bashrc
。
- 切换到
git clone git://github.com/sitaramc/gitolite
- 运行如下命令,进行安装:
gitolite/install -ln
- 安装依赖环境:
- 配置:
将个人的ssh public key
拷贝到当前目录,并以<username>.pub
的形式命名,例如这里publick key
命名为ysyou.pub
。
运行如下命令完成初始配置:gitolite setup -pk ysyou.pub
配置gitolite webhook
gitolite默认并没有提供类似于github等的webhook功能,因此需要手动为其添加自己的git hook可执行文件来实现webhook功能。
环境依赖
python3
requests
simplejson
我们目前支持的webhook是基于notify-webhook这款开源git hook项目的自行改造版本。此项目基于python3
编写,并使用了requests
和simplejson
这两个类库,因此要使用此项目需要安装这些依赖环境和类库。
ubuntu14.04可按如下步骤进行安装:
- 安装
pip3
:sudo apt-get update && apt-get install python3-pip
- 安装依赖包:
sudo pip3 install --upgrade simplejson requests
修改.gitolite.rc
文件
修改.gitolite.rc
配置文件,使其允许添加自定制的hook文件。
修改
GIT_CONFIG_KEYS
使其允许更改git configs(详细的git config列表可以参考官方文档):
GIT_CONFIG_KEYS => '.* '
修改
LOCALE_CODE
更改自定义添加代码的存放位置,这里将其更改为$rc{GL_ADMIN_BASE}/local
。这样自行添加代码的位置便是gitolite-admin
仓库下的local
目录下,自己添加的hook文件则在该仓库的local/hooks/repo-specific
目录下:LOCAL_CODE => '$rc{GL_ADMIN_BASE}/local'
将
ENABLE
下的repo-specific-hooks
的注释去掉,来允许我们可以为单独的仓库添加hook。
配置webhook
- 将
gitolite-admin
仓库clone
下来。 - 进入仓库下的
local/hooks/repo-specific
目录下,如果没有该目录则需手动创建该目录。 将
notify-webhook.py
这个hook插件下载到local/hooks/repo-specific
目录下,改名为notify-webhook
并将其更改为可执行文件:wget https://s3.cn-north-1.amazonaws.com.cn/alauda-cn-public/notify-webhook -O notify-webhook && chmod +x notify-webhook
修改该仓库下的
conf/gitolite.conf
文件,为指定的仓库添加hook,这里以testing
仓库为例:repo testing: RW+ = @all option hook.post-receive = notify-webhook config meta.url = "ssh://git@<git_server_url>:22" config hooks.webhookurl = "http://<build_agent_url>:8081/api/v1/gitolite/build/" config hooks.webhook-contenttype = "application/json"
注意:
config meta.url = "ssh:///git@<git_server_url>:22"
将其中的<server_url>
替换成git服务器的ip地址或域名。config hooks.webhookurl = "http://<build_agent_url>:8081/api/v1/gitolite/build/"
将其中的<build_agent_url>
替换成换成agent server所在机器的ip地址。- 将修改进行
commit
并push
到gitolite所在的git服务器上。
安装并配置构建代理
编写配置文件
用户需要使用配置文件向服务提供运行所需的用户的账号与仓库信息,在启动docker容器时用户需要使用-v
参数将自己编写的配置文件挂载到docker容器中指定的位置(/var/alauda_silencer_cfg.
)。
配置文件使用json
格式进行编写,配置文件样例:
{
"auth": {
"username": "<alauda_user>",
"password": "<alauda_password>"
},
"repositories": {
"<code_repo_name1>": {
"image_repo_name": "<alauda_repo_name>",
"namespace": "<alauda_repo_namespace>",
"code_repo_account": {
"username": "<code_repo_username>",
"private_key_path": "/id_rsa"
}
},
"<code_repo_name2>": {
...
},
...
}
}
样例中使用<>
包含起来的字段需要根据自己的代码仓库信息和对应的灵雀云的镜像构建仓库的信息填写。各个字段的含义如下:
<alauda_user>
: 灵雀云账号的用户名。<alauda_password>
: 灵雀云账号的密码。<code_repo_name>
: 代码仓库的名称。<alauda_repo_name>
: 镜像构建仓库的名称。<namespace>
: 镜像构建仓库所在的namespace
。(即镜像构建仓库的创建者的用户名,或镜像仓库所属的组织名称)<code_repo_username>
: 代码仓库的用户名(agent server在clone代码时需要用到,请确保该用户有权限下载该仓库的代码)。
下面是一个实际应用场景中的例子:
小文在灵雀云平台上有一个帐号,账号名是:xiaowenalauda,密码是:12345。 小文在Gitolite上的帐号是:xiaowen-gitolite。
小文在灵雀云平台上为Django-blog项目创建了一个镜像构建仓库django-blog-image: 上述场景中,小文需要编写的配置如下:
{
"auth": {
"username": "xiaowenalauda",
"password": "12345"
},
"repositories": {
"Django-blog": {
"image_repo_name": "django-blog-image",
"namespace": "xiaowenalauda",
"code_repo_account": {
"username": "xiaowen-gitolite",
"private_key_path": "/id_rsa"
}
}
}
}
保存配置文件
更改配置文件之后,将配置文件以alauda_silencer_cfg
命名,并保存至/etc/alauda/
(如果没有/etc/alauda
目录,则使用sudo mkdir -p /etc/alauda
创建该目录)目录下。
运行服务
sudo docker run -p 8081:80 -d --restart=on-failure:10 \
-v /etc/alauda/alauda_silencer_cfg:/var/.alauda_silencer_cfg \
-v <local_private_key_path>:/id_rsa \
--name=alauda_build_agent \
index.alauda.cn/mathildedev/silencer:v0.14
注意: 将上面命令中的<local_private_key_path>
更改为ssh private key所在的路径(如:$HOME/.ssh/id_rsa
)。
运行上述命令后可以使用如下命令来查看容器的运行状态:
sudo docker ps
启停与调试构建代理
停止容器:
sudo docker stop alauda_build_agent
重启容器:
sudo docker restart alauda_build_agent
查看日志:
docker logs -f --tail=100 alauda_build_agent