Gitlab通过Webhook实现Push代码后Jenkins自动构建

1. 生成Gitlab的Access Token

点击用户下面的Settings, 如下图

未分类

再点击Access Tokens, 填写Name, 点击Create personal access token 生成Access Token

未分类

2. Jenkins安装插件

需要安装GitLab Plugin, Gitlab Hook Plugin

3. 在Jenkins中配置Gitlab API token

点击系统设置

未分类

填写Connection name, 如gitlab.abc.com
填写Gitlab host URL, 如 http://gitlab.abc.com

未分类

点击Add按钮,在弹出框中填写步骤1生成的Access Token

未分类

4. 配置源码管理

Repository URL示例: [email protected]:gopher/demo.git

未分类

点击Add按钮,在弹出框中按下图填写。注意:jenkins所在的机器上要先生成公钥、私钥,且在用户目录下。

未分类

5. 生成回调地址和Secret Token

在构建触发器中选中Build when a change is pushed to GitLab,GitLab webhook URL即是回调地址,如下图中红线处,例如: http://jenkins.abc.com/project/demo

未分类

再点击上图中的高级按钮,这时会出现高级选项, 如下图,点击Generate按钮生成Secret Token

未分类

6. 配置Gitlab的webhook

假如GItlab中有一个项目demo,那么先进入这个项目,然后,再点击Settings >> Integrations

未分类

填写步骤5中生成的回调地址,和Secret Token, 再点击Add Webhook创建Webhook, 最后点击test测试下是否配置成功.

未分类

Jenkins持续集成演示

1. 去我们的仓库修改一下代码

为了节约时间,我直接在网页上改了。

未分类

我们把布局页的footer信息改一下:

未分类

然后提交。

2. 切换到Jenkins可以看到已经在构建了

未分类

等待构建完成。

未分类

3. 访问我们部署的地址 可以看到footer已经被成功更改

未分类

整个过程我们就改一下代码,提交就行了。

Ansible+Jenkins+Svn实现自动化部署

  • 实验平台:CentOS6.8
  • 主机使用IP: 10.113.128.120
  • Jenkins版本:2.46.3

一、安装ansible

1. yum安装

yum -y install ansible

如果yum安装没有找到ansible包
使用阿里云的源

http://mirrors.aliyun.com/repo/epel-6.repo
cd /etc/yum.repo.d/
wget http://mirrors.aliyun.com/repo/epel-6.repo  #下载源

2. 配置文件

cd /etc/ansible/
ll

total 28
-rw-r--r-- 1 root root 18066 Jun  2 05:49 ansible.cfg       #ansible主配置文件
-rw-r--r-- 1 root root  1016 Jun  2 05:49 hosts             #定义主机组
drwxr-xr-x 2 root root  4096 Jun  2 05:49 roles             #定义规则

二、配置ansible

1. 为远程连接主机生成公/私钥

ssh-keygen -t rsa -P ''       #-t生成密钥类似(rsa/dsa) -P提供旧密码,'' 表示没有

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
5b:9e:3b:b7:04:47:e8:b3:28:cd:5a:ff:5e:a3:ae:b2 root@TLCUM01
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|           .     |
|          . .    |
|         . .     |
|        S = .    |
|       o = *     |
|      . * + . o  |
|       +...o.o . |
|      . Eo+B*.   |
+-----------------+
cd /root/.ssh/
ll

total 8
-rw------- 1 root root 1675 Jul  4 08:34 id_rsa         #私钥
-rw-r--r-- 1 root root  394 Jul  4 08:34 id_rsa.pub     #公钥

2. 写入信任文件

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys   #将公钥导入authorized_keys并分发到需远程控制的服务器/root/.ssh/目录内(需新建改目录)

完成上步后:

ssh + 远程服务器IP  #即可实现免密钥登入(ansible主机必须与其互通)

3.定义主机

vim /etc/ansible/hosts

[bs]
10.113.128.28
[yy]
10.113.128.196
[bb]
10.113.128.34

4. 测试

ansible 0BS -m command -a pwd
10.113.128.28 | SUCCESS | rc=0 >>
/root

ansible命令详解

