<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jenkins on F嘉阳</title><link>https://blog.fjy8018.top/tags/jenkins/</link><description>Recent content in Jenkins on F嘉阳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 26 Dec 2020 12:37:33 +0800</lastBuildDate><atom:link href="https://blog.fjy8018.top/tags/jenkins/index.xml" rel="self" type="application/rss+xml"/><item><title>DevOps实践心得一</title><link>https://blog.fjy8018.top/archives/213/</link><pubDate>Fri, 16 Aug 2019 19:32:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/213/</guid><description>&lt;h2 id="初遇devops"&gt;&lt;a href="#%e5%88%9d%e9%81%87devops" class="header-anchor"&gt;&lt;/a&gt;初遇DevOps&#10;&lt;/h2&gt;&lt;p&gt;最早接触到&lt;code&gt;DevOps&lt;/code&gt;是在2018年8月26日，那时首先接触到的就是大名鼎鼎的&lt;code&gt;Jenkins&lt;/code&gt;，当时看了多篇关于持续集成和持续部署的文章，蠢蠢欲动，便开始了第一套&lt;code&gt;DevOps&lt;/code&gt;环境的搭建&lt;/p&gt;&#10;&lt;h2 id="jenkins"&gt;&lt;a href="#jenkins" class="header-anchor"&gt;&lt;/a&gt;Jenkins&#10;&lt;/h2&gt;&lt;p&gt;第一套&lt;code&gt;DevOps&lt;/code&gt;是用&lt;code&gt;Jenkins&lt;/code&gt;+&lt;code&gt;Ansible&lt;/code&gt;+&lt;code&gt;GitLab&lt;/code&gt;搭建的，那时只是了解Docker的好处，并没有使用Docker搭建整套环境，还是基于传统虚拟服务器搭建的整套流程。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Jenkins&lt;/code&gt;不仅可以编写&lt;code&gt;groove&lt;/code&gt;脚本、pipeline 流水线等，还能与&lt;code&gt;maven&lt;/code&gt;集成自动构建，深深感受到了&lt;code&gt;Jenkins&lt;/code&gt;的强大，同时大量的用户为其贡献了许多插件，有很多实践问题都可以在网上搜索到解决方案&lt;/p&gt;&#10;&lt;p&gt;搭建过程：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/176/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/175/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/177/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/179/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/178/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/180/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;最后顺利实现了静态网站持续集成、持续部署，详见：&#10;&lt;a class="link" href="https://blog.fjy8018.top/archives/181/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="dockergitlab"&gt;&lt;a href="#dockergitlab" class="header-anchor"&gt;&lt;/a&gt;Docker+GitLab&#10;&lt;/h2&gt;&lt;p&gt;随着容器化技术在国内越来越流行，容器普及度越来越高，其带来的环境隔离极大推动了&lt;code&gt;DevOps&lt;/code&gt;的落地，使得无需使用&lt;code&gt;python&lt;/code&gt;环境隔离，可以直接利用容器技术实现跨平台和环境隔离，并且利于迁移和部署&lt;/p&gt;&#10;&lt;p&gt;于是在2019年4月开始研究&lt;code&gt;GitLab&lt;/code&gt;官方文档，发现其早已原生支持流水线，并依托其&lt;code&gt;GitLab-runner&lt;/code&gt;可以直接实现整套&lt;code&gt;DevOps&lt;/code&gt;环境&lt;/p&gt;&#10;&lt;p&gt;因此，经过不断摸索，完整的搭建的基于&lt;code&gt;Docker&lt;/code&gt;和&lt;code&gt;GitLab&lt;/code&gt;的&lt;code&gt;DevOps&lt;/code&gt;环境，搭建过程见：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/205/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/206/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/207/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;由于国内当时对&lt;code&gt;GitLab&lt;/code&gt;流水线使用的并不多，因此遇到的很多坑都需要翻查官方文档和国外的实践记录，比如：&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://blog.fjy8018.top/archives/208/" &gt;相关文章&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="devops-带来的好处"&gt;&lt;a href="#devops-%e5%b8%a6%e6%9d%a5%e7%9a%84%e5%a5%bd%e5%a4%84" class="header-anchor"&gt;&lt;/a&gt;DevOps 带来的好处&#10;&lt;/h2&gt;&lt;p&gt;2019年7月将手上的一个小型项目尝试使用完整的&lt;code&gt;DevOps&lt;/code&gt;流程开发，开发小组选择敏捷开发方法，所有的开发工具都尽量的适应快速的需求变化，同时投入非常少量的开发人员，分工明确，从一开始一周发布一次到最后一天可以发布多次&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="373px" data-flex-grow="155" height="853" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881026961.png" width="1328"&gt;&lt;/p&gt;&#10;&lt;p&gt;开发人员已经完全从运维中脱离，全团队没有专门的运维人员，极大的提高了开发效率，精简了人员构成，一旦构建失败，开发人员可以根据邮件通知的内容排查上线失败问题，调整代码和配置后重新提交&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="329px" data-flex-grow="137" height="954" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881202626.png" width="1310"&gt;&lt;/p&gt;&#10;&lt;p&gt;面板提供了流水线统计图，如果出现频繁的失败还是需要人工介入，查看问题原因&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="470px" data-flex-grow="196" height="680" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://gitea.fjy8018.top/fjy8018/images/raw/branch/blog/img/1565881072564.png" width="1334"&gt;&lt;/p&gt;&#10;&lt;h2 id="当前的问题"&gt;&lt;a href="#%e5%bd%93%e5%89%8d%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;当前的问题&#10;&lt;/h2&gt;&lt;p&gt;尽管使用了基于&lt;code&gt;Docker&lt;/code&gt;+&lt;code&gt;GitLab&lt;/code&gt;的流水线实现了完整的&lt;code&gt;DevOps&lt;/code&gt;流程，但对于监控和日志部分仍然处在很多问题&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;尽管上线的是单体应用，服务器和应用的健康状态都无法得知，也没有相应的告警&lt;/li&gt;&#10;&lt;li&gt;应用的日志没有被外部服务收集，无法进行快速分析&lt;/li&gt;&#10;&lt;li&gt;没有实现完整的测试流程，生成测试覆盖率报告等&lt;/li&gt;&#10;&lt;li&gt;没有实现0停机上线，在容器切换时仍需停机1-2分钟&lt;/li&gt;&#10;&lt;li&gt;没有实现灰度上线、蓝绿部署等，上线失败需要手动回滚&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="未来探索方向"&gt;&lt;a href="#%e6%9c%aa%e6%9d%a5%e6%8e%a2%e7%b4%a2%e6%96%b9%e5%90%91" class="header-anchor"&gt;&lt;/a&gt;未来探索方向&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;全面容器化服务治理方向&#10;&lt;ul&gt;&#10;&lt;li&gt;国内对容器化有非常多的实践&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;kubernetes&lt;/code&gt;作为容器调度成为大多数服务治理的选择&lt;/li&gt;&#10;&lt;li&gt;容器隔离、迁移和伸缩带来的巨大优势&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;容器与传统应用部署结合方式&#10;&lt;ul&gt;&#10;&lt;li&gt;以半全自动方式落地&lt;code&gt;DevOps&lt;/code&gt;，采用&lt;code&gt;Mesos&lt;/code&gt;+&lt;code&gt;marathon&lt;/code&gt;方式同时兼容传统服务部署和容器化部署&lt;/li&gt;&#10;&lt;li&gt;兼容分布式服务治理&lt;/li&gt;&#10;&lt;li&gt;国外有大量的实践案例&lt;/li&gt;&#10;&lt;li&gt;日志收集体系完备&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Jenkins+GitLab+Ansible实现静态网站自动部署</title><link>https://blog.fjy8018.top/archives/181/</link><pubDate>Sat, 01 Sep 2018 12:45:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/181/</guid><description>&lt;h2 id="环境准备"&gt;&lt;a href="#%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;环境准备&#10;&lt;/h2&gt;&lt;p&gt;参考前几篇文章配置后实现以下环境&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;部署好Jenkins服务器一台(192.168.163.133),并在Jenkins服务器上部署ansible，且与目标主机(192.168.163.132)做了免密登录&lt;/li&gt;&#10;&lt;li&gt;可以访问的GitLab服务器一台，并注册了Jenkins相关账号且在Jenkins系统设置中配置完毕&lt;/li&gt;&#10;&lt;li&gt;一台工作环境主机，用于代码编写，该主机可以通过域名访问目标主机(192.168.163.132)&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="编写ansible-playbook"&gt;&lt;a href="#%e7%bc%96%e5%86%99ansible-playbook" class="header-anchor"&gt;&lt;/a&gt;编写ansible playbook&#10;&lt;/h2&gt;&lt;h3 id="搭建基础工程目录结构"&gt;&lt;a href="#%e6%90%ad%e5%bb%ba%e5%9f%ba%e7%a1%80%e5%b7%a5%e7%a8%8b%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;搭建基础工程目录结构&#10;&lt;/h3&gt;&lt;p&gt;从仓库下载之前编写的ansible工程目录结构&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb810a25.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible1.png" class="gallery-image" data-flex-basis="1345px" data-flex-grow="560" height="94" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb810a25.png" width="527"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若没有也可自行创建，最终文件目录结构如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;└─ansible-playbook-repo&#10; │ deploy.yml&#10; │&#10; ├─inventory&#10; │ dev&#10; │ prod&#10; │&#10; └─roles&#10; └─nginx&#10; ├─files&#10; │ │ health_check.sh&#10; │ │ index.html&#10; │ │&#10; │ └─website&#10; │&#10; ├─tasks&#10; │ main.yml&#10; │&#10; └─templates&#10; nginx.conf.j2&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb8103d2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible2.png" class="gallery-image" data-flex-basis="866px" data-flex-grow="360" height="105" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb8103d2.png" width="379"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="文件编写"&gt;&lt;a href="#%e6%96%87%e4%bb%b6%e7%bc%96%e5%86%99" class="header-anchor"&gt;&lt;/a&gt;文件编写&#10;&lt;/h3&gt;&lt;p&gt;工程入口&lt;code&gt;deploy.yml&lt;/code&gt;编写&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- hosts: &amp;#34;nginx&amp;#34;&#10; gather_facts: true&#10; remote_user: root&#10; roles:&#10; - nginx&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编写开发环境配置文件&lt;code&gt;inventory/dev&lt;/code&gt;，此处dev与prod配置一致，若实际需求可自行修改，用于最后jenkins参数化构建的选项&#10;&lt;code&gt;inventory/dev&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[nginx]&#10;test.fjy8018.top&#10;&#10;[nginx:vars]&#10;server_name=test.fjy8018.top&#10;port=80&#10;user=ansible&#10;worker_processes=4&#10;max_open_file=65505&#10;root=/www&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;inventory/prod&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[nginx]&#10;test.fjy8018.top&#10;&#10;[nginx:vars]&#10;server_name=test.fjy8018.top&#10;port=80&#10;user=ansible&#10;worker_processes=4&#10;max_open_file=65505&#10;root=/www&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;编写健康检查shell脚本&lt;code&gt;health_check.sh&lt;/code&gt;&#10;&lt;code&gt;roles/nginx/files/health_check.sh&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;&#10;# 接受命令行参数&#10;URL=$1&#10;&#10;# 访问目标地址，判断是否能正常访问并输出&#10;curl -Is http://$URL &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;#34;远程主机状态正常&amp;#34; || echo &amp;#34;远程主机已停止&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加静态网站文件"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e9%9d%99%e6%80%81%e7%bd%91%e7%ab%99%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;添加静态网站文件&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;/roles/nginx/files/website&lt;/code&gt;为静态网页模板目录，里面存放从网上下载的静态网站模板&#10;配置nginx指向该资源&#10;&lt;code&gt;/roles/nginx/templates/nginx.conf.j2&lt;/code&gt;文件内容&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# For more information on configuration, see: &#10;user {{ user }}; &#10;worker_processes {{ worker_processes }}; &#10; &#10;error_log /var/log/nginx/error.log; &#10; &#10;pid /var/run/nginx.pid; &#10; &#10;events { &#10; worker_connections {{ max_open_file }}; &#10;} &#10; &#10; &#10;http { &#10; include /etc/nginx/mime.types; &#10; default_type application/octet-stream; &#10; &#10; log_format main &amp;#39;$remote_addr - $remote_user [$time_local] &amp;#34;$request&amp;#34; &amp;#39; &#10; &amp;#39;$status $body_bytes_sent &amp;#34;$http_referer&amp;#34; &amp;#39; &#10; &amp;#39;&amp;#34;$http_user_agent&amp;#34; &amp;#34;$http_x_forwarded_for&amp;#34;&amp;#39;; &#10; &#10; access_log /var/log/nginx/access.log main; &#10; &#10; sendfile on; &#10; #tcp_nopush on; &#10; &#10; #keepalive_timeout 0; &#10; keepalive_timeout 65; &#10; &#10; #gzip on; &#10; &#10; # Load config files from the /etc/nginx/conf.d directory &#10; # The default server is in conf.d/default.conf &#10; #include /etc/nginx/conf.d/*.conf; &#10; server { &#10; listen {{ port }} default_server; &#10; server_name {{ server_name }}; &#10; &#10; #charset koi8-r; &#10; &#10; #access_log logs/host.access.log main; &#10; &#10; location / { &#10; root {{ root }}/website; &#10; index index.html index.htm; &#10; } &#10; &#10; error_page 404 /404.html; &#10; location = /404.html { &#10; root /usr/share/nginx/html; &#10; } &#10; &#10; # redirect server error pages to the static page /50x.html &#10; # &#10; error_page 500 502 503 504 /50x.html; &#10; location = /50x.html { &#10; root /usr/share/nginx/html; &#10; } &#10; &#10; } &#10; &#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="编写主任务文件"&gt;&lt;a href="#%e7%bc%96%e5%86%99%e4%b8%bb%e4%bb%bb%e5%8a%a1%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;编写主任务文件&#10;&lt;/h3&gt;&lt;p&gt;主任务文件&lt;code&gt;main.yml&lt;/code&gt;内容如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- name: 关闭系统防火墙&#10; service: name=firewalld state=stopped&#10;&#10;- name: 关闭强制访问控制策略&#10; selinux: state=disabled&#10;&#10;- name: 设置yum源&#10; yum: pkg=epel-release state=latest&#10;&#10;- name: 写入nginx配置文件&#10; template: src=roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf&#10;&#10;- name: 创建nginx根目录文件夹&#10; file: &amp;#39;path={{ root }} state=directory owner={{ user }} group={{ user }} mode=0755&amp;#39;&#10;&#10;- name: 文件拷贝&#10; copy: &amp;#39;remote_src=no src=roles/nginx/files/website dest=/www/website owner={{ user }} mode=0755&amp;#39;&#10;&#10;- name: 启动nginx&#10; service: name=nginx state=restarted&#10;&#10;- name: 运行健康检查&#10; shell: &amp;#34;sh roles/nginx/files/health_check.sh {{ server_name }}&amp;#34;&#10; # 本地执行&#10; delegate_to: localhost&#10; # 参数传递&#10; register: health_status&#10;&#10;- debug: msg=&amp;#34;{{ health_status.stdout }}&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="git提交"&gt;&lt;a href="#git%e6%8f%90%e4%ba%a4" class="header-anchor"&gt;&lt;/a&gt;Git提交&#10;&lt;/h3&gt;&lt;p&gt;提交变更到版本仓库GitLab&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;git add .&#10;git commit -m &amp;#34;添加模板文件&amp;#34;&#10;git push origin master&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="jenkins创建并执行"&gt;&lt;a href="#jenkins%e5%88%9b%e5%bb%ba%e5%b9%b6%e6%89%a7%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;Jenkins创建并执行&#10;&lt;/h2&gt;&lt;p&gt;创建自由风格构建任务，添加参数化构建、添加选项参数和文本参数&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb82714b.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible3.png" class="gallery-image" data-flex-basis="348px" data-flex-grow="145" height="939" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb82714b.png" width="1362"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加Git仓库地址和账号&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb81b6dc.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible4.png" class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb81b6dc.png" width="1113"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加Shell构建，Shell内容为&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;# 关闭命令行扩展环境，避免环境参数日志干扰&#10;set +x&#10;# 加载虚拟环境&#10;source /home/deploy/.py3-a2.5-env/bin/activate&#10;# 加载ansible到当前用户目录&#10;source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q&#10;&#10;cd $WORKSPACE&#10;ls -a&#10;# 查看版本&#10;ansible --version&#10;ansible-playbook --version&#10;&#10;# 引入资源清单，测试远程命令&#10;ansible-playbook -i inventory/$deploy_env ./deploy.yml -e project=nginx -e branch=$branch -e env=$deploy_env&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb819714.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible5.png" class="gallery-image" data-flex-basis="461px" data-flex-grow="192" height="558" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb819714.png" width="1072"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;保存并构建&lt;/p&gt;&#10;&lt;h2 id="结果"&gt;&lt;a href="#%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;结果&#10;&lt;/h2&gt;&lt;h3 id="构建成功"&gt;&lt;a href="#%e6%9e%84%e5%bb%ba%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;构建成功&#10;&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb8103a8.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible6.png" class="gallery-image" data-flex-basis="236px" data-flex-grow="98" height="855" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb8103a8.png" width="842"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="访问测试"&gt;&lt;a href="#%e8%ae%bf%e9%97%ae%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;访问测试&#10;&lt;/h3&gt;&lt;p&gt;在工作主机上访问目标地址+资源路径即可，访问通过&#10;&lt;a class="link" href="https://i.loli.net/2018/09/01/5b8a1bb8636ce.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins_ansible7.png" class="gallery-image" data-flex-basis="475px" data-flex-grow="198" height="716" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/09/01/5b8a1bb8636ce.png" width="1418"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="后续构建"&gt;&lt;a href="#%e5%90%8e%e7%bb%ad%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;后续构建&#10;&lt;/h3&gt;&lt;p&gt;后期只要在工作主机变更代码推送到git仓库，再到Jenkins的web界面点击参数化构建即可让Jenkins自动拉取最新分支并执行Ansible脚本&lt;/p&gt;&#10;</description></item><item><title>Jenkins 与Maven集成</title><link>https://blog.fjy8018.top/archives/180/</link><pubDate>Sun, 26 Aug 2018 17:15:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/180/</guid><description>&lt;h2 id="环境准备"&gt;&lt;a href="#%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;环境准备&#10;&lt;/h2&gt;&lt;h3 id="安装jdk"&gt;&lt;a href="#%e5%ae%89%e8%a3%85jdk" class="header-anchor"&gt;&lt;/a&gt;安装jdk&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install java-devel java&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检测安装结果&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost maven-freestyle-job]# javac -version&#10;javac 1.8.0_181&#10;[root@localhost maven-freestyle-job]# java -version&#10;openjdk version &amp;#34;1.8.0_181&amp;#34;&#10;OpenJDK Runtime Environment (build 1.8.0_181-b13)&#10;OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="安装maven环境"&gt;&lt;a href="#%e5%ae%89%e8%a3%85maven%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;安装maven环境&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;wget http://apache.osuosl.org/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;解压，并指定解压路径&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /opt&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看安装结果&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# cd /opt/&#10;[root@localhost opt]# cd apache-maven-3.5.4/&#10;[root@localhost apache-maven-3.5.4]# cd bin/&#10;[root@localhost bin]# ./mvn -v&#10;Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)&#10;Maven home: /opt/apache-maven-3.5.4&#10;Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/jre&#10;Default locale: zh_CN, platform encoding: UTF-8&#10;OS name: &amp;#34;linux&amp;#34;, version: &amp;#34;3.10.0-862.el7.x86_64&amp;#34;, arch: &amp;#34;amd64&amp;#34;, family: &amp;#34;unix&amp;#34;&#10;[root@localhost bin]# pwd&#10;/opt/apache-maven-3.5.4/bin&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b827003417e4.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins49.png" class="gallery-image" data-flex-basis="294px" data-flex-grow="122" height="635" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b827003417e4.png" width="780"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="配置环境"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;配置环境&#10;&lt;/h2&gt;&lt;p&gt;进入Jenkins系统管理中的全局工具配置，配置本地的maven地址&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700b07ad2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins54.png" class="gallery-image" data-flex-basis="331px" data-flex-grow="138" height="625" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700b07ad2.png" width="863"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;此处的jdk报错正常，若不配置则会自动调用系统环境里的jdk&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700b03362.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins55.png" class="gallery-image" data-flex-basis="681px" data-flex-grow="283" height="366" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700b03362.png" width="1039"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;指定maven名称和路径&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700b019a3.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins56.png" class="gallery-image" data-flex-basis="671px" data-flex-grow="279" height="320" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700b019a3.png" width="895"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="准备maven工程"&gt;&lt;a href="#%e5%87%86%e5%a4%87maven%e5%b7%a5%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;准备maven工程&#10;&lt;/h2&gt;&lt;p&gt;提前在gitlab中装备一个简单的Springboot web工程，通过springboot脚手架快速生成，&lt;code&gt;pom&lt;/code&gt;文件如下&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b8270035108d.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins50.png" class="gallery-image" data-flex-basis="422px" data-flex-grow="176" height="775" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b8270035108d.png" width="1365"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="新建构建"&gt;&lt;a href="#%e6%96%b0%e5%bb%ba%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;新建构建&#10;&lt;/h3&gt;&lt;p&gt;新建构建并填写目标仓库地址&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b827003463d1.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins51.png" class="gallery-image" data-flex-basis="998px" data-flex-grow="416" height="336" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b827003463d1.png" width="1398"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加构建设置为maven构建&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b827003456d8.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins52.png" class="gallery-image" data-flex-basis="372px" data-flex-grow="155" height="262" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b827003456d8.png" width="407"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加构建参数，即在命令行&lt;code&gt;mvn&lt;/code&gt;之后的参数&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700344aea.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins53.png" class="gallery-image" data-flex-basis="889px" data-flex-grow="370" height="383" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700344aea.png" width="1419"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;选择maven版本&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700b0636c.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins57.png" class="gallery-image" data-flex-basis="625px" data-flex-grow="260" height="336" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700b0636c.png" width="876"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="构建"&gt;&lt;a href="#%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;构建&#10;&lt;/h3&gt;&lt;p&gt;构建成功&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700b04b94.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins58.png" class="gallery-image" data-flex-basis="596px" data-flex-grow="248" height="405" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700b04b94.png" width="1006"&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Jenkins job编写测试</title><link>https://blog.fjy8018.top/archives/178/</link><pubDate>Sun, 26 Aug 2018 12:00:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/178/</guid><description>&lt;h2 id="系统预配置"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e9%a2%84%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;系统预配置&#10;&lt;/h2&gt;&lt;h3 id="关闭防止跨站请求伪造"&gt;&lt;a href="#%e5%85%b3%e9%97%ad%e9%98%b2%e6%ad%a2%e8%b7%a8%e7%ab%99%e8%af%b7%e6%b1%82%e4%bc%aa%e9%80%a0" class="header-anchor"&gt;&lt;/a&gt;关闭防止跨站请求伪造&#10;&lt;/h3&gt;&lt;p&gt;测试期间系统设置中临时关闭防止跨站请求伪造，否则容易出现登录超时无法新建任务&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7039ead.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins10.png" class="gallery-image" data-flex-basis="541px" data-flex-grow="225" height="526" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7039ead.png" width="1187"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77db05d.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins22.png" class="gallery-image" data-flex-basis="801px" data-flex-grow="334" height="287" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77db05d.png" width="959"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="添加远程仓库配置"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e8%bf%9c%e7%a8%8b%e4%bb%93%e5%ba%93%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;添加远程仓库配置&#10;&lt;/h3&gt;&lt;p&gt;GitLab的用户邮箱、用户名、密码，用于拉取远程仓库代码&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f702fa6f.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins11.png" class="gallery-image" data-flex-basis="2048px" data-flex-grow="853" height="183" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f702fa6f.png" width="1562"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="凭据"&gt;&lt;a href="#%e5%87%ad%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;凭据&#10;&lt;/h3&gt;&lt;p&gt;添加凭据，凭据为用户的标识&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f70357fd.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins12.png" class="gallery-image" data-flex-basis="403px" data-flex-grow="167" height="549" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f70357fd.png" width="922"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;选择全局凭据&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7033e32.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins13.png" class="gallery-image" data-flex-basis="639px" data-flex-grow="266" height="485" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7033e32.png" width="1293"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加凭据&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f703124d.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins14.png" class="gallery-image" data-flex-basis="908px" data-flex-grow="378" height="355" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f703124d.png" width="1344"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加为Git用户&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7038826.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins15.png" class="gallery-image" data-flex-basis="895px" data-flex-grow="373" height="268" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7038826.png" width="1000"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="jenkins-job"&gt;&lt;a href="#jenkins-job" class="header-anchor"&gt;&lt;/a&gt;Jenkins job&#10;&lt;/h2&gt;&lt;h3 id="freestyle-job"&gt;&lt;a href="#freestyle-job" class="header-anchor"&gt;&lt;/a&gt;freestyle Job&#10;&lt;/h3&gt;&lt;h4 id="freestyle-job简介"&gt;&lt;a href="#freestyle-job%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;freestyle Job简介&#10;&lt;/h4&gt;&lt;ol&gt;&#10;&lt;li&gt;需要在页面添加模块配置项与参数完成配置&lt;/li&gt;&#10;&lt;li&gt;每个Job仅能实现一个开发功能&lt;/li&gt;&#10;&lt;li&gt;无法将配置代码化，不利于Job配置迁移与版本控制&lt;/li&gt;&#10;&lt;li&gt;没有版本日志记录&lt;/li&gt;&#10;&lt;li&gt;逻辑简单&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h4 id="新建freestyle-job"&gt;&lt;a href="#%e6%96%b0%e5%bb%bafreestyle-job" class="header-anchor"&gt;&lt;/a&gt;新建freestyle Job&#10;&lt;/h4&gt;&lt;p&gt;新建任务&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7036e38.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins16.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7036e38.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加选项参数&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f70329b8.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins17.png" class="gallery-image" data-flex-basis="251px" data-flex-grow="104" height="426" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f70329b8.png" width="446"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加文本参数&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f702e141.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins18.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f702e141.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;指定远程仓库地址&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f702a326.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins19.png" class="gallery-image" data-flex-basis="734px" data-flex-grow="306" height="473" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f702a326.png" width="1448"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加Shell脚本&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77dc787.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins20.png" class="gallery-image" data-flex-basis="380px" data-flex-grow="158" height="289" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77dc787.png" width="458"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77e46e7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins21.png" class="gallery-image" data-flex-basis="426px" data-flex-grow="177" height="465" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77e46e7.png" width="826"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;保存后选择通过参数构建&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77dde13.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins23.png" class="gallery-image" data-flex-basis="423px" data-flex-grow="176" height="518" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77dde13.png" width="915"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;构建报错&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77e2de2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins28.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77e2de2.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;检查后发现Shell脚本开头的&lt;code&gt;#!/bin/bash&lt;/code&gt;写成了&lt;code&gt;#! /bin/bash&lt;/code&gt;，中间包含空格后系统无法识别&lt;/p&gt;&#10;&lt;p&gt;修正错误后重新构建&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77e5ba4.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins24.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77e5ba4.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;报语法错误，12行缺少空格&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d24a0b.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins30.png" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d24a0b.png" width="957"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;检查发现&lt;code&gt;if [ -s test.properties ]&lt;/code&gt;写成了&lt;code&gt;if [ -s test.properties]&lt;/code&gt;，修正错误后再次构建&#10;修正后的Shell脚本为&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;# export PATH=&amp;#34;/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin&amp;#34;&#10;&#10;# 打印环境变量&#10;echo &amp;#34;[INFO] 打印环境变量&amp;#34;&#10;echo &amp;#34;[INFO] 当前发布环境为 $deploy_env&amp;#34; &amp;gt;&amp;gt; test.properties&#10;echo &amp;#34;[INFO] 构建版本为 $version &amp;#34; &amp;gt;&amp;gt; test.properties&#10;echo &amp;#34;[INFO] 打印环境变量完成...&amp;#34;&#10;&#10;# 检查test.properties&#10;echo &amp;#34;[INFO] 检查test.properties&amp;#34;&#10;if [ -s test.properties ]&#10;then&#10; cat test.properties&#10; echo &amp;#34;[INFO] 检查完成...&amp;#34;&#10;else&#10; echo &amp;#34;[WARN] test.properties为空&amp;#34;&#10;fi&#10;&#10;echo &amp;#34;[INFO] 构建完成...&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;构建成功，输出正常&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77df647.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins29.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77df647.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;查看构建历史&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77d9a0b.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins25.png" class="gallery-image" data-flex-basis="219px" data-flex-grow="91" height="413" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77d9a0b.png" width="378"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77e1271.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins27.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77e1271.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;同时显示构建稳定性&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f77d85c4.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins26.png" class="gallery-image" data-flex-basis="1297px" data-flex-grow="540" height="244" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f77d85c4.png" width="1319"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="pipeline-job"&gt;&lt;a href="#pipeline-job" class="header-anchor"&gt;&lt;/a&gt;pipeline job&#10;&lt;/h3&gt;&lt;h4 id="pipeline-job简介"&gt;&lt;a href="#pipeline-job%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;pipeline job简介&#10;&lt;/h4&gt;&lt;ol&gt;&#10;&lt;li&gt;所有代码包裹在pipeline{}内&lt;/li&gt;&#10;&lt;li&gt;stages{}用来包含pipeline所有子层&lt;/li&gt;&#10;&lt;li&gt;stage(管道名称){}每个子层可以执行一个任务，并不互相影响&lt;/li&gt;&#10;&lt;li&gt;steps{}用来添加具体需要调用的模块语句&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h4 id="新建pipeline任务"&gt;&lt;a href="#%e6%96%b0%e5%bb%bapipeline%e4%bb%bb%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;新建pipeline任务&#10;&lt;/h4&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d279f0.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins31.png" class="gallery-image" data-flex-basis="289px" data-flex-grow="120" height="882" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d279f0.png" width="1065"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h4 id="编写pipeline-脚本"&gt;&lt;a href="#%e7%bc%96%e5%86%99pipeline-%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;编写pipeline 脚本&#10;&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;#!groovy&#10;&#10;pipeline {&#10; // agent 定义pipeline在何处运行，使用any、none或者Jenkins node主机名&#10;&#9;agent {node {label &amp;#39;master&amp;#39;}}&#10;&#9;// 声明环境变量，environment 定义系统环境变量，可以应用于所有stages&#10;&#9;// 定义局部环境变量则于steps平级即可&#10;&#9;environment {&#10;&#9;&#9;PATH=&amp;#34;/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin&amp;#34;&#10;&#9;}&#10;&#10;&#9;parameters {&#10;&#9;&#9;// 声明可选参数&#10;&#9;&#9;choice(&#10;&#9;&#9;&#9;&#9;// 可选参数为两个，以空行分隔&#10;&#9;&#9;&#9;&#9;choices: &amp;#39;dev\nprod&amp;#39;,&#10;&#9;&#9;&#9;&#9;// 设置参数描述&#10;&#9;&#9;&#9;&#9;description: &amp;#39;选择发布环境&amp;#39;,&#10;&#9;&#9;&#9;&#9;// 声明参数变量名&#10;&#9;&#9;&#9;&#9;name: &amp;#39;deploy_env&amp;#39;&#10;&#9;&#9;&#9;)&#10;&#9;&#9;// 声明文本参数，和默认值&#10;&#9;&#9;string (name: &amp;#39;version&amp;#39;, defaultValue: &amp;#39;0.0.1&amp;#39;,description: &amp;#39;构建版本号&amp;#39;)&#10;&#9;}&#10;&#10;&#9;stages {&#10;&#9;&#9;// 执行一个任务&#10;&#9;&#9;stage(&amp;#34;切换到测试版本仓库&amp;#34;) {&#10;&#9;&#9;&#9;// 添加具体需要调用的模块语句&#10;&#9;&#9;&#9;steps {&#10;&#9;&#9;&#9;&#9;// 关闭Git ssl安全认证&#10;&#9;&#9;&#9;&#9;sh &amp;#39;git config --system http.sslVerify false&amp;#39;&#10;&#9;&#9;&#9;&#9;// 指定工作空间&#10;&#9;&#9;&#9;&#9;dir (&amp;#34;${env.WORKSPACE}&amp;#34;) {&#10;&#9;&#9;&#9;&#9;&#9;// 指定分支和Jenkins凭据ID&#10;&#9;&#9;&#9;&#9;&#9;git branch: &amp;#39;master&amp;#39;,&#10;&#9;&#9;&#9;&#9;&#9;&#9;credentialsId: &amp;#39;52f4c34f-544c-4830-828d-6691d603b8e4&amp;#39;,&#10;&#9;&#9;&#9;&#9;&#9;&#9;url: &amp;#39;http://home.fjy8018.top:8099/jenkins/test-repo.git&amp;#39;&#10;&#9;&#9;&#9;&#9;}&#10;&#9;&#9;&#9;}&#10;&#9;&#9;}&#10;&#9;&#9;stage(&amp;#34;打印环境变量&amp;#34;) {&#10;&#9;&#9;&#9;steps {&#10;&#9;&#9;&#9;&#9;dir (&amp;#34;${env.WORKSPACE}&amp;#34;) {&#10;&#9;&#9;&#9;&#9;&#9;sh &amp;#34;&amp;#34;&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&#9;echo &amp;#34;[INFO] 打印环境变量&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&#9;echo &amp;#34;[INFO] 当前发布环境为 $deploy_env&amp;#34; &amp;gt;&amp;gt; test.properties&#10;&#9;&#9;&#9;&#9;&#9;&#9;echo &amp;#34;[INFO] 构建版本为 $version &amp;#34; &amp;gt;&amp;gt; test.properties&#10;&#9;&#9;&#9;&#9;&#9;&#9;echo &amp;#34;[INFO] 打印环境变量完成...&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&amp;#34;&amp;#34;&amp;#34;&#10;&#9;&#9;&#9;&#9;}&#10;&#9;&#9;&#9;}&#10;&#9;&#9;}&#10;&#9;&#9;stage(&amp;#34;检查test.properties&amp;#34;) {&#10;&#9;&#9;&#9;steps {&#10;&#9;&#9;&#9;&#9;dir (&amp;#34;${env.WORKSPACE}&amp;#34;) {&#10;&#9;&#9;&#9;&#9;&#9;sh &amp;#34;&amp;#34;&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&#9;echo &amp;#34;[INFO] 检查test.properties&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&#9;if [ -s test.properties ]&#10;&#9;&#9;&#9;&#9;&#9;&#9;then&#10;&#9;&#9;&#9;&#9;&#9;&#9; cat test.properties&#10;&#9;&#9;&#9;&#9;&#9;&#9; echo &amp;#34;[INFO] 检查完成...&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&#9;else&#10;&#9;&#9;&#9;&#9;&#9;&#9; echo &amp;#34;[WARN] test.properties为空&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;&#9;fi&#10;&#9;&#9;&#9;&#9;&#9;&amp;#34;&amp;#34;&amp;#34;&#10;&#9;&#9;&#9;&#9;&#9;echo &amp;#34;[INFO] 构建完成...&amp;#34;&#10;&#9;&#9;&#9;&#9;}&#10;&#9;&#9;&#9;}&#10;&#9;&#9;}&#10;&#9;}&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中&lt;code&gt;credentialsId&lt;/code&gt;来自用户的凭据唯一标识，可在凭据页面查看&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d23347.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins32.png" class="gallery-image" data-flex-basis="771px" data-flex-grow="321" height="361" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d23347.png" width="1161"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h4 id="写入shell脚本"&gt;&lt;a href="#%e5%86%99%e5%85%a5shell%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;写入Shell脚本&#10;&lt;/h4&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d204fe.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins33.png" class="gallery-image" data-flex-basis="495px" data-flex-grow="206" height="452" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d204fe.png" width="934"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;执行报错，&lt;code&gt;error: could not lock config file /etc/gitconfig: ????&lt;/code&gt;&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d21c71.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins34.png" class="gallery-image" data-flex-basis="314px" data-flex-grow="130" height="749" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d21c71.png" width="981"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;由于使用root用户执行同样命令不会报错，故猜测没有权限，修改语法为&lt;code&gt;git config --global http.sslVerify false&lt;/code&gt;即可&#10;重新构建&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d294a2.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins35.png" class="gallery-image" data-flex-basis="309px" data-flex-grow="128" height="870" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d294a2.png" width="1121"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;日志符合预期&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d1bde0.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins36.png" class="gallery-image" data-flex-basis="620px" data-flex-grow="258" height="192" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d1bde0.png" width="496"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="freestyle-shell-job"&gt;&lt;a href="#freestyle-shell-job" class="header-anchor"&gt;&lt;/a&gt;freestyle shell Job&#10;&lt;/h3&gt;&lt;p&gt;新建任务&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d1ec30.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins37.png" class="gallery-image" data-flex-basis="751px" data-flex-grow="313" height="326" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d1ec30.png" width="1021"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;写入shell脚本如下&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash&#10;&#10;user=`whoami`&#10;&#10;if [ $user == &amp;#39;deploy&amp;#39; ]; then&#10;&#9;echo &amp;#34;成功，当前用户为 $user&amp;#34;&#10;else&#10;&#9;echo &amp;#34;失败，当前用户不是 $user&amp;#34;&#10;fi&#10;# 查看主机ip&#10;ip addr&#10;# 查看系统版本&#10;cat /etc/system-release&#10;# 查看内存状态&#10;free -m&#10;# 查看磁盘状态&#10;df -h&#10;# 将python安装位置赋值给变量&#10;py_cmd=`which python`&#10;# 查看python版本号&#10;$py_cmd --version&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d1d3a0.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins38.png" class="gallery-image" data-flex-basis="384px" data-flex-grow="160" height="602" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d1d3a0.png" width="964"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;运行并查看日志，符合预期&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821f7d26264.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins39.png" class="gallery-image" data-flex-basis="365px" data-flex-grow="152" height="759" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821f7d26264.png" width="1157"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="参数任务"&gt;&lt;a href="#%e5%8f%82%e6%95%b0%e4%bb%bb%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;参数任务&#10;&lt;/h3&gt;&lt;p&gt;新建参数化构建任务&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700347046.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins44.png" class="gallery-image" data-flex-basis="662px" data-flex-grow="276" height="392" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700347046.png" width="1082"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加选项参数等&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b8270034698e.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins45.png" class="gallery-image" data-flex-basis="267px" data-flex-grow="111" height="627" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b8270034698e.png" width="699"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;添加shell构建参数&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b8270034511c.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins46.png" class="gallery-image" data-flex-basis="404px" data-flex-grow="168" height="376" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b8270034511c.png" width="634"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;构建&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700345d4a.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins47.png" class="gallery-image" data-flex-basis="337px" data-flex-grow="140" height="465" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700345d4a.png" width="654"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;输出符合预期&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82700341009.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins48.png" class="gallery-image" data-flex-basis="531px" data-flex-grow="221" height="432" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82700341009.png" width="957"&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>Jenkins 安装配置</title><link>https://blog.fjy8018.top/archives/179/</link><pubDate>Sun, 26 Aug 2018 11:32:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/179/</guid><description>&lt;h1 id="使用docker安装"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8docker%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;使用Docker安装&#10;&lt;/h1&gt;&lt;h2 id="基础环境"&gt;&lt;a href="#%e5%9f%ba%e7%a1%80%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;基础环境&#10;&lt;/h2&gt;&lt;p&gt;docker环境&#10;查看docker版本&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# docker -v&#10;Docker version 18.06.0-ce, build 0ffa825&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;新建用户目录，用户挂载容器存储&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;useradd jenkins-docker&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行docker命令&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -p 8081:8080 -p 50001:50000 -v /home/jenkins-docker:/var/jenkins_home hub.c.163.com/library/jenkins:latest&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b824d9100b45.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins40.png" class="gallery-image" data-flex-basis="356px" data-flex-grow="148" height="343" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b824d9100b45.png" width="510"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;命令中没有使用后台启动为了查看输出的管理员密码&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b8250976f9d7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins41.png" class="gallery-image" data-flex-basis="294px" data-flex-grow="122" height="635" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b8250976f9d7.png" width="780"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;若使用了挂载目录也可以在挂载的目录下查看&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b82524685344.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins43.png" class="gallery-image" data-flex-basis="696px" data-flex-grow="290" height="264" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b82524685344.png" width="766"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;访问web界面，输入密码即可&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b825097716e7.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins42.png" class="gallery-image" data-flex-basis="457px" data-flex-grow="190" height="712" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b825097716e7.png" width="1357"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h1 id="使用原生系统安装"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e5%8e%9f%e7%94%9f%e7%b3%bb%e7%bb%9f%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;使用原生系统安装&#10;&lt;/h1&gt;&lt;h2 id="基础环境-1"&gt;&lt;a href="#%e5%9f%ba%e7%a1%80%e7%8e%af%e5%a2%83-1" class="header-anchor"&gt;&lt;/a&gt;基础环境&#10;&lt;/h2&gt;&lt;p&gt;CentOS7 1804最小安装&lt;/p&gt;&#10;&lt;p&gt;安装基础wget工具&lt;code&gt;yum install -y wget&lt;/code&gt;&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd19e26.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins1.png" class="gallery-image" data-flex-basis="288px" data-flex-grow="120" height="635" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd19e26.png" width="763"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="导入仓库源"&gt;&lt;a href="#%e5%af%bc%e5%85%a5%e4%bb%93%e5%ba%93%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;导入仓库源&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd15815.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins2.png" class="gallery-image" data-flex-basis="982px" data-flex-grow="409" height="182" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd15815.png" width="745"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;下载并导入仓库的key，用于验证仓库安全性&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="安装java8"&gt;&lt;a href="#%e5%ae%89%e8%a3%85java8" class="header-anchor"&gt;&lt;/a&gt;安装java8&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install java&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;验证java版本&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# java -version&#10;openjdk version &amp;#34;1.8.0_181&amp;#34;&#10;OpenJDK Runtime Environment (build 1.8.0_181-b13)&#10;OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="关闭防火墙"&gt;&lt;a href="#%e5%85%b3%e9%97%ad%e9%98%b2%e7%81%ab%e5%a2%99" class="header-anchor"&gt;&lt;/a&gt;关闭防火墙&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# systemctl stop firewalld&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;关闭防火墙开机启动&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# systemctl disable firewalld&#10;Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.&#10;Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="关闭强制访问控制安全策略"&gt;&lt;a href="#%e5%85%b3%e9%97%ad%e5%bc%ba%e5%88%b6%e8%ae%bf%e9%97%ae%e6%8e%a7%e5%88%b6%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5" class="header-anchor"&gt;&lt;/a&gt;关闭强制访问控制安全策略&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/sysconfig/selinux&#10;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;# This file controls the state of SELinux on the system.&#10;# SELINUX= can take one of these three values:&#10;# enforcing - SELinux security policy is enforced.&#10;# permissive - SELinux prints warnings instead of enforcing.&#10;# disabled - No SELinux policy is loaded.&#10;SELINUX=enforcing&#10;# SELINUXTYPE= can take one of three two values:&#10;# targeted - Targeted processes are protected,&#10;# minimum - Modification of targeted policy. Only selected processes are protected.&#10;# mls - Multi Level Security protection.&#10;SELINUXTYPE=targeted&#10;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;SELINUX=enforcing&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;改成&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;SELINUX=disabled&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;reboot使禁用操作生效&lt;/p&gt;&#10;&lt;p&gt;查看操作是否生效&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# getenforce&#10;Disabled&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="安装jenkins"&gt;&lt;a href="#%e5%ae%89%e8%a3%85jenkins" class="header-anchor"&gt;&lt;/a&gt;安装jenkins&#10;&lt;/h2&gt;&lt;h3 id="直接安装"&gt;&lt;a href="#%e7%9b%b4%e6%8e%a5%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;直接安装&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install jenkins&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd1918e.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins3.png" class="gallery-image" data-flex-basis="311px" data-flex-grow="129" height="601" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd1918e.png" width="780"&gt;&lt;/a&gt;&#10;安装后会自动添加jenkins，此时可以自定义发布用户&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# useradd jenkins&#10;useradd：用户“jenkins”已存在&#10;[root@localhost ~]# useradd deploy&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="配置"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;配置&#10;&lt;/h3&gt;&lt;p&gt;编辑配置文件&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# vi /etc/sysconfig/jenkins &#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将用户改为新建的用户&lt;code&gt;JENKINS_USER=&amp;quot;deploy&amp;quot;&lt;/code&gt;，端口号默认为8080&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd19e34.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins4.png" class="gallery-image" data-flex-basis="294px" data-flex-grow="122" height="635" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd19e34.png" width="780"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;修改log目录和权限&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# chown -R deploy:deploy /var/lib/jenkins&#10;[root@localhost ~]# chown -R deploy:deploy /var/log/jenkins&#10;[root@localhost ~]# chown -R deploy:deploy /var/cache/jenkins&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="启动jenkins"&gt;&lt;a href="#%e5%90%af%e5%8a%a8jenkins" class="header-anchor"&gt;&lt;/a&gt;启动jenkins&#10;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# systemctl start jenkins&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看服务是否启动&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost ~]# ps -ef | grep jenkins&#10;root 1445 1311 0 19:06 pts/0 00:00:00 grep --color=auto jenkins&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者使用lsof（需要额外安装）&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[root@localhost jenkins]# lsof -i:8080&#10;COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME&#10;java 1683 deploy 161u IPv6 24353 0t0 TCP *:webcache (LISTEN)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="访问web界面"&gt;&lt;a href="#%e8%ae%bf%e9%97%aeweb%e7%95%8c%e9%9d%a2" class="header-anchor"&gt;&lt;/a&gt;访问web界面&#10;&lt;/h3&gt;&lt;p&gt;地址为ip:8080&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd1f054.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins5.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd1f054.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;去提示的目录下查找密码&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd178fd.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins6.png" class="gallery-image" data-flex-basis="557px" data-flex-grow="232" height="324" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd178fd.png" width="753"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;安装推荐配置插件&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd1fedb.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins7.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd1fedb.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;新建管理员用户&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd1c3bc.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins8.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd1c3bc.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;安装成功&#10;&lt;a class="link" href="https://i.loli.net/2018/08/26/5b821cbd127fc.png" target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Jenkins9.png" class="gallery-image" data-flex-basis="488px" data-flex-grow="203" height="943" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://i.loli.net/2018/08/26/5b821cbd127fc.png" width="1920"&gt;&lt;/a&gt;&lt;/p&gt;&#10;</description></item></channel></rss>