如何使用构建代理对接私有代码仓库

对于搭建在内网的私有代码仓库,可以通过部署构建代理与代码仓库进行对接。构建代理是一个运行在与代码仓库同一内网的服务,负责接受与处理代码仓库的webhook请求,并根据请求中所包含的信息向代码仓库拉取指定版本的代码快照,并将代码快照上传到灵雀云构建服务器上,同时触发构建。

构建代理所支持的代码仓库

目前灵雀云构建代理支持如下的代码仓库:

对接Gitlab

搭建Gitlab

安装环境基于ubuntu14.04,其它环境的安装说明可参考Gitlab的官方文档

  1. 安装和配置必须的依赖:

    sudo apt-get install curl openssh-server ca-certificates postfix
    

    在安装postfix会出现如下配置界面:

    • 如果不需要邮件功能,使用方向键选中No configuration确认即可。
    • 如果想通过postfix来发送邮件,选择Internet Site回车确认,确认后根据页面提示填入mail name(例如alauda.cn)。
  2. 安装Gitlab

    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
    sudo apt-get install gitlab-ce
    
  3. 配置Gitlab

    sudo gitlab-ctl reconfigure
    
  4. 打开浏览器进行登录
    打开浏览器输入http://<server_ip>打开gitlab页面,使用root5iveL!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 eventstag push events作为webhook的触发条件。这样当代码仓库有新的提交时webhook就会向指定的回调地址发送POST请求,并在该请求中携带此次提交的详细信息。

对接Gitolite

搭建Gitolite

本指南安装是在ubuntu:14.04环境下进行的,更加详细的安装与配置说明可以参考官方文档

  1. 安装gitolite:

    • 安装依赖环境:
      gitolite依赖于gitsshssh在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
  2. 配置:
    将个人的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编写,并使用了requestssimplejson这两个类库,因此要使用此项目需要安装这些依赖环境和类库。

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地址。
    • 将修改进行commitpush到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