Centos 7 Java配置maven+jenkins+git(svn)+tomcat自动编译和部署(持续集成)

目的

在开发中,需要经常频繁的对测试服务器进行部署,而且在多人协同中开发经常遇到的问题就是别人更新了他的代码,而你去更新你的代码时并没有更新到别人的代码,导致测试环境的代码不是最新,当然这个问题也好解决,那就是每次更新的时候先获取版本控制器上面的代码,然后更新,当然每次这样操作都是耗时耗力的,如果是整个项目更新,一般项目至少3、40M上传到服务器也需要一定的时间,而部分更新,也需要找到指定的文件或者整个代码覆盖,然后重启服务器(Tomcat里面直接覆盖class虽然可以配置热加载,但是容易内存溢出),就我工作中的情况而言,是每次都需要先把代码上传到服务器-解压-找到Tomcat进程id(Linux)-kill线程-启动Tomcat,每次下来就需要最少几分钟时间,而且每天有可能多次部署,所以对整个工作效率是有一定影响的。正是因为以上种种,所以才有了本文,而本文最终的结果就是一旦代码上传到Git或者svn的时候,代码能自动部署到服务器上面去,这样我们就只需要吧正确的代码提交的版本控制器,就不用理会服务器的更新了。

jenkins部署

  • Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

  • Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:

    • 持续的软件版本发布/测试项目。

    • 监控外部调用执行的工作。

  • Jenkins能做的东西有很多,不过本文只介绍一个简单的自动编译打包部署,首先下载Jenkins,推荐下载war包, 下载地址: https://jenkins.io/download/

基础准备

配置jdk+tomcat: http://www.okay686.cn/628.html

关闭selinux 以及 firewall 服务。

本文是基于Centos 7,war环境部署的,把下载好的war文件直接放到Tomcat中,然后启动Tomcat,启动成功后访问tomcat的jenkins项目如:

war包下载: http://mirrors.jenkins.io/war-stable/latest/jenkins.war

http://192.168.96.129:8080/jenkins 会看到以下界面:

未分类

注意红色框中的红色文字,那个是初始密码的路径,直接根据路径找到initialAdminPassword文件并打开,把密码复制出来,输入到页面中点击continue按钮,进入下一步: ( /root/.jenkins/secrets/initialAdminPassword )

未分类

Jenkins拥有很多插件,一般在开始我们并不清楚需要什么插件的时候,可以选择自定义安装,把所有基本的插件全部安装好,此页面第一个按钮是安装推荐插件,第二个是自己选择安装,这里我选择第二个按钮。

未分类

此界面是初始化安装插件的界面,先选择All插件,然后点击install

未分类

在这个界面需要多等一下,因为是在网上下载插件,而且是外国的网站,所以经常有下载失败的情况,最好打开V梯P子N,当所有插件安装完成后会有continue按钮出现,如果没有则刷新一下页面,当然也可能存在有插件安装失败,根据自己是否需要自行选择retry或continue,这里因为我的都已经安装完成了,所以进入到了下一个页面.

未分类

在此页面设置用户名和密码,记得点击save and finish按钮,如果选择了Continue as admin,会把用户名重置admin,然后密码也是你设置的密码,而是初始化文件中的密码,设置完成之后的页面.

未分类

点击Start using Jenkins 即可

未分类

Jenkins主界面

未分类

配置Jenkins

创建项目之前先要对Jenkins进行基本的配置,比如jdk的目录,git命令的目录和maven的目录等等

首先点击 系统管理

进入管理页面后如图:

未分类

点击 Global Tool Configuration 进入插件配置页面

配置jdk

(不晓得安装位置,好办,打开 vim /etc/profile 就可以找到!)

未分类

点击新增JDK按钮,会显示jdk配置form,如果电脑上已经安装了jdk则可以去掉自动安装,不过如果是用Tomcat运行的Jenkins那么是肯定已经安装了的,这里我们只需要配置好 jdk别名 和 JAVA_HOME 即可

配置git

未分类

需要将git的正确路径配置到Path to Git executable中。

