<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>gitlab | 伪架构师</title>
    <link>/tags/gitlab/</link>
      <atom:link href="/tags/gitlab/index.xml" rel="self" type="application/rss+xml" />
    <description>gitlab</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 01 Mar 2017 19:47:58 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>gitlab</title>
      <link>/tags/gitlab/</link>
    </image>
    
    <item>
      <title>从头开始：Redmine 和 Gitlab 的集成和联动</title>
      <link>/post/redmine-and-gitlab/</link>
      <pubDate>Wed, 01 Mar 2017 19:47:58 +0800</pubDate>
      <guid>/post/redmine-and-gitlab/</guid>
      <description>

&lt;p&gt;本文的操作将达成如下目的：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;在 Redmine 中查看 GitLab 仓库中的变更。&lt;/li&gt;
&lt;li&gt;Redmine 中更新 Gitlab 仓库。&lt;/li&gt;
&lt;li&gt;利用 Git Commit Log 改变 Redmine 中的 Issue 状态。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;工作环境&#34;&gt;工作环境&lt;/h2&gt;

&lt;p&gt;该过程在 Kubernetes 环境中完成。&lt;/p&gt;

&lt;p&gt;Redmine：sameersbn/redmine:3.3.1
Gitlab：官方镜像&lt;/p&gt;

&lt;h2 id=&#34;redmine-设置&#34;&gt;Redmine 设置&lt;/h2&gt;

&lt;h3 id=&#34;系统仓库设置&#34;&gt;系统仓库设置&lt;/h3&gt;

&lt;p&gt;以管理员身份登入 Redmine，进入 &lt;code&gt;Administration -&amp;gt; Repositories&lt;/code&gt;（&lt;code&gt;settings?tab=repositories&lt;/code&gt;）。&lt;/p&gt;

&lt;h4 id=&#34;scm&#34;&gt;SCM&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Enabled SCM 中，我们要使用的 Gitlab，因此需要启用 Git 。如果 Git 不可选，则需要确认是否安装了 git，并在 Redmine 的 configuuration.yml 中进行设置。&lt;/li&gt;
&lt;li&gt;Fetch commits automatically：True，这个选项只是在用户打开仓库页面时候会获取仓库内容，别想多了。&lt;/li&gt;
&lt;li&gt;Enable WS for repository management：True&lt;/li&gt;
&lt;li&gt;Repository management WS API key：这里需要生成一个 API Key，用于后面的 WebHook 触发。&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&#34;commit-信息设置&#34;&gt;Commit 信息设置&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Referencing keywords：引用关键字，保持缺省即可，在 Commit 信息中加入 &lt;code&gt;refs #1&lt;/code&gt;，信息中会有到 #1 Issue 的连接。&lt;/li&gt;
&lt;li&gt;下面的表格中可以根据 Commit log 中的关键字对 Issue 进行更新（状态和进度），例如填写 fixed fixed %60 的话，代表 Commit 信息中如果出现 &lt;code&gt;fixed #1&lt;/code&gt;，则会把 Issue #1 更新为 Fixed，进度推进到 60%。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;为项目获取-git-仓库&#34;&gt;为项目获取 Git 仓库&lt;/h3&gt;

&lt;p&gt;在 Redmine 能访问得到的路径中，使用 git 命令克隆仓库：&lt;code&gt;git clone --mirror git@github.com:git_user/project.git&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&#34;项目仓库设置&#34;&gt;项目仓库设置&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;进入项目的仓库设置页面（&lt;code&gt;projects/[project-id]/settings/repositories&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;添加仓库&lt;/li&gt;
&lt;li&gt;路径指向上个步骤中的本地仓库的位置。&lt;/li&gt;
&lt;li&gt;保存。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;projects/[project-id]/repository&lt;/code&gt; 中，现在就可以看到版本库和文件了，并可以进行 diff 等操作。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;安装插件&#34;&gt;安装插件&lt;/h3&gt;

