提交 9e182a08 编写于 作者: LinuxSuRen's avatar LinuxSuRen

Auto commit by hugo-plugin.

上级 ab5990df
......@@ -268,8 +268,8 @@ var trackOutboundLink = function(id, url) {
<a href="/event/shenzhen/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/shenzhen.jpeg"></img>
<a href="/event/shanghai-2019-06/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/shanghai.jpeg"></img>
</a>
......@@ -282,25 +282,25 @@ var trackOutboundLink = function(id, url) {
<a href="/event/wuhang/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/hacktberfest.jpg"></img>
</a>
<a href="/event/hangzhou-2019-05/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/hangzhou.jpeg"></img>
</a>
<a href="/event/wuhang/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/hacktberfest.jpg"></img>
<a href="/event/shenzhen/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/shenzhen.jpeg"></img>
</a>
<a href="/event/shanghai-2019-06/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/shanghai.jpeg"></img>
<a href="/event/hangzhou-2019-05/" class="tile lazyload cover dib f4 ml1 mr4 bg-black relative mw-100 shadow-5">
<img width="400px" height="200px" src="/images/meetup/hangzhou.jpeg"></img>
</a>
......
......@@ -280,7 +280,7 @@ var trackOutboundLink = function(id, url) {
<p>在这个页面中列举了我们能够参与 Jenkins 项目和社区的许多方式。尽管它展示了所有可能的选项供读者选择,但一下子看上去令人有些无所适从。</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/jenkins-participate-page.png" alt="image.png" /></p>
<p><img src="jenkins-participate-page.png" alt="image.png" /></p>
<p>这个页面被分成了左右两个部分,左边提供了参与社区的方法,右边是向社区贡献的方法。</p>
......@@ -323,7 +323,7 @@ var trackOutboundLink = function(id, url) {
<p>通过阅读贡献指南,我了解了 Awestruct 静态站点生成器,它是用于将代码仓库中的 AsciiDoc 源文件转换为网页的工具。
然而,当我点击链接想查看更多信息时,我发现这个链接失效了——域名已经过期。</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/awestruct-site.png" alt="image.png" /></p>
<p><img src="awestruct-site.png" alt="image.png" /></p>
<h3 id="为何不修复它">为何不修复它?</h3>
......@@ -337,7 +337,7 @@ var trackOutboundLink = function(id, url) {
<p>下一步就是对相应文件进行修改。我创建了一个新的分支 “alternative-awestruct-link” 并对它作了如下修改:</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/making-change.png" alt="image.png" /></p>
<p><img src="making-change.png" alt="image.png" /></p>
<h4 id="确保构建正确并且通过测试">确保构建正确并且通过测试</h4>
......@@ -346,7 +346,7 @@ var trackOutboundLink = function(id, url) {
<p>如贡献指南所述,要构建此项目,我们只需在代码仓库的根目录中以默认的 “make” 作为 target 来运行构建命令。</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/executing-make.png" alt="image.png" /></p>
<p><img src="executing-make.png" alt="image.png" /></p>
<p>一旦命令执行完成,如果没有出现报错,我们就可以进行下一步:创建 Pull Request</p>
......@@ -358,18 +358,18 @@ var trackOutboundLink = function(id, url) {
<p>这次我直接点击了链接,它将我跳转到 Github 的创建 PR 页面,我在这个页面上添加描述并创建了 PR。</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/creating-pr.png" alt="image.png" /></p>
<p><img src="creating-pr.png" alt="image.png" /></p>
<p>当创建这个代码仓库的 PR 后,可以发现有一些检查开始运行。Jenkins 代码仓库配置了 <a href="https://ci.jenkins.io/">“Jenkins on Jenkins”</a>
它会为每个代码仓库运行 <a href="https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile">Jenkinsfile</a> 中描述的相应 CI 流水线。</p>
<p>检查结束后,可以在 PR 中看到结果:</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/pr-created-passing.png" alt="image.png" /></p>
<p><img src="pr-created-passing.png" alt="image.png" /></p>
<p>如果想看到执行的细节,可以点击 “Show all checks” 链接:</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/pr-checks-jenkins.png" alt="image.png" /></p>
<p><img src="pr-checks-jenkins.png" alt="image.png" /></p>
<h4 id="pr-review">PR review</h4>
......@@ -377,7 +377,7 @@ var trackOutboundLink = function(id, url) {
<p>一旦 PR 被审核通过然后被 merge,你的贡献就会被整合到代码仓库的主分支并成为下次版本更新的一部分。</p>
<p><img src="../../../images/articles/2019/04/2019-04-08-becoming-contributor/pr-merged.png" alt="image.png" /></p>
<p><img src="pr-merged.png" alt="image.png" /></p>
<h3 id="我已经作出了贡献">我已经作出了贡献!</h3>
......
......@@ -279,7 +279,7 @@ var trackOutboundLink = function(id, url) {
<p>这里是可用于以上步骤的 Jenkins 流水线代码:</p>
<p><img src="../../../images/articles/2019/04/2019-04-10-getting-started-with-docker-for-java-applications/pipeline.png" alt="pipeline.png" /></p>
<p><img src="pipeline.png" alt="pipeline.png" /></p>
<pre><code class="language-yaml">node {
stage 'checkout'
......@@ -315,7 +315,7 @@ var trackOutboundLink = function(id, url) {
docker.withRegistry('https://registry.hub.docker.com','docker-hub-credentials')
</code></pre>
<p><img src="../../../images/articles/2019/04/2019-04-10-getting-started-with-docker-for-java-applications/docker-hub-credentials.png" alt="docker-hub-credentials.png" /></p>
<p><img src="docker-hub-credentials.png" alt="docker-hub-credentials.png" /></p>
<p>这个步骤构建 Docker 镜像。Docker build 命令将 dockerhub 仓库名称和 tag 名称作为一个参数,而构建位置作为另一个参数。</p>
......@@ -343,7 +343,7 @@ ADD target/*.war /usr/local/tomcat/webapps
<p>最后一步是推送该镜像到一个 dockerhub registry 或者你的组织建立的任何内部 registry 。</p>
<p><img src="../../../images/articles/2019/04/2019-04-10-getting-started-with-docker-for-java-applications/docker-hub.png" alt="docker-hub.png" /></p>
<p><img src="docker-hub.png" alt="docker-hub.png" /></p>
<pre><code class="language-yaml">stage('Results') {
junit '**/target/surefire-reports/TEST-*.xml'
......
......@@ -264,7 +264,7 @@ var trackOutboundLink = function(id, url) {
<p>Jenkins 访问控制分为:安全域(即认证)与授权策略。</p>
<p>其中,安全域可以采用三种形式,分别为:Jenkins 专有用户数据库、LDAP、Servlet 容器代理。
<img src="../../../images/articles/2019/04/2019-04-12-brief-analysis-the-encryption-algorithm-of-the-built-in-jenkins-user-database/jenkins-security-realm.png" alt="jenkins-security-realm.png" /></p>
<img src="jenkins-security-realm.png" alt="jenkins-security-realm.png" /></p>
<h3 id="在哪里看到加密后的用户密码信息">在哪里看到加密后的用户密码信息?</h3>
......@@ -273,7 +273,7 @@ var trackOutboundLink = function(id, url) {
<p>每个用户的相关信息存放在各自的 config.xml 文件中: $JENKINS_HOME/users/$user/config.xml</p>
<p>在 config.xml 文件中的 passwordHash 节点可以看到用户密码加密后的密文哈希值:
<img src="../../../images/articles/2019/04/2019-04-12-brief-analysis-the-encryption-algorithm-of-the-built-in-jenkins-user-database/jenkins-user-config.png" alt="jenkins-user-config.png" /></p>
<img src="jenkins-user-config.png" alt="jenkins-user-config.png" /></p>
<h3 id="用户密码是用什么算法加密的呢">用户密码是用什么算法加密的呢?</h3>
......
......@@ -258,7 +258,7 @@ var trackOutboundLink = function(id, url) {
<p>CI/CD 的出现改变了开发人员和测试人员发布软件的方式。本文是描述这一变化的系列文章第一篇,
这些文章将提供各种工具和流程的讲解,以帮助开发人员更好的使用 CI/CD。</p>
<p><img src="../../../images/articles/2019/04/2019-04-12-what-is-cicd/pic1.png" alt="pipeline.png" /></p>
<p><img src="pic1.png" alt="pipeline.png" /></p>
<p>从最初的 <a href="https://en.wikipedia.org/wiki/Waterfall_model">瀑布模型</a>
到后来的 <a href="https://en.wikipedia.org/wiki/Agile_software_development">敏捷开发</a>
......@@ -291,7 +291,7 @@ var trackOutboundLink = function(id, url) {
部署流水线对这一过程进行建模,并且它的持续集成和发布管理工具能让您在代码从版本控制转移到各种测试和部署时,
查看和控制每次更改的过程。」</p>
<p><img src="../../../images/articles/2019/04/2019-04-12-what-is-cicd/pic2.png" alt="pipeline.png" /></p>
<p><img src="pic2.png" alt="pipeline.png" /></p>
<h2 id="持续集成-ci">持续集成(CI)</h2>
......@@ -326,7 +326,7 @@ var trackOutboundLink = function(id, url) {
<p>AWS 上提供了可靠的当前 CI/CD 的展示,亚马逊是云计算的提供商之一,提供出色的 CI/CD 流水线环境和实验过程,
有众多开发资源可供选择,您可以将它们在一个易于配置和监控的流水线中组合起来。</p>
<p><img src="../../../images/articles/2019/04/2019-04-12-what-is-cicd/pic3.png" alt="pipeline.png" /></p>
<p><img src="pic3.png" alt="pipeline.png" /></p>
<p>许多人认为持续交付的吸引力主要在于,它自动化了从提交代码到仓库,再到测试和发布产品过程的所有步骤。
这是构建和测试过程细致的自动化,但是如何发布以及发布什么仍然是需要人工操作,持续部署可以改变这一点。</p>
......@@ -355,9 +355,9 @@ Cloudbees 甚至聘请了 Jenkins 的创始人,并提供了一些 Jenkins 培
因此,我们正在寻找与 GSP 兼容或者最好是已经集成进 GSO 的产品。我们尝试过 CircleCI,Codeship 和 Shippable,
下面有一个简单的表格,展示了每个工具的一些细节:</p>
<p><img src="../../../images/articles/2019/04/2019-04-12-what-is-cicd/pic4.png" alt="pipeline.png" /></p>
<p><img src="pic4.png" alt="pipeline.png" /></p>
<p><img src="../../../images/articles/2019/04/2019-04-12-what-is-cicd/pic5.png" alt="pipeline.png" /></p>
<p><img src="pic5.png" alt="pipeline.png" /></p>
<p>我们最终选择了 <a href="http://codeship.com/">Codeship</a>,我认为我们的选择是正确的,
也感谢 Codeship 团队的支持。</p>
......
......@@ -269,7 +269,7 @@ Open source at jenkinsci and kubernetes.
<p><img src="../../../images/articles/2019/04/2019-04-15-kubecon-cn/kubecon.png" alt="kubecon.png" /></p>
<p><img src="kubecon.png" alt="kubecon.png" /></p>
<h3 id="kubecon-cloudnativecon-open-source-summit-持续交付峰会-中国2019">KubeCon + CloudNativeCon | Open Source Summit | 持续交付峰会 中国2019</h3>
......
......@@ -268,7 +268,7 @@ var trackOutboundLink = function(id, url) {
<p>下图为整体架构图:</p>
<p><img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-ecc7d290dd4d0f0f.png" alt="" /></p>
<p><img src="292372-ecc7d290dd4d0f0f.png" alt="" /></p>
<p>整体并不复杂,大体步骤如下:</p>
......@@ -284,13 +284,13 @@ var trackOutboundLink = function(id, url) {
<h2 id="1-使-jenkins-暴露-metrics-api">1. 使 Jenkins 暴露 metrics api</h2>
<p>安装 Metrics 插件,在系统配置中,会多出“Metrics”的配置,如下图:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-ba867bb2509c6fc4.png" alt="" /></p>
<img src="292372-ba867bb2509c6fc4.png" alt="" /></p>
<p>配置项不复杂。我们需要点击“Generate&hellip;”生成一个 Access Key(生成后,记得要保存)。这个 Key 用于身份校验,后面我们会用到。</p>
<p>保存后,我们在浏览器中输入URL:<code>http://localhost:8080/metrics/&lt;刚生成的 Access Key&gt;</code> 验证 Jenkins 是否已经暴露 metrics。如果看到如下图,就说明可以进行下一步了。</p>
<p><img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-011d7fc64d176d63.png" alt="" /></p>
<p><img src="292372-011d7fc64d176d63.png" alt="" /></p>
<h3 id="1-1-metrics-插件介绍">1.1 Metrics 插件介绍</h3>
......@@ -323,7 +323,7 @@ var trackOutboundLink = function(id, url) {
<ul>
<li>/ping:接口返回 <code>pong</code> 代表 Jenkins 存活,如下图:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-15e36249b868625a.png" alt="" /></li>
<img src="292372-15e36249b868625a.png" alt="" /></li>
<li>/threads:返回 Jenkins 的线程信息</li>
<li>/healthcheck:返回以下指标:</li>
</ul>
......@@ -356,13 +356,13 @@ var trackOutboundLink = function(id, url) {
<h3 id="2-1-配置-zabbix-server-如何从-agent-获取指标数据">2.1 配置 Zabbix server 如何从 agent 获取指标数据</h3>
<p>首先,我们需要告诉 Zabbix server 要与哪些 Zabbix agent 通信。所以,第一步是创建主机,如下图:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-82ae4d1864e7abc7.png" alt="" />
<img src="292372-82ae4d1864e7abc7.png" alt="" />
第二步,在主机列表中点击“Iterms”进行该主机的监控项设置:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-6903c525459cb7a6.png" alt="" />
<img src="292372-6903c525459cb7a6.png" alt="" />
第三步,进入创建监控项页面:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-a6ab0ea028cbadb0.png" alt="" />
<img src="292372-a6ab0ea028cbadb0.png" alt="" />
第四步,创建监控项:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-47570ec3796d857a.png" alt="" /></p>
<img src="292372-47570ec3796d857a.png" alt="" /></p>
<p>这里需要解释其中几个选项为什么要那样填:
* <strong>Type</strong>:是 Zabbix server 采集指标的类型,我们选择的是 Zabbix agent,如上文所说。
......@@ -411,14 +411,14 @@ histograms.vm.memory.pools.Code-Cache.used.window.15m.mean=44375961.6
<p>在经过 2.2 节的配置后,如果 Zabbix server 采集到数据,可通过_Monitoring -&gt; Latest data -&gt; Graph_菜单(如下图),看到图形化的报表:</p>
<p><img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-e46c6e7f12c1716a.png" alt="" /></p>
<p><img src="292372-e46c6e7f12c1716a.png" alt="" /></p>
<p>图形化的报表:
<img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-7ad0297b73be9bbb.png" alt="" /></p>
<img src="292372-7ad0297b73be9bbb.png" alt="" /></p>
<p>有了指标数据就可以根据它进行告警了。告警在 Zabbix 中称为触发器(trigger)。如下图,我们创建了一个当 Jenkins node 小于 2 时,就触发告警的触发器:</p>
<p><img src="../../../images/articles/2019/04/2019-04-15-zabbix-monitor-jenkins/292372-dcb88e44931b70fa.png" alt="" /></p>
<p><img src="292372-dcb88e44931b70fa.png" alt="" /></p>
<p>至于最终触发器的后续行为是发邮件,还是发短信,属于细节部分,读者朋友可根据自己的情况进行设置。</p>
......
......@@ -301,11 +301,11 @@ var trackOutboundLink = function(id, url) {
<p>jenkins-b 的界面如下图所示:</p>
<p><img src="../../../images/articles/2019/04/2019-04-23-jenkins-master-shared-home/292372-fd4b85d5b9c8bdf6.png" alt="" /></p>
<p><img src="292372-fd4b85d5b9c8bdf6.png" alt="" /></p>
<p>而 jenkins-a 的界面如下图所示:</p>
<p><img src="../../../images/articles/2019/04/2019-04-23-jenkins-master-shared-home/292372-1bfd4e033b6c25c8.png" alt="" /></p>
<p><img src="292372-1bfd4e033b6c25c8.png" alt="" /></p>
<p>这时,将 jenkins-a 日志中的解锁密码(Unlock password)输入到 jenkins-b 的页面中,会得到报错信息:</p>
......@@ -352,11 +352,11 @@ jenkins-b_1 | java.lang.IllegalStateException: JENKINS-23152: /var/jenkins_home
<p>看到的现象是,两个任务都会按时执行,但是只有一个任务能将运行结果写入到磁盘中。界面如下图:</p>
<p><img src="../../../images/articles/2019/04/2019-04-23-jenkins-master-shared-home/292372-38c7a7f8aade0793.png" alt="" /></p>
<p><img src="292372-38c7a7f8aade0793.png" alt="" /></p>
<p>另,从日志中,可以确认 jenkins-a 和 jenkins-b 确实按时执行了。如下图日志中,看出 jenkins-a 定时执行 #6 次构建时报错,因为 jenkins-b 已经执行过 #6 次构建了:</p>
<p><img src="../../../images/articles/2019/04/2019-04-23-jenkins-master-shared-home/292372-55e80e61f0d36dfb.png" alt="" /></p>
<p><img src="292372-55e80e61f0d36dfb.png" alt="" /></p>
<h3 id="小结">小结</h3>
......
......@@ -265,7 +265,7 @@ var trackOutboundLink = function(id, url) {
它将新版本部署到用户的一个子集,并在将其滚动到全部用户之前对其正确性和性能进行评估,
如果不匹配某些关键指标,则进行回滚。</p>
<p><img src="../../../images/articles/2019/04/2019-04-24-progressive-delivery-in-kubernetes-blue-green-and-canary-deployments/kubernetes.png" alt="" /></p>
<p><img src="kubernetes.png" alt="" /></p>
<p>这里有一些有趣的项目,使得渐进式交付在 Kubernetes 中变得更简单。
我将使用一个 <a href="https://github.com/carlossg/croc-hunter-jenkinsx-serverless">Jenkins X 示例项目</a>
......@@ -407,7 +407,7 @@ spec:
另外还要<a href="https://docs.flagger.app/install/install-flagger">安装 Flager 控制器</a>本身。
它也提供了一个 <a href="https://docs.flagger.app/install/install-grafana">Grfana 面板</a>来监控部署进度。</p>
<p><img src="../../../images/articles/2019/04/2019-04-24-progressive-delivery-in-kubernetes-blue-green-and-canary-deployments/grafana-canary-analysis.png" alt="grafana-canary-analysis.png" /></p>
<p><img src="grafana-canary-analysis.png" alt="grafana-canary-analysis.png" /></p>
<p><a href="https://docs.flagger.app/usage/progressive-delivery">部署 rollout </a>通过 Canary 对象定义,
它会生成主要的和金丝雀 Deployment 对象。
......
......@@ -291,7 +291,7 @@ var trackOutboundLink = function(id, url) {
<p>本次实验使用 Docker Compose 搭建 Jenkins 及 Jenkins agent。使用 Vagrant 启动一台虚拟机,用于部署 Nginx。使用 Vagrant 是可选的,读者可以使用 VirtualBox 启动一个虚拟机。使用 Vagrant 完全是为了自动化搭建实验环境。</p>
<p>以下是整个实验环境的架构图:
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc1.png" alt="Jenkins Ansible Nginx" /></p>
<img src="pc1.png" alt="Jenkins Ansible Nginx" /></p>
<p>注意,图中的 <code>5123 &lt;-&gt; 80</code> 代表将宿主机的 5123 端口请求转发到虚拟机中的 80 端口。</p>
......@@ -324,7 +324,7 @@ docker build -f JenkinsSlaveAnsibleDockerfile -t jenkins-swarm-ansible .
docker-compose up -d
</code>
通过 <code>http://localhost:8080</code> 访问 Jenkins master,如果出现“解锁密码”页面,如下图,则执行命令 <code>docker-compose logs jenkins</code> 查看 Jenkins master 启动日志。将日志中的解锁密码输入到表单中。然后就一步步按提示安装即可。
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc2.png" alt="解锁Jenkins" /></li>
<img src="pc2.png" alt="解锁Jenkins" /></li>
<li>安装 Jenkins 插件
本次实验需要安装以下插件:
......@@ -337,11 +337,11 @@ docker-compose up -d
<li><p>配置 Jenkins master 不执行任务
进入页面:<a href="http://localhost:8080/computer/(master)/configure">http://localhost:8080/computer/(master)/configure</a>,如下图所示设置:
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc9.png" alt="image.png" /></p></li>
<img src="pc9.png" alt="image.png" /></p></li>
<li><p>确认 Jenkins 安全配置有打开端口,以供 Jenkins agent 连接。
我们设置 Jenkins master 开放的端口,端口可以是固定的 50000 ,也可以设置为随机。设置链接:<a href="http://localhost:8080/configureSecurity/">http://localhost:8080/configureSecurity/</a>
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc3.png" alt="image.png" /></p></li>
<img src="pc3.png" alt="image.png" /></p></li>
<li><p>启动目标机器,用于部署 Nginx
在命令行中执行以下命令:</p>
......@@ -358,26 +358,26 @@ docker-compose up -d
<ol>
<li>新建流水线任务
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc4.png" alt="新建流水线任务" /></li>
<img src="pc4.png" alt="新建流水线任务" /></li>
<li><p>配置流水线
配置 Jenkins 任务从远程仓库拉取 Jenkinsfile,如下图所示:
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc5.png" alt="配置流水线" />
<img src="pc5.png" alt="配置流水线" />
除此之外,不需要其它配置了,是不是很简单?</p>
<h2 id="4-手工触发一次自动化构建">4. 手工触发一次自动化构建</h2>
<p>点击“立即构建”:
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc6.png" alt="image.png" />
<img src="pc6.png" alt="image.png" />
最终执行日志如下:
<img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc7.png" alt="部署日志" /></p></li>
<img src="pc7.png" alt="部署日志" /></p></li>
</ol>
<p>至此,部署已经完成。以后修改 Nginx 的配置,只需要修改代码,然后推送到远程仓库,就会自动化部署。不需要手工登录到目标机器手工修改了。</p>
<p>最后,我们可以通过访问 <code>http://localhost:5123</code>,如果出现如下页面说明部署成功:</p>
<p><img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/pc8.png" alt="部署成功" /></p>
<p><img src="pc8.png" alt="部署成功" /></p>
<h2 id="5-代码讲解">5. 代码讲解</h2>
......@@ -492,7 +492,7 @@ docker-compose up -d
<p>如果觉得本文讲的 Jenkins 流水线逻辑部分不够过瘾,可以考虑入手一本最近才出版的《Jenkins 2.x实践指南》。长按下图进行扫码购买。</p>
<p><img src="../../../images/articles/2019/04/2019-04-25-jenkins-ansible-nginx/jenkins-2x-in-practice.jpeg" alt="" /></p>
<p><img src="jenkins-2x-in-practice.jpeg" alt="" /></p>
<h3 id="附录">附录</h3>
......
......@@ -263,7 +263,7 @@ var trackOutboundLink = function(id, url) {
<p>这是渐进式交付系列的第二篇文章,第一篇请看:<a href="https://blog.csanchez.org/2019/01/22/progressive-delivery-in-kubernetes-blue-green-and-canary-deployments/">Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署</a></p>
<p><img src="../../../images/articles/2019/04/2019-04-26-progressive-delivery-with-jenkins-x/kubernetes.png" alt="kubernetes.png" /></p>
<p><img src="kubernetes.png" alt="kubernetes.png" /></p>
<p>我使用的我的 <a href="https://github.com/carlossg/croc-hunter-jenkinsx-serverless">Croc Hunter 示例项目</a>评估了 Jenkins X 中金丝雀部署和蓝绿色部署的三种渐进式交付方案。
- Shipper 为 Jenkins X 构建的 Helm 图表启用了蓝绿部署和多集群部署,但是对图表的内容有限制。
......
......@@ -301,15 +301,15 @@ var trackOutboundLink = function(id, url) {
<p>制品仓库位于 DevOps 工具链的集成阶段,尽管其在构思阶段可被用来表示你想使用的工具是可用状态。</p>
<p><img src="../../../images/articles/2019/04/2019-04-24-devsecops/pic1.png" alt="" /></p>
<p><img src="pic1.png" alt="" /></p>
<p>如果没有开源策略,你就不应该使用制品仓库。制品仓库会自动执行你的开源策略,这样就不会像 35% 的组织一样有开源策略但忽略它。</p>
<p><img src="../../../images/articles/2019/04/2019-04-24-devsecops/pic2.png" alt="" /></p>
<p><img src="pic2.png" alt="" /></p>
<p>Helen 利用 <a href="https://www.sonatype.com/nexus-lifecycle">Nexus Lifecycle</a> 来告诉开发人员如何更好地使用制品,降低风险,并协助运维和安全部门确保使用了正确的软件。</p>
<p><img src="../../../images/articles/2019/04/2019-04-24-devsecops/pic3.png" alt="" /></p>
<p><img src="pic3.png" alt="" /></p>
<p>最重要的是,如果你还没有用上 DevSecOps ,那你应该尽早启用。这是未来的趋势,它已经渡过了发展期成为了一个成熟的概念,也有成熟的工具来帮助你。这会花一些时间,但一定是值得的。</p>
......
......@@ -278,7 +278,7 @@ var trackOutboundLink = function(id, url) {
金丝雀发布包括向应用程序的新版本发送一小部分流量,并在向其他用户发布之前验证这里没有错误。
Facebook 就是这样做的,首先向内部员工提供新版本,然后是一小部分用户,然后是其他所有用户,但是你要采用它并不需要成为 Facebook !</p>
<p><img src="../../../images/articles/2019/04/2019-04-29-progressive-delivery-with-jenkins-x-automatic-cana/facebook_canary_chart_1.jpeg" alt="facebook_canary_chart_1.jpeg" /></p>
<p><img src="facebook_canary_chart_1.jpeg" alt="facebook_canary_chart_1.jpeg" /></p>
<p>你可以<a href="https://martinfowler.com/bliki/CanaryRelease.html">在 Martin Fowler 的网站阅读更多与金丝雀发布相关信息</a></p>
......@@ -309,11 +309,11 @@ Istio ingress 提供了金丝雀发布需要的路由能力(流量转移),
<p>集群被配置后,是时候配置我们的应用了。
<code>charts/myapp/templates</code> 目录下向你的 helm chart 添加一个 <a href="https://github.com/carlossg/croc-hunter-jenkinsx-serverless/blob/9eea262/charts/croc-hunter-jenkinsx/templates/canary.yaml">canary.yaml</a></p>
<p><img src="../../../images/articles/2019/04/2019-04-29-progressive-delivery-with-jenkins-x-automatic-cana/canary_yaml2.png" alt="canary_yaml2.png" /></p>
<p><img src="canary_yaml2.png" alt="canary_yaml2.png" /></p>
<p>然后往 <code>charts/myapp/values.yaml</code> 追加如下内容,将 <code>myapp.example.com</code> 修改为你的主机名或域名:</p>
<p><img src="../../../images/articles/2019/04/2019-04-29-progressive-delivery-with-jenkins-x-automatic-cana/values_yaml_0.png" alt="values_yaml_0.png" /></p>
<p><img src="values_yaml_0.png" alt="values_yaml_0.png" /></p>
<p>不久,当你从 Jenkins X 快速开始创建你的应用,将不再需要修改 <code>canary.yaml</code><code>values.yaml</code> 这两个文件,因为它们默认启用金丝雀部署。</p>
......@@ -354,7 +354,7 @@ Istio ingress 提供了金丝雀发布需要的路由能力(流量转移),
<p>它将为我们提供当前版本和新版本的对比视图,视图中包含不同指标(CPU,内存,请求持续时间,响应错误……)。</p>
<p><img src="../../../images/articles/2019/04/2019-04-29-progressive-delivery-with-jenkins-x-automatic-cana/canary_analysis.png" alt="canary_analysis.png" /></p>
<p><img src="canary_analysis.png" alt="canary_analysis.png" /></p>
<h2 id="附加说明">附加说明</h2>
......
......@@ -278,7 +278,7 @@ var trackOutboundLink = function(id, url) {
- 一个强大的开发团队。由于交付流水线的所有阶段都可供团队中的任何人检查、改进和验证,因此可以创建对构建的所有权,从而鼓励整个组织的强大团队合作和协作能力。
- 降低软件开发的风险和成本。自动化鼓励开发人员在继续前进之前分阶段验证代码更改,从而减少了缺陷最终出现在生产中的机会。
- 减少进展中的工作量。CD 流水线提供从开发到客户的快速反馈循环。这个迭代周期不仅可以帮助您构建正确的产品,而且还允许开发人员更快地进行产品改进,从而减少正在进行的工作。
<img src="../../../images/articles/2019/04/2019-04-30-what-cicd-tool-should-i-use/5bbf935efe0adfe212184907.png" alt=" CNCF 环境下的 CI/CD 工具" /></p>
<img src="5bbf935efe0adfe212184907.png" alt=" CNCF 环境下的 CI/CD 工具" /></p>
<h2 id="典型的部署流水线">典型的部署流水线</h2>
......@@ -289,7 +289,7 @@ var trackOutboundLink = function(id, url) {
2. 代码通过单元、集成和其他自动化测试。如果测试通过,将构建成新的 Docker 镜像。
3. 将镜像推送到镜像仓库。
4. 将新镜像推送到集群中。
<img src="../../../images/articles/2019/04/2019-04-30-what-cicd-tool-should-i-use/5a844aa625bef76b0bd0b159.png" alt="" /></p>
<img src="5a844aa625bef76b0bd0b159.png" alt="" /></p>
<h2 id="思考-cd-流水线的特性">思考 CD 流水线的特性</h2>
......@@ -323,7 +323,7 @@ var trackOutboundLink = function(id, url) {
将持续交付与实时可观察性相结合,使您的开发团队能够在部署新功能之前做出更好的决策。</p>
<p>新功能和补丁被推送到 Git 并触发部署流水线,当它们准备好发布时,理想情况下应该对正在运行的集群实时监控。这允许开发人员根据反馈做出决策。可以将它们返回到流水线的起点,或将更新后的镜像部署到生产集群中。
<img src="../../../images/articles/2019/04/2019-04-30-what-cicd-tool-should-i-use/59e58c44a32c30ab71e2c4d6.png" alt="阅读更多的GitOps第3部分-可观察性" /></p>
<img src="59e58c44a32c30ab71e2c4d6.png" alt="阅读更多的GitOps第3部分-可观察性" /></p>
<h3 id="更快的平均部署和恢复时间">更快的平均部署和恢复时间</h3>
......@@ -350,7 +350,7 @@ var trackOutboundLink = function(id, url) {
<h2 id="将-gitops-工作流程应用于流水线">将 GitOps 工作流程应用于流水线</h2>
<p>通过采用 GitOps,开发人员可以通过提取请求管理基础架构配置和软件部署以及回滚。当真实来源与集群中运行的不同时,集群会自动与 Git 中保存的内容同步。
<img src="../../../images/articles/2019/04/2019-04-30-what-cicd-tool-should-i-use/5bae45390d80351e6dbdf031.png" alt="" />
<img src="5bae45390d80351e6dbdf031.png" alt="" />
Weave Cloud 的部署代理在集群内部运行。这意味着容器映像注册表和集群 API 的凭据永远不会离开集群的域。通过使用 Git 作为事实源,可以比较和警告所需的状态和当前状态。这不仅可以确保集群保持最新,而且还可以在集群崩溃时提供从灾难中快速恢复的方法。</p>
</div>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册