配置maven

未分类

跟jdk相同,配置好名字和路径即可,当然也可以选择自动安装,不过还是推荐手动安装然后配置,配置好了之后点击save即可

当然还有现在很火的Gradle (有空写个教程,在此,我没有配置)

未分类

安装插件

由于新版默认没有将war部署到Tomcat的插件,所以需要手动安装,在系统管理中选择管理插件,再选择可选插件,搜索 Deploy to Container Plugin ,然后勾选点击直接安装

创建Jenkins任务

点击开始创建一个新任务进入任务创建页面:

未分类

先输入项目名字,然后选择构建一个maven项目,最后点击ok按钮

选择版本控制器

页面中找到源码管理模块,根据项目使用的版本控制器选择,如我们使用的git,则选择git

未分类

选择构建触发器

如果是git的话,可以直接通过GitLab(WebHooks)来实现触发,这样你每次提交到配置编译的分支就会git就会通知,不过目前我知道的是git.oschina.NET的钩子没有作用,当然如果不是git或者钩子没有作用的时候,可以用最简单的,定时查询。

未分类

这样是每10分钟查询一次,如果有更新就构建,具体Poll SCM的参数可以百度,那里更加详细

配置编译命令

编译命令我们可以直接配置最简单的命令编译:

未分类

选择Execute shell,在出来的界面中配置maven命令就行了,比如

mvn install

配置部署到Tomcat

点击新增构建后操作,选择 Deploy war/ear to a container ,然后配置 WAR/EAR files ,这个war的地址,一般都 target/xxx.war ,xxx是war的文件名。

然后点击Add Container,添加Tomcat服务器:

未分类

配置好Tomcat的管理员用户和密码以To及mcat的访问地址就ok了,这样只要你上传了代码,并且是配置编译的分支,一般过几分钟就会自动编译然后部署到Tomcat中了,当然最好还是用git,然后通过GitLab实现,这样不仅不用每隔几分钟查询一次,而且延迟很小!!

docker+jenkins+seneca构建去集中化微服务架构

前言

在微服务架构中,服务发现一直是一件比较复杂的事。而且服务发现式的架构处理不好,容易产生集中化。同时,微服务的提供,不可避免的需要一些负载均衡方案,实现服务的高可用和可扩展,这无疑增加了很多复杂度。

笔者认为,使用异步、基于消息的方式,可能更适合微服务架构。

基于消息的微服务架构,对于所有微服务的部署条件非常简单,只需要能访问到消息服务即可。同时微服务节点的移除和增加不会影响到服务的提供。相比服务发现的架构,简单太多了,简单即是美。

在这次实践中,使用到了seneca,一个nodejs 微服务框架。seneca,使用seneca-amqp-transport插件,可以轻松构建基于消息的微服务。

下面是架构图:

未分类

https://www.processon.com/view/link/59dc2491e4b0ef561379bc25
在这个架构中,我们使用的是标准的seneca定义的命令规范,这可能是所有微服务都需要遵守的一个规范,至于说使用其他语言,也很简单。封装一个seneca命令规范的库即可。不知道官方有没开发,开发起来难度也不会太大。

接口层比较灵活,可以根据上层应用特性,来决定如何封装传输协议,最后将转化成标准命令发送到消息服务。不建议直接访问消息服务,上层应用应保持灵活。

完整的实践代码:https://github.com/luaxlou/micro-service-practice.git

一、前期准备

使用docker-machine创建虚拟机。

关于docker的一些基本用法,可以读上一篇文章:docker+consul基于服务发现的极简web架构实践,这里就不再赘述。

依次创建3台虚拟机:

$ dm create -d "virtualbox” node1
$ dm create -d "virtualbox” node2
$ dm create -d "virtualbox" node3

二、开始构建

1、搭建Rabbitmq消息服务

消息队列服务,已经成为高并发应用的必备基础服务。我们选用Rabbitmq,你可以换成任意的,遵循amqp协议即可。