&lt;p&gt;接下来安装 Redmin 插件&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;该插件将在 Redmine 中运行，用来响应来自 Gitlab 的 Webhook Post 请求。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Github：&lt;code&gt;https://github.com/phlegx/redmine_gitlab_hook&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;下载到 Redmine 的插件目录之后，重启 Redmine 即完成安装。&lt;/p&gt;

&lt;p&gt;可以在 Redmine 的 &lt;code&gt;admin/plugins&lt;/code&gt; 中看到这一新安装的插件。&lt;/p&gt;

&lt;p&gt;进入 &lt;code&gt;settings/plugin/redmine_gitlab_hook&lt;/code&gt;，选中 &lt;code&gt;All branches&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&#34;gitlab-设置&#34;&gt;Gitlab 设置&lt;/h2&gt;

&lt;p&gt;Gitlab 的设置分两步，第一是将 Issue 管理功能从内置模块转为使用 Redmine，第二是利用 Webhook 在发生事件的时候，引发 Redmine 的仓库更新。&lt;/p&gt;

&lt;h3 id=&#34;issue&#34;&gt;Issue&lt;/h3&gt;

&lt;p&gt;进入 Gitlab 的项目服务设置页面：&lt;code&gt;[project-url]/services&lt;/code&gt;，找到 redmine 的设置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active：True&lt;/li&gt;
&lt;li&gt;Trigger：Push&lt;/li&gt;
&lt;li&gt;Project url：Redmine 中相关的项目地址，例如&lt;code&gt;http://redmine.local/projects/sample-project&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Issues url：一般是 Project url + &lt;code&gt;issues&lt;/code&gt;，例如&lt;code&gt;http://redmine.local/projects/sample-project/issues&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New issue url：通常是 Issues url + &lt;code&gt;new&lt;/code&gt;，例如&lt;code&gt;http://redmine.local/projects/sample-project/issues/new&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;保存退出后，该项目的 Issue 相关连接就会转向 Redmine 中。（挺 Low 的。。）&lt;/p&gt;

&lt;h3 id=&#34;webhook&#34;&gt;Webhook&lt;/h3&gt;

&lt;p&gt;Webhook 是 Gitlab 的事件触发系统，这里我们借助这一功能，同 Redmine 的 Gitlab 插件协作，触发 Redmine 的自动更新。&lt;/p&gt;

&lt;p&gt;浏览项目的 Webhook 页面：&lt;code&gt;[project-url]/hooks&lt;/code&gt;，新建一个，URL 栏目填写
&lt;code&gt;http://redmine-url/gitlab_hook?project_id=[project-id]&amp;amp;key=[repository-token]&lt;/code&gt;，key 部分就是前文中提到的 Repository Token。&lt;/p&gt;

&lt;h3 id=&#34;测试&#34;&gt;测试&lt;/h3&gt;

&lt;p&gt;Git clone 代码之后，进行修改，提交 Comment 中写入 fixed #1，看 Redmine 中的这一 Issue 是否发生更新。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>为 Gitlab 和 Jenkins 添加 InfluxDB 支持</title>
      <link>/post/influxdb-for-gitlab-jenkins/</link>
      <pubDate>Sun, 26 Feb 2017 09:59:19 +0800</pubDate>
      <guid>/post/influxdb-for-gitlab-jenkins/</guid>
      <description>

&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;

&lt;p&gt;量化和监控对现在的开发运维工作的重要性是毋庸置疑的。在大肆鼓吹 DevOps 的今天，一体化的数据采集和可视化展示就尤为重要了。&lt;/p&gt;

&lt;p&gt;为了能在同一视图下对 Jenkins 和 Gitlab 的操作进行监控，本来写了一些数据采集的脚本，后发现这两个系统都有实现向 InfluxDB 发送指标数据的能力，虽说结构和数据的细致程度可能不及定制脚本，但懒人方案始终是更快的解决办法。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;非常对不起各位的是，下面的内容主要是堆代码了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;环境准备&#34;&gt;环境准备&lt;/h2&gt;

