<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CI/CD on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/CI/CD/</link>
    <description>Recent content in CI/CD on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Thu, 03 May 2018 16:54:10 +0000</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/CI/CD/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>docker&#43;jenkins&#43;golang持续集成实践</title>
      <link>https://www.yeqown.xyz/2018/05/03/docker-jenkins-golang%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E5%AE%9E%E8%B7%B5/</link>
      <pubDate>Thu, 03 May 2018 16:54:10 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/05/03/docker-jenkins-golang%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E5%AE%9E%E8%B7%B5/</guid>
      <description>&lt;hr&gt;&#xA;&lt;h3 id=&#34;起因&#34;&gt;起因&lt;a class=&#34;anchor&#34; href=&#34;#%e8%b5%b7%e5%9b%a0&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;因为生产需要最近又重新折腾了一下Jenkins和docker。主要目的是想自动编译，打包，部署一些Golang的HttpServer。于是决定使用Jenkins来做这个持续集成的载体，选择Jenkins出于两点原因：&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;1. 以前就使用过，上手会更快&lt;/em&gt;&#xA;&lt;em&gt;2. 社区比较成熟，插件和文档丰富&lt;/em&gt;&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;安装docker和pull-jenkins镜像&#34;&gt;安装Docker和Pull Jenkins镜像&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85docker%e5%92%8cpull-jenkins%e9%95%9c%e5%83%8f&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;这一步，作为前置条件且不是本文主要要描述的步骤，因此略去。网上也有很多参考资料～&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;jenkins--docker-compose配置&#34;&gt;Jenkins &amp;amp; docker-compose配置&lt;a class=&#34;anchor&#34; href=&#34;#jenkins--docker-compose%e9%85%8d%e7%bd%ae&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;为了方便我才用了docker-compose这个工具，docker-compose 基础可以参见我的&lt;a href=&#34;https://yeqown.github.io/2018/01/24/Docker-Compose%E4%B8%8A%E6%89%8B/&#34;&gt;docker-compose上手&lt;/a&gt;。这里直接上配置：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;jenkins&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jenkins-lts&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;9001&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;50000&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;50000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jenkins/jenkins:lts&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/home/worker/jenkins/jenkins_home:/var/jenkins_home&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置也是官方的示例配置。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;Note: 将宿主机的/home/worker/jenkins/jenkins_home挂载为容器的/var/jenkins_home目录。这样做的目的是，如果容器被不小心删除也不至于Jenkins的数据丢失。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;到这里，我们只需要执行&lt;code&gt;docker-compose up -d&lt;/code&gt;便可以将Jenkins容器跑起来了，再配置一下Nginx，便可以直接访问到Jenkins页面了，并进行初始化。&lt;/p&gt;&#xA;&lt;p&gt;我的目录结构如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;➜  jenkins ll&#xA;total 8.0K&#xA;-rw-rw-r--  1 worker worker  220 May  2 17:19 docker-compose.yml&#xA;drwxrwxr-x 19 worker worker 4.0K May  3 15:53 jenkins_home&#xA;➜  jenkins pwd&#xA;/home/worker/jenkins&#xA;➜  jenkins docker-compose up -d # 运行&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;publish-over-ssh配置&#34;&gt;Publish Over SSH配置&lt;a class=&#34;anchor&#34; href=&#34;#publish-over-ssh%e9%85%8d%e7%bd%ae&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Publish Over SSH&lt;/code&gt;配置，由于我们是通过docker运行的Jenkins，因此要特别配置一下SSH，方便Jenkins部署项目。这里先列出步骤：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Drone体验</title>
      <link>https://www.yeqown.xyz/2018/01/27/Drone%E4%BD%93%E9%AA%8C/</link>
      <pubDate>Sat, 27 Jan 2018 00:24:40 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/27/Drone%E4%BD%93%E9%AA%8C/</guid>
      <description>&lt;p&gt;相较于Jenkins，Gitlab-CI&amp;hellip;等，尝试Drone的首要原因是，天生的docker支持。不用去操心部署CI或者CD的环境配置等等烦心事。只需要上手，如何配置这个CD工具，让我使用更加畅快和顺手。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;安装部署&#34;&gt;安装部署&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85%e9%83%a8%e7%bd%b2&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;em&gt;前提：已经安装了docker，docker-compose，并基本掌握docker用法，基本熟悉docker-compose配置文件&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;pull镜像&#34;&gt;pull镜像&lt;a class=&#34;anchor&#34; href=&#34;#pull%e9%95%9c%e5%83%8f&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull drone/drone:0.8  &lt;span style=&#34;color:#75715e&#34;&gt;# droner-server 镜像&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull dorner/agent:0.8 &lt;span style=&#34;color:#75715e&#34;&gt;# drone-agent 镜像&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以跳过这一步，docker运行的时候，如果匹配不到本地镜像，会自动拉取。&lt;/p&gt;&#xA;&lt;h4 id=&#34;docker-composeyml配置文件&#34;&gt;docker-compose.yml配置文件&lt;a class=&#34;anchor&#34; href=&#34;#docker-composeyml%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;为了方便，新建一个Drone文件夹，目录结构如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--Drone                  # 文件夹&#xA;  |---docker-compose.yml # docker-compose 配置文件&#xA;  |---data               # 用于挂载的数据文件&#xA;  |---drone.domain.com   # nginx sever 配置文件&#xA;  `---other.file         # 其他文件&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;已知文件结构后，编写的docker-compose.yml文件如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;drone-server&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone/drone:0.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone-server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data:/var/lib/drone/&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 在没有跟数据库绑定的情况下，默认使用sqlite数据库&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_OPEN=false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_HOST=http://127.0.0.1:8000&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 最好是在服务器上，localhost无法收到webhook的通知&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_ADMIN=yourname&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_GITHUB=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_GITHUB_CLIENT=7bc7971bxxxxx&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 需要预先注册一个github oauth应用&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_GITHUB_SECRET=9456c630xxxxxxxxxxxxxx&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_SECRET=secret&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_DEBUG=false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;drone-agent&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone/agent:0.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone-agent&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;command&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;agent&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;drone-server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_SERVER=drone-server:9000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_SECRET=secret&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_DEBUG=true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;启动drone&#34;&gt;启动Drone&lt;a class=&#34;anchor&#34; href=&#34;#%e5%90%af%e5%8a%a8drone&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;启动就很简单了，Drone目录下执行：&lt;code&gt;docker-compose up -d&lt;/code&gt;，启动结果截图如下：&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/drone-starting.png&#34; alt=&#34;Drone-starting.png&#34; /&gt;&#xA;如果是首次打开，会先去github请求授权，然后回调&lt;code&gt;schema://drone.your_domain.com/authorize&lt;/code&gt;，如截图：&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/drone-running.png&#34; alt=&#34;Drone-running-web.png&#34; /&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>持续集成-Jenkins</title>
      <link>https://www.yeqown.xyz/2018/01/13/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/</link>
      <pubDate>Sat, 13 Jan 2018 15:23:30 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/13/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/</guid>
      <description>&lt;p&gt;持续集成是一种软件开发实践，即团队开发成员经常集成它们的工作，通过每个成员每天至少集成一次，也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建（包括编译，发布，自动化测试）来验证，从而尽早地发现集成错误。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;关于持续集成&#34;&gt;关于持续集成&lt;a class=&#34;anchor&#34; href=&#34;#%e5%85%b3%e4%ba%8e%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;要素&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;. 统一的代码库&#xA;. 自动构建&#xA;. 自动测试&#xA;. 每个人每天都要向代码库主干提交代码&#xA;. 每次代码递交后都会在持续集成服务器上触发一次构建&#xA;. 保证快速构建&#xA;. 模拟生产环境的自动测试&#xA;. 每个人都可以很容易的获取最新可执行的应用程序&#xA;. 每个人都清楚正在发生的状况&#xA;. 自动化的部署&lt;/p&gt;&#xA;&lt;h3 id=&#34;jenkins的搭建与使用&#34;&gt;Jenkins的搭建与使用：&lt;a class=&#34;anchor&#34; href=&#34;#jenkins%e7%9a%84%e6%90%ad%e5%bb%ba%e4%b8%8e%e4%bd%bf%e7%94%a8&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;前提：安装好Java环境&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;. 下载参见&lt;a href=&#34;https://jenkins.io/download/&#34;&gt;下载地址&lt;/a&gt;, 我采用的是&lt;code&gt;java -jar jenkins.war&lt;/code&gt;的方式部署&#xA;. 可能有用的教程 &lt;a href=&#34;http://geek.csdn.net/news/detail/95824&#34;&gt;http://geek.csdn.net/news/detail/95824&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;更改jenkins服务端口&#34;&gt;更改jenkins服务端口&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9b%b4%e6%94%b9jenkins%e6%9c%8d%e5%8a%a1%e7%ab%af%e5%8f%a3&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;使用&lt;code&gt;java -jar jenkins.war&lt;/code&gt;这样的命令来启动jenkins时会使用默认的端口8080，有些情况下8080端口已经被我们使用了，这个时候如果希望修改这个端口应该怎么办呢？&lt;/p&gt;&#xA;&lt;p&gt;在命令行后面添加 &lt;code&gt;--httpPort=8899&lt;/code&gt;，其实就是配置jetty的启动端口。如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set JENKINS_HOME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;./&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;java -Djsse.enableSNIExtension&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;false -jar path/to/jenkins.war --httpPort&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;8899 &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;zsh设置jenkins环境变量&#34;&gt;zsh设置Jenkins环境变量&lt;a class=&#34;anchor&#34; href=&#34;#zsh%e8%ae%be%e7%bd%aejenkins%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export JENKINS_HOME = &amp;#34;your/jenkins/path&amp;#34;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;补充&#34;&gt;补充&lt;a class=&#34;anchor&#34; href=&#34;#%e8%a1%a5%e5%85%85&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;于2018-1-26日更新&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;鉴于尝试了drone和docker, 强烈建议采用docker部署jenkins，或者替换Jenkins为&lt;a href=&#34;http://drone.io&#34;&gt;Drone&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;最后&#34;&gt;最后&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9c%80%e5%90%8e&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;写得很简略，没有提供配置时候遇到的坑以及解决方法，遇到之后再补上。。。以上hahah&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