使用docker安装很方便,但是生产环境不建议使用docker安装。更推荐的是使用云服务,这样能保证足够高的高可用和扩展性。虽然价格贵点,但是这是唯一的单点,花点钱还是值得的。

直接安装在宿主机上:

$ docker search rabbitmq

NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
rabbitmq                                   RabbitMQ is an open source multi-protocol ...   1466      [OK]
tutum/rabbitmq                             Base docker image to run a RabbitMQ server      11
frodenas/rabbitmq                          A Docker Image for RabbitMQ                     11                   [OK]
sysrun/rpi-rabbitmq                        RabbitMQ Container for the Raspberry Pi 2 ...   6
aweber/rabbitmq-autocluster                RabbitMQ with the Autocluster Plugin            5
gonkulatorlabs/rabbitmq                    DEPRECATED: See maryville/rabbitmq              5                    [OK]
letsxo/rabbitmq                            RabbitMQ with Management and MQTT plugins.      4                    [OK]
bitnami/rabbitmq                           Bitnami Docker Image for RabbitMQ               3                    [OK]
$ docker run -d --name rabbit -p   5672:5672  rabbitmq

这样就启动了一个消息队里服务,并且开放5672端口

2、安装jenkins

jenkins用于自动集成,不然每次构建是个很麻烦的事。

下面的实践是笔者掉了不少坑之后完成的,jenkins在安装过程中会有不少麻烦,而且在mac下安装也会遇到麻烦。

将jenkins 安装到 node1

$ dm ssh node1

$ mkdir /mnt/sda1/var/jenkins_home
$ sudo chown 1000 /mnt/sda1/var/jenkins_home
$ sudo chown 1000 /var/run/docker.sock

$ docker run -d -v /var/run/docker.sock:/var/run/docker.sock 
                -v /mnt/sda1/var/jenkins_home:/var/jenkins_home 
                -v $(which docker):/usr/bin/docker -p 8080:8080 jenkins

查看初始密码:

$ cat /mnt/sda1/var/jenkins_home/secrets/initialAdminPassword

3、安装私有的Registry

在mac上安装即可

$ docker run -d -p 5000:5000 registry

文档参考:https://docs.docker.com/registry/spec/api/

4、准备代码

代码使用的是seneca官方的例子,完整的Dockerfile也已经写好。

FROM node:alpine

RUN npm install pm2 -g
WORKDIR /usr/src/app

COPY package.json ./
RUN npm install
COPY . .

CMD ["pm2-docker","process.yml"]

为了让nodejs能使用到多核cpu,Dockerfile 集成了pm2,使用pm2来管理node进程。

完整代码:
https://github.com/luaxlou/micro-service-practice.git

5、配置自动集成

这里使用了最新版的jenkins,新版的jenkins使用了pipline。一种新的构建方式,使用groovy语法。

写起来是挺优雅的,但是学习成本颇高。因为文档不全及有些文档失效,笔者不得已反编译了pipeline插件,才得以调通。

使用pipeline script

node {
    stage('Preparation') {
        def r = git('https://github.com/luaxlou/micro-service-practice.git')
   }
   stage('Build') {
       dir('seneca-listener') {
          withEnv(["DOCKER_REGISTRY_URL=http://192.168.99.1:5000"]) {

              docker.build("seneca-listener").push("latest")

          }

       }

   }

}

开始构建,顺利的话,会看到如下的结果:

未分类

这是pipeline的特性,可以可视化看到各个阶段的执行情况,算是不小的进步吧。

访问私有Registy的API,就可以看到生成的tag。

curl http://192.168.99.1:5000/v2/seneca-listener/tags/list

6、最后一步,试试我们的程序

在宿主机发布消息:

$ git clone https://github.com/luaxlou/micro-service-practice.git

seneca-clinet 代码是接口层代码的示意,可以根据自己的喜好封装。
同时直接发送了命令代码用于测试。

进入seneca-clinet 目录

$  AMQP_URL=192.168.99.1:5672 node index.js

这个程序会每隔两秒发送一个命令:

#!/usr/bin/env node
'use strict';