&lt;h3 id=&#34;docker&#34;&gt;Docker&lt;/h3&gt;

&lt;p&gt;为方便部署，这里采用 Docker 作为执行环境，过程中需要下载一些镜像，所以这里可能要配置代理或者其他途径来获得镜像文件并导入。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里假设宿主机 IP 为 10.211.55.5&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;网络&#34;&gt;网络&lt;/h3&gt;

&lt;p&gt;因为几个组件之间互相需要访问，因此我们首先用如下命令创建一个虚拟网络：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker network create devops&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&#34;influxdb&#34;&gt;InfluxDB&lt;/h2&gt;

&lt;h3 id=&#34;启动&#34;&gt;启动&lt;/h3&gt;

&lt;p&gt;首先启动我们的 InfluxDB，因为 GitLab 只能连接 InfluxDB 的 udp 端口，而官方版本的镜像并未提供这一功能的方便设置，所以这里采用了一个第三方镜像。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这也是 DockerHub 上的常态 —— 嫡出被庶出灭了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
docker run -d --name=influxdb \
--restart=always \
--network=devops \
-v /var/volume/influxdb:/data \
-p 20002:8083 \
-p 20003:8086 \
-p 20004:8089/udp \
-e UDP_PORT=8089 \
-e UDP_DB=gitlab \
appcelerator/influxdb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;稍微做一下解释：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用了上文创建的虚拟网络&lt;/li&gt;
&lt;li&gt;镜像为 appcelerator/influxdb&lt;/li&gt;
&lt;li&gt;宿主机上的 &lt;code&gt;/var/volume/influxdb&lt;/code&gt; 目录被加载到容器的 &lt;code&gt;/data&lt;/code&gt; 目录，用于数据存储的持久化。&lt;/li&gt;
&lt;li&gt;开放了三个端口：

&lt;ul&gt;
&lt;li&gt;8083：管理界面，可用浏览器访问&lt;/li&gt;
&lt;li&gt;8086：HTTP API&lt;/li&gt;
&lt;li&gt;8089：UDP 端口&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;UDP 端口对应的数据库名为 gitlab&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;初始化&#34;&gt;初始化&lt;/h3&gt;

&lt;p&gt;镜像成功启动之后，就可以使用浏览器打开 &lt;code&gt;http://10.211.55.5:20002&lt;/code&gt;，用户名密码缺省为 &lt;code&gt;admin&lt;/code&gt;，主机和端口分别为 &lt;code&gt;10.211.55.5&lt;/code&gt; 和 &lt;code&gt;20003&lt;/code&gt;，这些填写结束后，就可以对 influxdb 进行管理了。&lt;/p&gt;

&lt;p&gt;分别为 gitlab 和 jenkins 创建数据库：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-sql&#34;&gt;CREATE DATABASE &amp;quot;gitlab&amp;quot;
CREATE DATABASE &amp;quot;jenkins&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;gitlab&#34;&gt;Gitlab&lt;/h2&gt;

&lt;h3 id=&#34;启动-1&#34;&gt;启动&lt;/h3&gt;

&lt;p&gt;类似的，我们用如下脚本启动 Gitlab：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
docker run -d --name=gitlab \
--restart=always \
--network=devops \
-v /var/volume/gitlab/data:/var/opt/gitlab \
-v /var/volume/gitlab/conf:/etc/gitlab \
-v /var/volume/gitlab/log:/var/log/gitlab \
-p 21001:80 \
gitlab/gitlab-ce
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;跟前面的 InfluxDB 类似，或者说更加简单，连环境变量也不需要了。映射端口为 21001，加入同一个网络。&lt;/p&gt;

&lt;h3 id=&#34;配置&#34;&gt;配置&lt;/h3&gt;

&lt;p&gt;浏览器登录页面之后，进入 URL： &lt;code&gt;http://10.211.55.5:21001/admin/application_settings&lt;/code&gt;，对 Gitlab 进行设置。&lt;/p&gt;