ansible
Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS        #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等
                        module arguments    #模块参数
  --ask-vault-pass      ask for vault password
  -B SECONDS, --background=SECONDS          #后台运行超时时间
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur   #只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
  -D, --diff            when changing (small) files and templates, show the
                        differences in those files; works great with --check    
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        set additional variables as key=value or YAML/JSON
  -f FORKS, --forks=FORKS                                   #并行任务数。NUM被指定为一个整数,默认是5
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit     #打开帮助文档API
  -i INVENTORY, --inventory-file=INVENTORY                  #指定库存主机文件的路径,默认为/etc/ansible/hosts
                        specify inventory host path
                        (default=/etc/ansible/hosts) or comma separated host
                        list.
  -l SUBSET, --limit=SUBSET                                 #进一步限制所选主机/组模式  --limit=192.168.91.135 只对这个ip执行
                        further limit selected hosts to an additional pattern
  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
  -m MODULE_NAME, --module-name=MODULE_NAME                 #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
                        module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH                 #要执行的模块的路径,默认为/usr/share/ansible/
                        specify path(s) to module library (default=None)
  --new-vault-password-file=NEW_VAULT_PASSWORD_FILE
                        new vault password file for rekey
  -o, --one-line        condense output                     #压缩输出,摘要输出.尝试一切都在一行上输出。
  --output=OUTPUT_FILE  output file name for encrypt or decrypt; use - for
                        stdout
  -P POLL_INTERVAL, --poll=POLL_INTERVAL                    #调查背景工作每隔数秒。需要-b
                        set the poll interval if using -B (default=15)
  --syntax-check        perform a syntax check on the playbook, but do not
                        execute it
  -t TREE, --tree=TREE  log output to this directory                #将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
  --vault-password-file=VAULT_PASSWORD_FILE
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)                       #详细信息
  --version             show program's version number and exit      #输出ansible的版本

  Connection Options:
    control as whom and how to connect to hosts

    -k, --ask-pass      ask for connection password     #登录密码,提示输入SSH密码而不是假设基于密钥的验证
    --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE
                        use this file to authenticate the connection
    -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=None)
    -c CONNECTION, --con=CONNECTION              #连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。
                        connection type to use (default=smart)
    -T TIMEOUT, --timeout=TIMEOUT       #指定SSH默认超时时间,  默认是10S
                        override the connection timeout in seconds
                        (default=10)
    --ssh-common-args=SSH_COMMON_ARGS
                        specify common arguments to pass to sftp/scp/ssh (e.g.
                        ProxyCommand)
    --sftp-extra-args=SFTP_EXTRA_ARGS
                        specify extra arguments to pass to sftp only (e.g. -f,
                        -l)
    --scp-extra-args=SCP_EXTRA_ARGS
                        specify extra arguments to pass to scp only (e.g. -l)
    --ssh-extra-args=SSH_EXTRA_ARGS
                        specify extra arguments to pass to ssh only (e.g. -R)

  Privilege Escalation Options:
    control how and which user you become as on target hosts

    -s, --sudo          run operations with sudo (nopasswd) (deprecated, use
                        become)
    -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root) (deprecated, use
                        become)     #远程用户, 默认是root用户
    -S, --su            run operations with su (deprecated, use become)
    -R SU_USER, --su-user=SU_USER   #指定SU的用户,默认是root用户
                        run operations with su as this user (default=root)
                        (deprecated, use become)
    -b, --become        run operations with become (does not imply password
                        prompting)
    --become-method=BECOME_METHOD
                        privilege escalation method to use (default=sudo),
                        valid choices: [ sudo | su | pbrun | pfexec | doas |
                        dzdo | ksu | runas ]
    --become-user=BECOME_USER
                        run operations as this user (default=root)
    --ask-sudo-pass     ask for sudo password (deprecated, use become)
    --ask-su-pass       ask for su password (deprecated, use become)
    -K, --ask-become-pass           #提示密码使用sudo,sudo表示提权操作
                        ask for privilege escalation password
</host-pattern>

三、Jenkins

1. 官网下载jenkins

https://jenkins.io/download/                     #这里我下载通用war包(在此我下的2.46.3版本2.60.1版本在tomcat下跑不起来,报错是版本有问题~)
http://mirrors.jenkins.io/war-stable/2.46.3/     #2.46.3版本的下载地址
还可以直接跑(建议使用Tomcat的方式):
改变端口再次执行,
java -jar jenkins.war --httpPort=$HTTP_PORT, 例如java -jar jenkins.war --httpPort=1080

2. 访问测试

10.113.128.120:8080/jenkins   #或localhost:8080/jenkins

四.配置Jenkins

1. 配置登录

将/root/.jenkins/secrets/initialAdminPassword里的密码文件拷贝进去

未分类

2. 选择第一个

未分类

3. 开始安装

未分类

4. 配置用户信息

未分类

5. 安装完成

未分类

6. 测试(10.113.128.120:8080/jenkins)

未分类

五、搭建svn

1. 安装

sudo yum -y install subversion  #安装svn
mkdir /ane/svn/tl -p            #创建选择在var路径下创建版本库
svnadmin create /ane/svn/tl/    #在第二步建立的路径基础上,创建版本库
cd /ane/svn/tl/conf             #进入配置目录
ll

authz:                          #负责账号权限的管理,控制账号是否读写权限
passwd:                         #负责账号和密码的用户名单管理
svnserve.conf:                  #svn服务器配置文件
vim authz                       #编辑

[aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe

# [/foo/bar]
# harry = rw
# &joe = r
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r

[]
ane = rw                            #新增(ane用户读写权限)
vim passwd                          #编辑

[users]
# harry = harryssecret
# sally = sallyssecret
ane = redhat                        #给ane用户密码为redhat

vim svnserve.conf                   #编辑


[general]

anon-access = read
auth-access = write

password-db = /ane/svn/tl/conf/passwd   #使用paswwd文件里的配置;这里要给绝对路径

authz-db = /ane/svn/tl/conf/authz       #使用authz文件里的配置;这里要给绝对路径

realm = My First Repository             #Svn讲解

六、构建

1. 首先配置好ansible里的规则(playbook) 进入roles

pwd
/etc/ansible/roles
mkdir tlsit             #创建palybook目录(tlsit项目名称)
cd /etc/ansible/roles/tlsit/
vim bs.yml

-hosts: bs             #这个是你选择的主机
 roles:
 -bs                   #这个是你下步创建的目录
NullCopy

再在bs.yml同级下创建bs文件为其添加远程构建步骤

mkdir bs
cd bs
mkdir tasks
vim main.yml

- name: del
  shell: rm -rf /ane/update/*
- name: copy
  copy: src=/root/.jenkins/workspace/sit-0BS/ROOT/ROOT.war  dest=/ane/update/
- name: update
  shell: sh /ane/script/startApp.sh

2. 进入Jenkins的主界面

点击系统管理->选择管理插件->安装Ansible plugin插件(右上角搜索),点击直接安装

3. 进入Jenkins的主界面点击新建或创建一个新任务

4. 输入项目的名字选择第一个点击OK

未分类

5. 选择源码管理中的Subversion(SVN) 填写第五步搭建SVN的地址(里面需要有代码)

未分类

6. 选择构建 增加构建步骤 选择 Execute shell

未分类

7. 配置

未分类

8. 选择构建 增加构建步骤 选择 lnvoke Ansible Playbook

未分类

9. 配置

未分类

10. 点击立即构建。

蓝色–>成功
红色–>失败
白色–>为构建或取消构建

Jenkins执行git命令报错:Host key verification failed.

在jenkins集成给it,执行git命令测试如下:

git ls-remote -h [email protected]:username/myproject.git HEAD

报错如下:

Failed to connect to repository : Command "git ls-remote -h [email protected]:cc/myproject.git HEAD" returned status code 128:
stdout:
stderr: Host key verification failed.
fatal: The remote end hung up unexpectedly

原因

这需要使用jenkins用户访问mygti.com的主机添加到

~/.ssh/known_hosts。

解决

切换为jenkins用户:

sudo su -s /bin/bash jenkins

在jenkins用户下执行刚才的git命令:

git ls-remote -h [email protected]:username/myproject.git HEAD

在终端提示如下:

The authenticity of host 'mygit.com (xxx.xxx.xxx.xx)' can't be established.
RSA key fingerprint is 84:8c:14:f2:6f:14:6d:6c:3b:fc:ac:49:a6:7c:7a:41.
Are you sure you want to continue connecting (yes/no)?

输入yes回车。这时,mygit.com就已经添加到~/.ssh/known_hosts。

使用Docker构建基于Jenkins的GCC编译环境Slave

第一篇有点干货的文章,虽然没什么技术含量但还是写一篇方便有相同需求的人快速搭出一个环境吧。

提前准备

基本的Jenkins Docker Git 和 Linux 知识。
一台运行了Docker的x86设备。

0x1配置Docker

首先将[Dockerfile]和运行脚本下载下来,接着build镜像。镜像建好之后,从该镜像新建一个容器。如果你的 Jenkins 不是运行在 Docker 里的话。那么建议添加-p的端口映射指令,将22端口映射到主机的某个 Docker ,使 Jenkins 能够访问得到。

0x2 配置Jenkins

打开 Jenkins,登入。在主界面点击 Manage Jenkins -> Manage Nodes。

未分类

之后点击左边的 New Node -> 选择 Permanent Agent 输入完名称之后点击 OK。在接来下出现的设置对话框中,我们需要注意的有这么几个选项。

  1. # of executors -> 这个决定了该节点能够同时运行的任务数量,如果你的编译脚本或者说编译任务没有对多线程CPU进行优化的话, 那么我建议设置成 CPU个数 * 核心数。

  2. Remote root directory -> 这个决定了该节点的工作目录。可以配合Docker的挂载目录使用。

  3. Usage -> 这个需要根据个人需求来做设置了。默认有两个选项一个是仅执行指定分配的任务,另外一个是尽可能的执行任务。我自己的设置是仅执行指定分配的任务,因为该节点是只用来编译测试x86环境的。所以只运行需要在x86环境上测试的任务。

  4. Launch method -> 这个是选项Jenkins启动节点的方式,这里选择用SSH(需要安装SSH连接slave的插件)。Host是slave的ip(Jenkins和slave运行在同一个Docker,那么你需要查看一下运行slave容器的所分配到的IP)点击 Advanced 可以选择配置端口,添加好ssh的帐号密码 (默认密码查看slave的Dockerfile注释),以及根据个人的需求选择下放的 Host Key 验证方式。

设置完成之后就可以点击Save了。那么此时我们可以看到节点虽然添加成功了但是显示的是offline。不过如果一切正常的话,点击Launch agent就能够上线了。

未分类

0x3 测试

我这里随便选择了一个git上的项目作为测试用。具体可以参考一下配图。需要注意的是我之前节点设置的是只执行分配到节点的任务。所以在设置job的时候,需要勾上 Restrict where this project can be run 然后输入node的名称。这样构建脚本的时候才能slave才能执行。

未分类

未分类

添加完成之后点击构建,一切顺利的话就能够正常编译了。

未分类

Jenkins-发布php代码

1、安装插件

需要安装Git plugin和Publish Over SSH插件
系统管理–插件管理–可选插件里搜索安装,安装完后需要重启Jenkins。
可以在安装时勾选下面的安装完后自动重启Jenkins选项,会看到以下画面:

未分类

安装完成后自动刷新,需要重新登录

2、配置密钥对

需要在插件管理里配置Publish Over SSH,并在管理主机上生成密钥对

首先,利用ssh-keygen工具来生成密钥对:ssh-keygen -t rsa

[root@elk-test1 .jenkins]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  #密钥存放位置,默认回车
Enter passphrase (empty for no passphrase):  #密码,直接回车表示为空
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
20:05:8f:9f:f5:8e:53:36:d5:ae:3f:5c:b3:2c:f3:2d root@elk-test1
The key's randomart image is:
+--[ RSA 2048]----+
|    ...          |
|     +       .   |
|    o o .   . .  |
|     o + . . .   |
|      o S =   .  |
|         = . . ..|
|        o . ....o|
|         .   +Eo.|
|              =+.|
+-----------------+

其次,在系统管理–系统设置中,拉取到最下面位置填写以下信息:

未分类

  • Jenkins SSH Key:Jenkins ssh密码
  • Passphrase:设置的文件密码
  • Path to key:密钥文件路径
  • key:直接填写私钥内容即id_rsa的内容

我们在此直接将私钥的内容直接填写到key栏里。

高级选项中:

  • Name 远程主机名称
  • Hostname 远程主机IP
  • Username 登录用户
  • Remote Directory 远程连接目录

SSH Servers中:

指的是Jenkins需要发布包的远程机器,需要将公钥复制一份在远程机器上,以供Jenkins来连接它

在172.16.16.201的/root/.ssh/下创建文件:authorized_keys,将Jenkins上生成的id_rsa.pub的内容拷贝进去:

vim authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxA4lH50gkIRrr0kSf7qEXYbt/vPC83zdfaXb+qkWyZ4bUzpulp2
fCms70OL8BIKBXVcYxVjZVPnm0zINijX07ChjlAxL8yhVAUcUqoKTyy2mQIW5cm6mYzutmHBXNNHlFEzYeylKcE/L1
qHvrt2aBuP7D2LmdOU+dF4TdmRrUOoeuXbuz8xVSoT5qorQhhMSJbhAtm9UZK+sHXqW7Uf3+b5YxZkEh6Zpyd+MbzB
LILfw668CFwi1wYU4Fq7iR/Wycd/dIvYzGUrr+Fcisl8hHO5aKZXBFK5DsgvhQR8BqNmYsaHROzLLEOwU8kXvC2ZNq
SAtnAU9KA5edBX+bipnz root@elk-test1

在SSH Servers的高级选项卡里,需要填写连接用户的密码

未分类

然后点击”Test Cofiguration“,测试连接,会提示”Success” ,然后保存提交即可。

如果有多个主机,则继续添加。也可以 添加本机进去。

3. 创建任务

未分类

开始创建任务,输入任务名称,选择“构建一个自由风格的软件项目”

未分类

在源码管理栏目里,输入测试的(代码所在仓库,svn、git、gitlab均可)git项目地址:

未分类

以下留空,因为我们要发布的内容不需要解压编译安装等进一步的操作:

未分类

首先需要选择构建步骤,因为我们是通过插件Publish Over SSH来构建发布php,所以,此处选择Send files or execute commands over SSH。

未分类

填写构建信息:

未分类

在高级设置里的其他细节设置暂且忽略;在Add Transfer Set中可以添加更多的传输信息。

有多个远程主机需要发布,则Add Server更多主机信息。

填写完成后就可以“保存”。

4. 开始构建

选择刚刚添加的任务,点击“立即构建”开始构建

未分类

进入构建任务的输出控制台,查看构建进度:

未分类

在172.16.16.201远程发布的sever上查看项目是否发布过来,并且修改了属组

[root@test02 .ssh]# cd /tmp/jenkins_php/
[root@test02 jenkins_php]# ll
total 136
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D11Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D12Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D13Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D14Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D15Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D17Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D18Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D19Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D20Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D21Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D22Z
-rw-r--r-- 1 root root 18044 Jan 15 10:43 LICENSE
-rw-r--r-- 1 root root   419 Jan 15 10:43 README.md
-rw-r--r-- 1 root root 66243 Jan 15 10:43 习题答案.txt

至此,简单的Jenkins发布php代码就实验完成了。

Jenkins-邮件配置

1. Jenkins默认邮件配置

Jenkins默认提供了邮件配置的模块:系统管理–系统设置–邮件配置

未分类

按照如上图所示配置,填写对应的邮箱信息。

注意:发件者的邮箱必须与Jenkins中管理员邮箱的设置一样,否则在”Test configuration”时会报错!

Jenkins管理员邮箱设置位置:系统管理–系统设置–Jenkins Location

未分类

配置完成后点击”Test configuration“测试邮件发送状态

未分类

2. 配置构建项目报警

编辑之前的项目,添加构建后的操作配置:

未分类

填写信息,根据需要勾选

未分类

默认的邮件模块有一个缺点:只对构建失败的情况进行邮件报警处理。构建成功不会发送邮件。这不能完全满足我们的工作需求。

而在安装Jenkins时默认还会安装另外一个插件:E-mail Extension plugin,可以满足需求。

3. E-mail Extension plugin插件

在系统管理–系统配置里,可以找到Extended E-mail Notification插件的配置界面.

先删除掉之前配置的默认邮件告警配置,修改 Extended E-mail Notification的具体信息:

未分类

选择默认的触发条件,这里我们选择Always,就是不管什么状态都发送邮件,完成后提交保存。

未分类

未分类

修改项目构建后的动作配置:

删除之前的配置,选择 Editable Email Notification

未分类

根据需要配置邮件的选项

未分类

配置完成后保存退出。

4. 测试

重新构建一次项目,查看是否能收到邮件

未分类

发现已经收到了构建成功的邮件。

以上对插件E-mail Extension plugin的设置仅仅为最简单最基础的连通实验,具体的邮件模板配置等,后续继续学习。

Jenkins的环境变量的使用

两种使用方式:

1、 直接使用$标志:如$BUILD_STATUS

2、 使用${}标志:如${BUILD_STATUS}

未分类

备注:

如果工作中遇到了什么问题,或者对软件测试感兴趣的小伙伴,可以加群680748947一起交流进步~

如果是使用批处理命令来使用环境变量,则是通过%%来标志,如% BUILD_STATUS %

环境变量列表:

BUILD_NUMBER,唯一标识一次build,例如23;

BUILD_ID,基本上等同于BUILD_NUMBER,但是是字符串,例如2011-11-15_16-06-21;

JOB_NAME, job的名字,例如JavaHelloWorld;

BUILD_TAG,作用同BUILD_ID,BUILD_NUMBER,用来全局地唯一标识一此build,例如jenkins-JavaHelloWorld-23;

EXECUTOR_NUMBER, 例如0;

NODE_NAME,slave的名字,例如MyServer01;

NODE_LABELS,slave的label,标识slave的用处,例如JavaHelloWorldMyServer01;

JAVA_HOME, java的home目录,例如C:Program Files (x86)Javajdk1.7.0_01;

WORKSPACE,job的当前工作目录,例如c:jenkinsworkspaceJavaHelloWorld;

HUDSON_URL = JENKINS_URL, jenkins的url,例如http://localhost:8000/;

BUILD_URL,build的url 例如http://localhost:8000/job/JavaHelloWorld/23/;

JOB_URL, job的url,例如http://localhost:8000/job/JavaHelloWorld/;

SVN_REVISION,svn 的revison, 例如4;

一、可用环境变量列表(以下来自google翻译):

BRANCH_NAME

对于多分支项目,这将被设置为正在构建的分支的名称,例如,如果您希望从而master不是从特征分支部署到生产。

CHANGE_ID

对于与某种更改请求相对应的多分支项目,这将被设置为更改ID,例如拉取请求号。

CHANGE_URL

对于与某种更改请求相对应的多分支项目,这将被设置为更改URL。

CHANGE_TITLE

对于对应于某种变更请求的多分支项目,这将被设置为更改的标题。

CHANGE_AUTHOR

对于对应于某种变更请求的多分支项目,这将被设置为拟议更改的作者的用户名。

CHANGE_AUTHOR_DISPLAY_NAME

对于对应于某种变更请求的多分支项目,这将被设置为作者的人名。

CHANGE_AUTHOR_EMAIL

对于对应于某种变更请求的多分支项目,这将被设置为作者的电子邮件地址。

CHANGE_TARGET

对于对应于某种变更请求的多分支项目,这将被设置为可以合并更改的目标或基本分支。

BUILD_NUMBER

目前的编号,如“153”

BUILD_ID

当前版本ID,与BUILD_NUMBER相同,用于在1.597+中创​​建的构建,但较旧版本的YYYY-MM-DD_hh-mm-ss时间戳记

BUILD_DISPLAY_NAME

当前版本的显示名称,默认为“#153”。

JOB_NAME

此构建项目的名称,如“foo”或“foo / bar”。

JOB_BASE_NAME

此建立项目的名称将剥离文件夹路径,例如“bar / foo”的“foo”。

BUILD_TAG

“jenkins- $ {JOB_NAME} – $ {BUILD_NUMBER} ”的字符串。JOB_NAME中的所有正斜杠(/)都会用破折号( – )替换。方便放入资源文件,jar文件等,以方便识别。

EXECUTOR_NUMBER

识别执行此构建的当前执行程序(在同一台计算机的执行程序中)的唯一编号。这是您在“构建执行者状态”中看到的数字,但数字从0开始,而不是1。

NODE_NAME

代理的名称,如果构建是代理,或者“主”,如果在主机上运行

NODE_LABELS

空格分隔的节点分配的标签列表。

WORKSPACE

分配给构建作为工作区的目录的绝对路径。

JENKINS_HOME

Jenkins主节点上分配的目录绝对路径存储数据。

JENKINS_URL

完整的Jenkins网址,例如http:// server:port / jenkins /(注意:只有在系统配置中设置了Jenkins URL)

BUILD_URL

此构建的完整URL,如http:// server:port / jenkins / job / foo / 15 /(Jenkins URL必须设置)

JOB_URL

此作业的完整URL,如http:// server:port / jenkins / job / foo /(必须设置Jenkins URL)

SVN_REVISION

Subversion版本号,当前已被检出到工作区,如“12345”

SVN_URL

当前已经检出到工作空间的Subversion URL。

Jenkins配置自动发送邮件

Jenkins自动发送邮件配置:

1、打开”系统管理”——”系统设置”

2、在”Jenkins Location”设置系统管理员地址(重要:不能省略!)

3、在”邮件通知”部分配置发送邮件的用户名、密码(注意这里的密码使用的是163邮箱设置的”客户端授权码”,不是登陆密码)

4、勾选”通过发送测试邮件测试配置”,填入测试收件人,点击”Test Configuration”

5、到163邮箱里check新邮件

6、

未分类

7、

未分类

Jenkins+Github+Docker实现自动化构建运行Jar

介绍

  • docker:简单的说,如果你用docker构建一个rabbitMQ集群之类的,将其打包成一个镜像.或者你直接拉取别人配置好的镜像,可以直接在 本机0配置的运行一个安装有mq集群容器(类似虚拟机).

  • Jenkins:可以从git或github等代码源,自动拉取代码,进行你想要的测试/构建操作,或shell脚本等.

  • 简单介绍下我要实现的效果:

  1. 在docker容器中运行jenkins.

  2. jenkins自动监听我的Github项目,当我提交新的代码时,

  3. jenkins自动拉取该代码到本地,使用maven打包后,关闭上个版本的该项目,然后使用java jar命令运行最新的jar(spring boot).

Docker安装及基本操作

  • Docker (CE)小企业或个人,此处是CE
  • Docker (EE)企业级
  • 安装及启动
CentOS
前置环境安装
    yum install -y yum-utils 
      device-mapper-persistent-data 
      lvm2

设置稳定的存储库
    yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    非必须 开启edge和test存储库库等  这样可以禁用yum-config-manager--disable docker-ce-edge
    yum-config-manager --enable docker-ce-edge 
    yum-config-manager --enable docker-ce-test

安装
    yum install docker-ce

启动docker(配置文件 /etc/sysconfig/docker)
    systemctl start docker

开机启动等
    systemctl enable docker
    systemctl disable docker
    chkconfig docker on

测试(这个命令下载一个helloword镜像并在容器中运行。容器运行时,会打印一条信息消息。)
    docker run hello-world

卸载
    yum remove docker-ce
    rm -rf /var/lib/docker # 删除镜像容器等
  • 常用命令(使用容器或镜像id时,无需全部id,只需前几个字符即可,也可使用 容器镜像名:版本号 操作)
重要:xx表示不同的命令如,pull、run等。可以查看该命令的帮助,所有参数
docker xx --help

查看本机的镜像,可通过该方法查看到镜像id等信息.
docker images 

获取镜像 name:镜像名  [:tag]:版本,默认为最新的(也就是会自己加上一个参数:latest)
docker pull [options] name[:tag]

删除镜像,需要删除其下所有容器
docker rmi <镜像id>

运行镜像,构建出一个容器. -d表示后台运行. 
docker run -d image 
-p 8080:80  进行端口映射,将nginx的80端口映射到主机的8080端口上,也就是别人访问8080,可以访问到自己的80

查看目前正在运行的容器
docker ps

查看所有容器
docker ps -a

停止容器
docker stop <容器id>

删除容器
docker rm <容器id>

启动一个运行(run)过的容器
docker start <容器id>

在运行的容器中执行命令 
docker exec [options] container command [arg...]
例如:   
docker exec -it <容器id> bash
可以进入一个容器,和虚拟机中一样。也就是容器内部

挂载目录:将宿主机的文件共享给容器
docker run -d --name=test -v /opt/test:/usr/databases docker-test 
test是容器的名字,需唯一;
-v表示创建一个数据卷并挂载到容器里,
示例表示把宿主机的/opt/test目录挂载到容器的/usr/databases目录下;
docker-test是镜像的名字

查看容器当前信息,可在该命令的 Mounts信息中,找到挂载目录信息
docker inspect <容器id>



制作镜像
以下就是 打包镜像tomcat和jpress.war
在某个目录创建文件 Dockerfile 编辑输入如下内容:
    # (继承自哪个镜像)注意,注释不能添加在和命令同行,会报错
    from images(镜像名)   
    # (维护人员信息)
    MAINTAINER ZX [email protected]  
    # (同一目录下要打包成镜像的文件,拷贝到tomcat的运行目录下)
    COPY jpress.war  /usr/local/tomcat/webapps  

此外,有更多命令
RUN : 执行容器中操作系统的命令(例如是CentOS,可以执行 cp mv 等等.)  
EXPOSE : 指定该容器暴露的端口,可以通过多个EXPOSE暴露多个端口
ENV : 设置环境变量 例如 ENV JAVA_HOME /var/java
ADD : 将本地文件拷贝到容器中.例如 /var/xxx.tar.gz  /var 
CMD : 容器启动时执行的命令,最多一条. 
其他命令自行搜索.

然后在目录下使用  
即可创建镜像,注意, . 是当前目录的意思
docker build .   
下面这句 -t是创建镜像并命名, :laster是版本号 ,因为上面的镜像没有命名
docker build  . -t jpress:latest

运行容器
-d表示后台运行 -p表示设置端口映射, jpress是镜像名
docker run -d -p  8888:8080 jpress

运行mysql镜像
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=xxx  images(镜像名)
  • 使用阿里云的Docker镜像加速器
管理控制台 -> 容器镜像服务 -> 镜像加速器 -> 获取到其分配的加速地址
修改 /etc/docker/daemon.json 文件,增加如下,没有时创建
  {
    "registry-mirrors": ["加速地址"]
  }
  • 可在阿里云免费开通 容器镜像服务,创建仓库,将镜像推送过去

Jenkins 持续集成

  • 前置

    • JDK8
    • Docker
  • 使用docker下载镜像jenkinsci/blueocean,并启动运行Jenkins容器

docker run 
      -u root 
      -d 
      -p 8080:8080 
      -v jenkins-data:/var/jenkins_home 
      -v /var/run/docker.sock:/var/run/docker.sock 
      jenkinsci/blueocean

官方文档中还有一个 --rm . 但是提示 -d 和 --rm 相互冲突
其容器中的/var/jenkins_home 被挂载到了我本地的 /var/lib/docker/volumes/jenkins-data/_data 目录下
  • 进入Jenkins容器执行命令
docker exec -it <容器id> bash
  • 查看容器输出的日志
docker logs <容器id> [-f(滚动的)]
  • 或者自行下载war包运行
java -jar jenkins.war --httpPort=8080
  • 可以创建一个基于Jenkins镜像的整合maven的新镜像(jdk在
    jenkinsci/blueocean中已经有一个oepn_jdk(目前没发现有什么问题))
下载maven 
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz

Dockerfile文件内容
     #继承自jenkins镜像
     FROM jenkinsci/blueocean:latest  
     #维护人员信息
     MAINTAINER ZX [email protected]  
     # 拷贝本地的maven解压包到镜像的/usr下
     ADD apache-maven-3.5.2-bin.tar.gz /var
     # 下载并解压jdk和maven,使用RUN表示执行当前系统(CentOS)命令
     RUN cd /var 
     tar -zxvf  apache-maven-3.5.2-bin.tar.gz 
     # 设置环境变量
     ENV MAVEN_HOME /var/apache-maven-3.5.2
     ENV PATH $MAVEN_HOME/bin:$PATH
     # 开放的端口
     EXPOSE 8080 
     EXPOSE 8081
     EXPOSE 8082 
     EXPOSE 8083 
     EXPOSE 8084 
     EXPOSE 8085 

构建镜像     
docker build . -t <仓库/镜像名:tag>
例如
docker build . -t zzzxxx/jenkins-maven-jdk:1.0

运行该镜像,端口映射可自行调整.
docker run 
          -u root 
          -d 
          -p 8080:8080 
          -p 8081:8081 
          -p 8082:8082 
          -p 8083:8083 
          -p 8084:8084 
          -p 8085:8085 
          -v jenkins-data:/var/jenkins_home 
          -v /var/run/docker.sock:/var/run/docker.sock 
          zzzxxx/jenkins-maven-jdk:1.0

bug:在RUN的最后一句contOS命令后多加了个 ,导致后面的ENV没有有效指定.

为防止maven构建过慢,可自行在/var/maven/conf/setting.xml中增加阿里云镜像
        <mirror>
          <id>nexus-aliyun</id>
          <mirrorOf>*</mirrorOf>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
  • 启动时会在日志中输出密码,第一次配置时需要用到,也可以根据它的提示,去容器中的该目录找到

  • 启动完成后,访问对应的8080端口,即可.再完成它的一系列简单的配置(安装他推荐的所有插件)

  • 在 系统管理 -> 全局工具配置 中 设置maven和jdk目录等(可按它的选择自动下载maven) 默认集成的jdk等可用echo $JAVA_HOME 输出对应路径

未分类

  • 它的运行后所有数据默认保存的主目录的.jenkins中(例如 /root/.jenkins).可通过在启动前指定 JENKINS_HOME环境变量修改
vim /ect/profile
export JENKINS_HOME=xx
source /etc/profile
  • 安装插件 Maven Integration plugin 和 Github Plugin(默认已经安装)

  • 系统管理–>插件管理–>可选插件->搜索.安装即可 (如果搜不到,可查看已安装插件中是否已经安装.) 如果插件安装失败,可在已安装插件中卸载后,重试. 卸载插件执行后,需要重启jenkins

  • 在docker容器中jenkins的主目录在/var/jenkins_home文件夹中(可用echo $JENKINS_HOME查看).

  • 其中pull下来的项目在./workspace中的对应任务名的文件中

  • jenkins + github配置,实现jenkins能在push到github后,自动pull代码进行打包测试运行

    • github个人页面 -> setting -> developer setting -> personal access tokens -> Generate new token

未分类

未分类

未分类

该token就是OAuth2协议中的access_token.第三方应用(jenkinds)可通过该令牌获取你允许它进行的一些权限.
选择创建令牌.并勾选 repo 和 admin:repo_hook权限.并自行保存好生成的token.
这两个权限主要就是访问你的仓库,并设置你的仓库的监听器(钩子,可以理解为监听器.监听你的push等)

  • 在github上选择你要部署的项目 -> setting -> webHooks -> add webHooks

未分类

未分类

这个钩子,可以配置你要监听的事件.当该事件发生后,会请求你配置的那个url.
此处在Payload URL处填写
http://<你的jenkins的ip>:<端口号>:/github-webhook/
然后使用默认的Just the push event.监听push事件即可.
点击增加

  • jenkins页面: 系统管理->系统设置->GitHub->add Github Server

未分类

未分类

api url中输入 https://api.github.com
然后选择增加 Credentials. 选择类型为Secret text.在secret中输入之前的token即可.
然后测试连接.当返回
Credentials verified for user BrightStarry, rate limit: 4997
表示成功

  • jenkins: 创建一个新的maven项目任务

未分类

未分类

未分类

未分类

未分类

未分类

输入完任务名后,点击确认.
在配置页面,选择github Project.输入你要持续集成的项目的github url

在源码管理处,选择git.输入github项目的git地址.
然后点击 add Credentials,创建一个帐号.需要输入你的github帐号密码.然后在下拉款选择该帐号.
在下方还可选择要监听的分支

在触发器处,选择监听github的刚才配置的github hook.

在Build处指定pom.xml路径(通常就在根目录)和要执行的maven命令.

  • 最后需要在Post Setps中设置执行shell,我尝试很多次,都无法直接使用java -jar命令运行jar.(会将末尾的&省略,无法后台启动).
    • 可以在shell窗口中,增加如下(BUILD_ID=dontKillMe 是防止jenkins杀死我们的后台进程)

未分类

BUILD_ID=dontKillMe
java -jar $JENKINS_HOME/workspace/maven测试/target/zx-test.jar &
  • 或者使用sh脚本执行(这样可以不用手动停止上一个版本的正在运行的jar)
    • 写在jenkins要执行的shell窗口中的脚本 先停止前一个版本的jar.然后再用最新的jar替换掉之前的jar. 然后运行最新的jar
#!/bin/bash 
cd /var
sh stop.sh
cp $JENKINS_HOME/workspace/任务名/target/生成的jar名.jar /var
echo "开始启动"
BUILD_ID=dontKillMe 
java -jar /var/zx-test.jar &
  • stop.sh 停止前一个版本的jar(pid=ps -ef xxx这句的意思是,通过若干过滤找到对应jar的pid记录.$1表示输出后的记录的第一个参数) 在/var中创建该脚本
echo "正在停止之前的jar"
pid=`ps -ef | grep zx-test.jar | grep -v grep | awk '{print $1}'`
if [ -n "$pid" ]
then
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
  • 至此,已经实现,指定github中的某个项目,一旦push上去,jenkins自动pull,执行maven命令构建,并执行shell运行jar.

  • 实现完成后,我才突然发现.如果要让项目自动运行在单独的docker容器中,最好不要让jenkins运行在docker容器中. 直接使用本地的jenkins,打包后,将jar单独封装成一个镜像,或者挂载jar目录到一个容器中.运行该容器即可.