const client = require('seneca')()
    .use('seneca-amqp-transport')
    .client({
        type: 'amqp',
        pin: 'cmd:salute',
        url: process.env.AMQP_URL
    });

setInterval(function() {
    client.act('cmd:salute', {
        name: 'World',
        max: 100,
        min: 25
    }, (err, res) => {
        if (err) {
            throw err;
        }
        console.log(res);
});
}, 2000);

虽然一直在发命令,你很快就会发现命令全部超时了。这是因为还没有消费者,当然这些命令也没有丢失,只不过接口层没有得到及时返回。如果应用层支持异步的模式,每个command都有独立的id,可以保留id后,以后再过来取。这就很灵活了,一切看需求去封装接口层即可。

进入node2

$ docker run 192.168.99.1:5000/seneca-listener:latest
0|seneca-l | {"kind":"notice","notice":"hello seneca fwunhukrcmzn/1507605332382/16/3.4.2/-","level":"info","seneca":"fwunhukrcmzn/1507605332382/16/3.4.2/-","when":1507605332661}

启动后,回到seneca-clinet,发现之前超时的命令,全部接收到了。

{ id: 86,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332699 }
{ id: 44,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332701 }
{ id: 56,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332703 }
{ id: 57,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332706 }
{ id: 58,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332707 }

至此,完整架构已经构建完毕。

7、一些未完的事项

  1. 自动集成,只需要配置webhook即可。

  2. 自动部署,因为docker运转的方式,当服务升级时需要重启docker进程。方式有很多,比较粗暴的是直接控制宿主机,或者类似salt这样的工具。

目前来说,没有找到太好的开源方案。个人倾向于自己开发agent,发布有限的API,用于常规的部署或者其他任务,以及可以定时收集服务器的信息,用于监控。这可能会是笔者的下一个开源项目。

三、总结

这篇文章算是一个新的里程碑,实践的成果将用于后期的架构。docker让我从传统的架构模式中脱离出来,同时也让我吃了不少苦头。但这一切都是值得的。

同时也是一个新的开始,终于从之前的公司出来。未来何去何从,有很多的未知,但我相信都是美好的。

这也许就是人生的魅力。

Hello World!!

使用Jenkins进行持续构建与发布应用到Kubernetes集群中

我们基于Jenkins的CI/CD流程如下所示。

未分类

流程说明

应用构建和发布流程说明。

  1. 用户向Gitlab提交代码,代码中必须包含Dockerfile;

  2. 将代码提交到远程仓库;

  3. 用户在发布应用时需要填写git仓库地址和分支、服务类型、服务名称、资源数量、实例个数等,确定后触发Jenkins自动构建;

  4. Jenkins的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库;

  5. Jenkins的CI流水线中包括了自定义脚本,根据我们已准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项;

  6. 生成应用的kubernetes YAML配置文件;

  7. 更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息

  8. 更新PowerDNS,向其中插入一条DNS记录,IP地址是边缘节点的IP地址。关于边缘节点,请查看kubernetes-handbook中的【最佳实践——边缘节点配置】章节;

  9. Jenkins调用kubernetes的API,部署应用到kubernetes集群中。

阿里云CentOS安装Jenkins

Jenkins是一个用Java编写的开源自动化服务器。 Jenkins有助于自动化完成非人员部分的软件开发过程,不断整合和促进连续交付的技术方面。 它是一个基于服务器的系统,可在servlet容器(如Apache Tomcat)中运行。 它支持版本控制工具,包括CVS,Subversion,Git,Mercurial,RTC等,并且可以执行Apache Ant,Apache Maven和基于sbt的项目以及任意shell脚本和Windows批处理命令。

构建可以通过各种手段触发,例如通过在版本控制系统中提交,通过类似cron的机制进行调度,并通过请求特定的构建URL。 也可以在队列中的其他构建完成后触发。 Jenkins功能可以通过插件扩展。

安装Jenkins

使用以下命令安装jenkins:

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins

安装Java:

判断Java是否已经安装

java --version