&lt;p&gt;在 Metrics 一节，会看到 InfluxDB 的配置信息，选中 Enable 之后，只需要填写主机和 UDP 端口即可，因为有虚拟网络的配置，这里主机我们直接填写 influxdb，端口就是 8089 了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;变更配置后，利用 &lt;code&gt;docker kill/rm&lt;/code&gt; 命令停止 gitlab，并重新启动。&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&#34;验证&#34;&gt;验证&lt;/h3&gt;

&lt;p&gt;接下来我们可以选择一个项目进行 commit/push 操作，然后进入前面提到的 InfluxDB 控制台。
页面右上角的数据库选择 &lt;code&gt;gitlab&lt;/code&gt;，在查询输入框中输入 &lt;code&gt;SHOW MEASUREMENTS&lt;/code&gt; 并执行，会看到 gitlab 在这一数据库中建立了各个数据表。&lt;/p&gt;

&lt;p&gt;继续输入 &lt;code&gt;select * from events&lt;/code&gt;，会看到我们刚刚进行的提交记录。&lt;/p&gt;

&lt;h2 id=&#34;jenkins&#34;&gt;Jenkins&lt;/h2&gt;

&lt;h3 id=&#34;启动-2&#34;&gt;启动&lt;/h3&gt;

&lt;p&gt;这里用了我自己的 Jenkins 镜像，完成的还是映射端口、挂接存储的任务。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
docker run -d --name=jenkins \
--restart=always \
--network=devops \
-v /var/volume/jenkins/data:/data/jenkins \
-v /var/volume/jenkins/maven:/data/maven \
-v /var/volume/jenkins/sonar:/data/sonar \
-v /var/volume/jenkins/kube:/data/kube \
-v /var/volume/jenkins/robot:/data/robot \
-p 21003:8080 \
dustise/jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;配置-1&#34;&gt;配置&lt;/h3&gt;

&lt;p&gt;启动之后访问&lt;code&gt;http://10.211.55.5:21003&lt;/code&gt;，对 Jenkins 进行配置。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://10.211.55.5:21003/pluginManager/available&lt;/code&gt; 在这一界面查找 &lt;code&gt;InfluxDB&lt;/code&gt; 插件，进行安装启用。&lt;/p&gt;

&lt;p&gt;InfluxDB 插件启用之后，就可以在 &lt;code&gt;http://10.211.55.5:21003/configure&lt;/code&gt; 找到其配置内容，这里也就是设置一个 InfluxDB 连接到我们之前启动的数据库。&lt;/p&gt;

&lt;p&gt;点击 &lt;code&gt;New InfluxDB Target&lt;/code&gt; 按钮，在弹出的输入项目中，URL 填写为 &lt;code&gt;http://influxdb:8086&lt;/code&gt;，用户名密码同上，数据库为 &lt;code&gt;jenkins&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;retentionPolicy&lt;/code&gt; 一项可以清空。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;exposeExceptions&lt;/code&gt; 这一项目表示，向 InfluxDB 汇报数据的任务如果失败，是否标记所属 Build 过程为失败。&lt;/p&gt;

&lt;h3 id=&#34;验证-1&#34;&gt;验证&lt;/h3&gt;

&lt;p&gt;首先我们创建一个新的 FreeStyle 项目，内容很简单，执行一个 &lt;code&gt;echo &amp;quot;Hello world&amp;quot;&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;在构建后步骤中，可以看到 &lt;code&gt;Post Build Actions&lt;/code&gt; 新增了 &lt;code&gt;Publish build data to InfluDB&lt;/code&gt;的动作。&lt;/p&gt;

&lt;p&gt;添加这一动作之后，选择我们刚才建立的 InfluxDB Target。&lt;/p&gt;

&lt;p&gt;Job 创建完成，就可以开始 Build 了。&lt;/p&gt;