如果不存在,则用如下命令进行安装:

sudo yum install java

启动、关闭jenkins服务

sudo service jenkins start/stop/restart

阿里云安全组配置

  1. 登录 云服务器管理控制台。

  2. 单击左侧导航中的 安全组。

  3. 选择地域。

  4. 找到要授权规则的安全组,单击 配置规则。

  5. 单击 添加安全组规则。

  6. 在弹出的对话框中,设置下面参数:

未分类

Jenkins 邮件配置 (使用 Jenkins Email Extension Plugin)

前言

jenkins 总算调试好了,也能进行自动打包并发送到蒲公英内测平台,接下来开始细节改造

jenkins 的邮件通知

  • jenkins 内置的邮件功能

  • 使用插件扩展的邮件功能

内置邮件功能

默认使用java sdk中api进行邮件发送操作。配置简单。功能单一。

(图一)

步骤,系统管理—系统配置

这里写图片描述

未分类
图1

这里写图片描述

未分类
图2

注意发送服务器的设置。

引用链接:–

使用插件扩展的邮件功能

使用EmailExt 插件可以定义邮件内容。方便直观。

下载插件

系统管理—管理插件– 进入页面在搜索输入框中输入__ Email Ext

选择EmailExt 插件安装完成。

进入需要设置EmailExt插件的项目—-build 配置界面

未分类
图4

构建后任务,会多出来一个选项。选中就可以进行配置了

注意:在这之前,可以进行Email 发送模板创建。

默认模板 :

Default Subject:构建通知:$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!

Default Content:

<hr/>

(本邮件是程序自动下发的,请勿回复!)<br/><hr/>

项目名称:$PROJECT_NAME<br/><hr/>

构建编号:$BUILD_NUMBER<br/><hr/>

svn版本号:${SVN_REVISION}<br/><hr/>

构建状态:$BUILD_STATUS<br/><hr/>

触发原因:${CAUSE}<br/><hr/>

构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/>

构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>

变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>

未分类
图5

注意:这里以qq邮箱为例,需要设置邮箱账户和密码

未分类
图6

ok到这里就差不多,别忘了设置触发条件,在Emailext 选项卡的高级按钮下。

发送成功模板

图7
未分类

发送成功。

接下来,打包任务是不是随时都可以了,不用开启 android studio了。那么打包任务是不是可以让测试们打了呢?

引用:

设置qq 邮件 :
http://jingyan.baidu.com/article/e3c78d647d32bc3c4c85f5e5.html

Jenkins~通过WebDeploy实现自动部署

Jenkins以之前的文章中已经有所介绍,主要集成了自动化部署的功能,而对于自动化部署来说是由多个组件组成的,每个组件负责自己的事,如今天说的webDeploy,它主要实现将网站文件动态发布到另一台IIS服务器,并且它是决断安全的,最起始比net use要安全!

Jenkins自动化发布的一些组件

--------------------------jenkins核心功能-----------------

建立项目

配置项目的源代码路径(svn,git,tfs)

配置工作区里相对路径(工作区就是你的项目,相对目录就是在项目路径下再建立一个子文件夹)

获取源代码

发布源代码(配置web.config生产环境参数,iis用户,网络目录权限(local_service),msbuild)

将发布后的目标网络(msbuild+webDeploy 或者 powershell)

---------------------------------------------------

WebDeploy实现过程(IIS服务器)

  • 安装IIS管理工具
  • 开启远程连接,设置对应端口
  • 添加权限用户
  • 配置网站目录权限
  • 打开项目,配置发布,选择IIS/FTP
  • 输入发布参数,IIS服务器地址,用户名和密码,网站名称等

1、安装IIS管理工具

未分类

2、开启远程连接,设置对应端口

未分类

3、添加权限用户

未分类

4、配置网站目录权限

未分类

打开项目,配置发布,选择IIS/FTP

未分类

6、输入发布参数,IIS服务器地址,用户名和密码,网站名称等

未分类

然后发布已经后,就可以发到我们的IIS服务器了!

现在webDeploy和jenkins合并,确实有点双剑合并的感觉!

Ubuntu 16.04 安装 Jenkins

安装、启动并配置jenkins服务

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
systemctl status jenkins.service
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled)
Active: failed (Result: exit-code) since 一 2017-09-18 20:02:02 CST; 5min ago

 Docs: man:systemd-sysv-generator(8)

9月 18 20:02:02 DH9K45ER2 systemd[1]: Starting LSB: Start Jenkins at boot time...
9月 18 20:02:02 DH9K45ER2 jenkins[4785]: ERROR: No Java executable found in current PATH: /bin:/usr/bin:/sbin:/usr/sbin
9月 18 20:02:02 DH9K45ER2 jenkins[4785]: If you actually have java installed on the system make sure the executable is in the aforementioned path and that 't
9月 18 20:02:02 DH9K45ER2 systemd[1]: jenkins.service: Control process exited, code=exited status=1
9月 18 20:02:02 DH9K45ER2 systemd[1]: Failed to start LSB: Start Jenkins at boot time.
9月 18 20:02:02 DH9K45ER2 systemd[1]: jenkins.service: Unit entered failed state.
9月 18 20:02:02 DH9K45ER2 systemd[1]: jenkins.service: Failed with result 'exit-code'.
cat /etc/services | grep 8080 
http-alt 8080/tcp webcache # WWW caching service
http-alt 8080/udp

从日志看出Jenkins在默认情况下从8080端口启动。在这个系统端口中,8080已经在使用中了。所以在/etc/default/jenkins.修改Jenkins默认端口设置

修改/etc/default/目录下面的jenkins文件,将以下内容

# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8080

修改为:

# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8089

启动停止Jenkins

sudo service jenkins start
sudo service jenkins stop

访问路径:http://localhost:8089

其他说明

  • 安装路径:/var/lib/jenkins
  • 日志路径:/var/log/jenkins/jenkins.log

Jenkins初始化配置

1、解锁Jenkins

这里需要/var/lib/jenkins/secrets/initialAdminPassword的密码解锁Jenkins
然后把密码复制进去。

说明:按照弹框提示,找到该initialAdminPassword文件,我这里使用Docker启动Jenkins,并且把jenkins_home目录挂载到我磁盘指定目录,所以这里我只需要复制/Users/wanyang3/jenkins_home/initialAdminPassword即可,如果非挂载方式Docker启动,则需要进入容器内根据提示路径找到该文件。

2、定制 Jenkins

说明:这里若选择Install suggested plugins安装,那么jenkins就会给你推荐安装一些很有用的插件,若选择Select plugins to install安装,那么就需要自己根据业务需要选择性安装某些插件。

3、创建第一个管理员用户

说明:这里创建第一个管理员用户,也可以不设置,直接点击“Continue as admin”,进入jenkins以后再设置。

新建Pipeline Job Demo

创建一个pipeline job

/var/lib/jenkins/config.xml
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationSt
rategy">

<permission>hudson.model.Computer.Configure:admin</permission> 
<permission>hudson.model.Computer.Connect:admin</permission> 
<permission>hudson.model.Computer.Create:admin</permission>
<permission>hudson.model.Computer.Delete:admin</permission>
<permission>hudson.model.Computer.Disconnect:admin</permission> 
<permission>hudson.model.Hudson.Administer:admin</permission> 
<permission>hudson.model.Hudson.Read:admin</permission> 
<permission>hudson.model.Hudson.Read:anonymous</permission> 
<permission>hudson.model.Hudson.RunScripts:admin</permission> 
<permission>hudson.model.Item.Build:admin</permission> 
<permission>hudson.model.Item.Cancel:admin</permission> 
<permission>hudson.model.Item.Configure:admin</permission> 
<permission>hudson.model.Item.Create:admin</permission> 
<permission>hudson.model.Item.Delete:admin</permission> 
<permission>hudson.model.Item.Discover:admin</permission> 
<permission>hudson.model.Item.Read:admin</permission> 
<permission>hudson.model.Item.Workspace:admin</permission> 
<permission>hudson.model.Run.Delete:admin</permission> 
<permission>hudson.model.Run.Update:admin</permission> 
<permission>hudson.model.View.Configure:admin</permission> 
<permission>hudson.model.View.Create:admin</permission> 
<permission>hudson.model.View.Delete:admin</permission> 
<permission>hudson.model.View.Read:admin</permission> 
<permission>hudson.scm.SCM.Tag:admin</permission> 
</authorizationStrategy> 