&lt;p&gt;Build 成功之后，我们可以在 InfluxDB 控制台上，切换到 Jenkins 数据库，执行 &lt;code&gt;SHOW MEASUREMENTS&lt;/code&gt;，可以看到 Jenkins 创建的数据表。运行 &lt;code&gt;SELECT * FROM jenkins_data&lt;/code&gt; 进行查询，就会看到我们刚才的 Build 数据。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Robot 等插件也会将结果插入 InfluxDB&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;展示&#34;&gt;展示&lt;/h2&gt;

&lt;p&gt;有了这些数据，我们就可以以项目为单位，利用 Grafana 或者其他可视化工具，对结果进行叠加和展示了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>利用 Gitlab 为 Sonarqube 提供单点登录服务</title>
      <link>/post/oauth-for-sonarqube/</link>
      <pubDate>Sun, 29 Jan 2017 05:31:41 +0800</pubDate>
      <guid>/post/oauth-for-sonarqube/</guid>
      <description>

&lt;p&gt;Gitlab 很贴心的提供了一个 &lt;strong&gt;Oauth 2&lt;/strong&gt; 功能，可以作为 CI/CD 工具链的认证中心来使用。&lt;/p&gt;

&lt;p&gt;Sonarqube 的官方插件只有一个 Github 的支持插件，因此这一功能需要借助第三方插件来完成。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.talanlabs.com/gabriel-allaigre/sonar-auth-gitlab-plugin&#34; target=&#34;_blank&#34;&gt;项目地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://nexus.talanlabs.com/content/groups/public_release/com/synaptix/sonar-auth-gitlab-plugin/1.0.0/sonar-auth-gitlab-plugin-1.0.0.jar&#34; target=&#34;_blank&#34;&gt;下载地址&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;实验环境&#34;&gt;实验环境&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gitlab 地址&lt;/strong&gt;：&lt;code&gt;http://10.211.55.75:32021&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sonarqube 地址&lt;/strong&gt;：&lt;code&gt;https://10.211.55.75:32032/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;这里需要注意的是，要使用这一功能，Sonarqube 必须使用 https 协议提供服务。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;gitlab-设置&#34;&gt;Gitlab 设置&lt;/h2&gt;

&lt;p&gt;访问 admin/applications/new，新建应用接入。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/gitlab.oauth_.app_.info_.png&#34; alt=&#34;new app&#34; /&gt;&lt;/p&gt;

&lt;p&gt;填写应用信息和地址之后提交，Gitlab 会显式 App ID 和 Token。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/gitlab.oauth_.login_.png&#34; alt=&#34;app info&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;sonarqube-设置&#34;&gt;Sonarqube 设置&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;http://10.211.55.75:32021/admin/applications&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;插件下载后，复制到 Sonarqube 的 plugins 目录中（一般在 &lt;code&gt;$SONARHOME/extensions/plugins&lt;/code&gt; 目录下），然后重启 Sonarqube。&lt;/p&gt;

&lt;p&gt;Sonarqube 重启之后，在 &lt;code&gt;updatecenter/installed&lt;/code&gt; 会看到新的 &lt;strong&gt;GitLab Auth&lt;/strong&gt; 插件，启用之后，可以进行后续设置。&lt;/p&gt;

&lt;p&gt;访问路径 &lt;code&gt;settings?category=gitlab&lt;/code&gt;，会看到 Gitlab 认证的设置。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/sonarqube.gitlab.oauth_.png&#34; alt=&#34;Git lab settings&#34; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里建议打开允许注册的选项，如果一个用户账号在 Gitlab 中存在，却不存在于 Sonarqube 中，打开这一功能就可以自动进行账号的传播。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;测试&#34;&gt;测试&lt;/h2&gt;

&lt;p&gt;新的登录界面如图所示：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/gitlab.oauth_.new_.application.png&#34; alt=&#34;login&#34; /&gt;&lt;/p&gt;

&lt;p&gt;点击 Gitlab 图标会进入 Gitlab 认证界面，跟其他 Oauth 情况类似，就无需继续介绍了。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