</authorizationStrategy>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">

<disableSignup>false</disableSignup> 
<enableCaptcha>false</enableCaptcha> 

修改用户密码

/var/lib/jenkins/users/user/config.xml
<hudson.security.HudsonPrivateSecurityRealm_-Details>
<passwordHash>#jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS</passwordHash>
</hudson.security.HudsonPrivateSecurityRealm_-Details>

注:密码为111111

Jenkins详细安装配置

使用docker安装Jenkins

安装docker

yum install -y docker

启动docker

service docker start

创建一个目录保存Jenkins数据

mkdir /home/data
chmod -R 777 /home/data
docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v /home/data:/var/jenkins_home jenkins

启动成之后,开始配置Jenkins

使用游览器访问

http://IP:8080

这时候出现如下画面,需要输入Administrator password

未分类

执行命令

docker exec -it myjenkins cat /var/jenkins_home/secrets/initialAdminPassword

就能查到Administrator password

未分类

开始安装插件

标准安装和自定义安装,可以点击标准安装,直接开始安装

未分类

这里等的时间会比较长一点

安装成功之后,设置用户名和密码

未分类

安装成功之后显示

未分类

Jenkins之权限分配

一、操作环境

1、Jenkins

  • Jenkins 2.75

二、权限配置地点

在Jenkins的主界面中,点击【系统管理】

未分类

在【系统管理】中点击【Configure Global Security】

未分类

在【Configure Global Security】页面中,在“授权策略”中将“项目矩阵授权策略”选中

未分类

三、配置权限

在配置权限前,首先得将自己的系统用户创建好,一个是拥有所有权限的系统管理员admin,另一个是专供开发人员所使用的dev,创建好之后如下:

未分类

在刚才的“授权策略”中,在“添加用户/组”中,添加“admin”点击【添加】按钮,之后重复刚才的操作,添加“dev”

未分类

由于“admin”是系统管理员,所以说拥有全部的权限,所以说将全部的权限复选框全部选中,而dev是属于开发人员,因而我们只希望其具有项目构建的权限,所以说我们会只给其分配“Read”和“Build”权限,而匿名用户,我们往往只希望其能够查看项目,不允许其进行任何的操作,因而只分配“Read”权限,分配完之后的结果如下所示:

未分类

在Tomcat 8上部署Jenkins

软件安装包

  • JDK: jdk-8u131-linux-x64.tar.gz
  • Tomcat: apache-tomcat-8.5.14.tar.gz

  • Jenkins版本: Jenkins ver. 2.60.2

1、配置jdk

tar xvf jdk-8u131-linux-x64.tar.gz -C /usr/local
cd /usr/local
mv jdk-8u131-linux-x64.tar.gz jdk
su - tomcat
vim .bash_profile
    JAVA_HOME=/usr/local/jdk
    PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
    export PATH JAVA_HOME
source .bash_profile

2、安装Tomcat8

tar xvf apache-tomcat-8.5.14.tar.gz /usr/local
cd /usr/local
mv apache-tomcat-8.5.14 tomcat
#更改cacheMaxSize
vim /usr/local/tomcat/conf/context.xml 
    <Context>
        <Resources cachingAllowed="true" cacheMaxSize="100000" />
    </Context>
#更改Tomcat内存
vim /usr/local/tomcat/bin/catalina.sh
    JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx2048m -XX:MaxNewSize=256m"

3、部署Jenkins

cp jenkis.war /usr/local/tomcat/webapps

4、启动Tomcat

/usr/local/tomcat/bin/startup.sh