NGINX服务器网站升级HTTPS

要让网站升级成HTTPS,首先要申请或者购买ssl证书.

证书的获得

证书可以自己在服务器生成,但是这种证书的兼容性以及安全性都会存在比较大的问题.我们可以从专门的证书机构获取比较好的证书,比如可以通过阿里云去申请证书,但是这种证书有要求限制,只能免费使用一年.

NGINX配置

server {
        listen 443;
        server_name www.vstary.com
        ssl on;
        root html;
        index index.html index.htm;
        ssl_certificate   /home/test/cert/test.pem;
        ssl_certificate_key  /home/test/cert/test.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
                root html;
                index index.html index.htm;
        }
}

重启服务器.

测试下你的域名,https://www.vstary.com,是否可以访问.

在证书正确的情况下,如果无法访问,可以查看下防火墙是否开放了端口,ssl貌似只能监听443接口.

修改允许端口参考: https://www.vstary.com/article/198

强制HTTP的也走HTTPS

修改服务器配置:

server {
        listen  80;
        server_name  www.vstary.com;
        rewrite ^(.*)$  https://$host$1 permanent;
}

同时允许HTTP跟HTTPS协议访问

    server {
            listen 80
            listen 443 ssl;
            server_name www.vstary.com
            ssl on;
            root html;
            index index.html index.htm;
            ssl_certificate   /home/test/cert/test.pem;
            ssl_certificate_key  /home/test/cert/test.key;
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
            location / {
                    root html;
                    index index.html index.htm;
            }
    }

一张图让你看懂 InnoDB

未分类

熟悉 MySQL 的人,都知道 InnoDB 存储引擎,如大家所知,Redo Log 是 innodb 的核心事务日志之一,innodb 写入 Redo Log 后就会提交事务,而非写入到 Datafile。之后 innodb 再异步地将新事务的数据异步地写入 Datafile,真正存储起来。

那么 innodb 引擎有了 redo log 和 buffer pool 以后,为什么能够在提升性能的同时,还能保证不丢数据呢? Buffer Pool, Redo Log 以及 Datafile 之间的具体关系是什么呢。

另外 Innodb 还有一大堆概念,Dirty Page, LRU, LSN,Checkpoint 等等,这些概念在 Innodb 里是什么运作的呢?

下面通过一张图来告诉大家

Buffer Pool, Redo Log 以及 Datafile 的关系

未分类

图 1 Innodb 的原理

大家可以把 innodb 的事务写入过程看成写作一篇文章的过程。Innodb 的写入过程其实和我们写作的过程是非常类似的。

试想,领导让我们写一篇文章,发表在论坛上。然后我们想到了一个绝佳的点子,并决定要放到文章里,可是手上还有其他事情,一时半会儿写不完,又担心过后忘了,领导还等着我们答复,此时我们会怎么做呢?我们一定会先大概构思个提纲,并把提纲和一些关键细节记录到本子上,作为草稿,然后立刻告诉领导自己要写什么东西,让其确认。最后等晚上有时间了,再根据草稿去斟词酌句,编写正稿。

在这个过程中,我们用到的几个关键的东西:

我们的大脑,用来临时暂时记住我们的点子

草稿,我们需要草稿来保证不会把点子和关键的细节给忘了

正稿,这是我们最终要输出的东西

有了这几个东西,我们不仅能确保我们不会错过一篇漂亮的文章,还能快速告诉领导自己一定可以搞定这件事情。

Innodb 实际上也用到了这几个关键的东西:

Buffer Pool:就是我们的大脑

事务日志:就是我们的草稿

Datafile:就是我们的正稿

只要按照之前写文章的过程,来进行整个事务的写入操作,不仅能保证不丢失数据,而且能够快速响应。

一次写入操作是一次事务,innodb 首先把事务数据写入到 Buffer Pool 和事务日志中,也就是在大脑中记忆下来,并写下草稿。然后就可以提交事务,响应客户端了。之后 innodb 在 “有时间的时候”,异步地把这次写入的数据从 Buffer Pool,或者事务日志中正式地写入到 Datafile 中,形成 “正稿”。

其中,innodb 为了保证事务日志这个 “草稿” 一定能无损地还原成正稿,还不能占用太多空间,事务日志需要有以下特点:

事务日志中一定保存了要写入的所有数据内容

事务日志只会把新事务追加在日志最后,而不会去修改之前的内容

一旦事务数据被写到 datafile,事务日志中的 “草稿” 就可以删除了

通过上面 3 个特点我们可以看出,在形成 “正稿” 之前,“草稿” 是不会被删除的;同时,“草稿” 的空间是可以被循环利用的;最后,只要 “草稿” 在,我们一定能写出 “正稿”。

这里还需要说明的,是 Recovery 流程。也就是如果在形成 “正稿” 前,数据库 Crash 了,我们需要重启整个进程,服务器,甚至只能把数据复制到另外一台服务器来进行恢复。这个时候,事务日志这个 “草稿” 就发挥了它最大的作用——数据恢复。这也和我们在工作生活中常出现的问题——把事情忘了——非常类似。

Buffer Pool 本质就是存储于内存中的一个数据结构,内存和人的大脑一样,是 “健忘” 的。数据库 Crash 时,Buffer Pool中的数据极大可能 “灰飞烟灭” 了。因此,事务日志就如我们贴心的 “记事本”,它把我们的记忆,保存为 “草稿”,当我们忘了的时候,就可以翻开,把记忆重新回想起来。

未分类

图 2 恢复的逻辑

LSN 和 Checkpoint

上面介绍了一次写入事务的情况,而数据库在使用过程中,事务都是连续不断,根据上面所述 innodb 逻辑,写 “草稿” 和写 “正稿” 速度和进度绝大部分情况下是不一样的。

再继续上面 “写作文章” 例子,如果我们的文章很长,一天写不完,而白天都有其他工作,我们只能记录草稿,只有晚上回去才能继续写正稿。那么我们就面临一个问题:我们昨天写到哪了。

最常见的办法就是,每天晚上去对照一下草稿的内容和正稿的内容,以此来判断写到哪了,但这比较花时间,因为正稿中可能包含了很多华丽的语句,我们需要思考一下才能对比上内容。

另外一个更简单的办法,就是每天晚上写完正稿后,我们在草稿上做个标记,标记下最后一条被写为正稿的内容,这样第二天晚上,我们就可以从这个标记的后面一条开始,继续写我们的正稿,而不需要去对比内容。

显然第二个方法效率更高,而且没有什么额外的风险。因此 innodb 就使用了这个办法。LSN 是草稿上每一条记录的编号,我们每天晚上标记下最后一条写到正稿的记录编号,这个标记的编号,就是 Checkpoint。Innodb 根据这个 checkpoint,就可以很快知道上次回放到哪里,同时也可以把这个编号之前的草稿,全部删掉了。

使用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目录到一个容器中.运行该容器即可.

Jenkins 与 GitLab 的自动化构建之旅

一、Gitlab 的安装及仓库创建

1.1 下载 Gitlab 安装包

1).官网下载速度较慢 建议先行下载

国内的源里面可以找到最新的版本,请单击这里查看。

2).安装依赖

sudo apt-get install curl openssh-server ca-certificates postfix

3).配置 postfix 邮箱

未分类

选择 Internet Site (F12) Enter 下一步

未分类

这里设置FQDN 使用默认即可。

1.2 安装 Gitlab

在终端执行:sudo dpkg -i gitlab-ce9.5.4ce.0amd64.deb 进行安装。

未分类

出现 It looks like… 表示安装成功!

1.3 安装 Git 工具

未分类

1.4 生成密钥文件

使用 ssh-keygen 生成密钥文件 .ssh/id_rsa.pub。

未分类

未分类

这里生成的两个秘钥很重要,会在后面 Gitlab 的仓库配置与 Jenkins 的构建免密连接时候用到。

二、GitLab 简单配置及项目新建

2.1 配置 Gitlab

这一步在官方的文档里面没有,但是如果没有配置的话,直接启动 GitLab,会出现不正确的 FQDN 错误,导致无法正常启动。因此必须做配置。

sudo gedit /etc/gitlab/gitlab.rb

把 external_url 改成部署机器的域名或者IP地址。

未分类

然后对 GitLab 进行重配置 (这一步也是启动 GitLab):

sudo gitlab-ctl reconfigure

查看启动状态:

sudo gitlab-ctl status

未分类

在浏览器的地址栏中输入服务器的公网 IP 即可登录 GitLab 的界面,第一次登录使用的用户名和密码为 root 和 5iveL!fe。

未分类

首次登录会强制用户修改密码。密码修改成功后,输入新密码进行登录。

2.2 Gitlab 项目新建

在 GitLab 的主页中新建一个 Project:

未分类

未分类

添加 ssh key 导入步骤2中生成的密钥文件内容(秘钥前面1.4节已生成):

未分类

ssh key 添加完成:

未分类

项目地址,该地址在进行 clone 操作时需要用到:

未分类

2.3 代码上传

克隆项目,在本地生成同名目录,并且目录中会有所有的项目文件 git clone [email protected]:gavin/test.git:

未分类

进入到项目目录,拷贝自己的项目文件到此目录上传:

cd test/ 
cp –rf  自己项目路径/*   .
git add .
git commit -m “add README” #将代码提交到本地仓库
git push -u origin master #将文件同步到GitLab服务器上

在网页中查看上传的文件已经同步到 GitLab 中:

未分类

三、Jenkins 安装与配置

3.1 Java 环境配置

Jenkins 基于 Java,Linux 下安装 Java 只要配置 Java 环境变量即可。 首先,解压java到相应目录,我一般习惯把安装的软件放到目录/usr/local下。

tar -zxvf jdk-6u45-linux-x64.tar.gz /usr/local

编辑环境变量,在 /etc/profile 文件中添加环境变量,Linux 的所有用户都可以使用。

vim /etc/profile

在文件最后添加内容如下:

export JAVA_HOME=/usr/local/jdk1.6.0_45
export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

这样,Java 就配置完成:

未分类

3.2 安装 Jenkins

简单来说需要下面四步:

  • wget -q -O – https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt–key add –
  • sudo sh -c ‘echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’
  • sudo apt-get update
  • sudo apt-get install jenkins

未分类

这样之后就安装完成。可以查看进程信息。

ps -ef |grep jenkins

未分类

3.3 Jenins 配置

上面只是安装完成了 Jenkins,还需要进行一些配置才可以。 在这个系统端口中,8080已经在使用中了。所以在 /etc/default/jenkins.修改 Jenkins 默认端口设置:

gavin@gavin:~$ gedit /etc/default/jenkins

未分类

修改默认端口为 HTTP_PORT=8090,这时通过浏览器就可以访问 Jenkins 了。比如我的地址:http://192.168.0.122:8090/

未分类

可以看到提示,为了确保 Jenkins 的安全,将管理员的密码写入文件,需要复制到下面的文本框做验证。

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

然后把输出的内容复制到上面密码框处。

然后,到了选择插件的界面,通过附加功能扩展 Jenkins 可以支持许多不同的需求。

未分类

未分类

未分类

插件安装完成,就到了创建用户的界面,这里可以创建一个 Jenkins 用户。

未分类

到这里,基本配置就完成了。

未分类

未分类

如果在后续使用中,有插件需要安装,通过在已运行的 Jenkins 主页中,点击左侧的系统管理—>管理插件进入如下界面搜索安装:

未分类

四、Android 项目构建

4.1 SDK 环境变量的设置

在“系统管理”—>“系统设置”—>“全局属性”设置 SDK 的环境变量名称与本地 SDK 的路径。

未分类

未分类

4.2 新建 Android 项目

开始创建一个 AndroidDemo 项目进行演:

未分类

构建一个自由风格的软件项目,然后填写项目名称。

未分类

源码管理,这里可以根据自己的实际选择 Git 或者 SVN 服务器。先设置 Git 的源码路径:

然后设置免密凭证。如果是第一次需要通过“Add”添加。

未分类

添加凭证:

单击“add”按钮进行添加:

未分类

未分类

此处的私钥既是1.4章节所产生。

设置完成上面的步骤,直接按左下角保存,项目创建完成。

五、参数化项目构建

5.1 参数设置

建好的项目,相应修改构建参数等配置,直接通过“配置”进行修改:

未分类

选择实际需要用到的参数,比如发布的版本类型,Git 分支参数等。

未分类

1) 选择参数的设置:

未分类

设置打包的类型是 debug 或者 release。

未分类

打包的 App 针对的发布平台:

未分类

2) Git 分支选择:

想在构建的时候,自动获取 Git 仓库的分支并选择构建,可以设置如下:

未分类

未分类

3) gradle 脚本命令的配置:

未分类

选择“Invoke Gradle script”添加 gradle 命令脚本。

未分类

设置完这些参数保存,就可以退出到项目列表界面。

5.2 项目构建

进入项目开始构建,选择相应的参数。

未分类

构建成功的话,那么结果如下图:

未分类

构建完会在“Build History” 部分显示构建结果是成功还是失败并可以查看相应的构建日志,方便分析:

未分类

构建结果是红色代表构建失败,上图颜色表示构建成功。

构建状态:下图中分级符号概述了一个 Job 新近一次构建会产生的四种可能的状态。

  • Successful:完成构建且被认为是稳定的。
  • Unstable:完成构建,但被认为不稳定。
  • Failed:构建失败。
  • Disabled:构建已禁用。

未分类

在主界面则是通过构建稳定性评分等级进行表示。

未分类

构建稳定性:当一个 Job 中构建已完成并生成了一个未发布的目标构件,如果您准备评估此次构建的稳定性,Jenkins 会基于一些后处理器任务为构建发布一个稳健指数(从0-100 ),这些任务一般以插件的方式实现。它们可能包括单元测试(JUnit)、覆盖率(Cobertura)和静态代码分析(FindBugs)。分数越高,表明构建越稳定。下图中分级符号概述了稳定性的评分范围。任何构建作业的状态(总分100)低于80分就是不稳定的。

未分类

还有很多的参数配置,如触发器配置、邮箱配置,自动化发布等的参数很多,这里就不一一介绍,感兴趣的朋友可以上网或者留言交流。

Pick:一款 Linux 上的命令行模糊搜索工具

今天,我们要讲的是一款有趣的命令行工具,名叫 Pick。它允许用户通过 ncurses(3X) 界面来从一系列选项中进行选择,而且还支持模糊搜索的功能。当你想要选择某个名字中包含非英文字符的目录或文件时,这款工具就很有用了。你根本都无需学习如何输入非英文字符。借助 Pick,你可以很方便地进行搜索、选择,然后浏览该文件或进入该目录。你甚至无需输入任何字符来过滤文件/目录。这很适合那些有大量目录和文件的人来用。

安装 Pick

对 Arch Linux 及其衍生品来说,Pick 放在 AUR 中。因此 Arch 用户可以使用类似 Pacaur,Packer,以及 Yaourt 等 AUR 辅助工具来安装它。

pacaur -S pick

或者,

packer -S pick

或者,

yaourt -S pick

Debian,Ubuntu,Linux Mint 用户则可以通过运行下面命令来安装 Pick。

sudo apt-get install pick

其他的发行版则可以从这里下载最新的安装包,然后按照下面的步骤来安装。在写本指南时,其最新版为 1.9.0。

wget https://github.com/calleerlandsson/pick/releases/download/v1.9.0/pick-1.9.0.tar.gz
tar -zxvf pick-1.9.0.tar.gz
cd pick-1.9.0/

使用下面命令进行配置:

./configure

最后,构建并安装 Pick:

make
sudo make install

用法

通过将它与其他命令集成能够大幅简化你的工作。我这里会给出一些例子,让你理解它是怎么工作的。

让们先创建一堆目录。

mkdir -p abcd/efgh/ijkl/mnop/qrst/uvwx/yz/

现在,你想进入目录 /ijkl/。你有两种选择。可以使用 cd 命令:

cd abcd/efgh/ijkl/

或者,创建一个快捷方式 或者说别名指向这个目录,这样你可以迅速进入该目录。

但,使用 pick 命令则问题变得简单的多。看下面这个例子。

cd $(find . -type d | pick)

这个命令会列出当前工作目录下的所有目录及其子目录,你可以用上下箭头选择你想进入的目录,然后按下回车就行了。

像这样:

未分类

而且,它还会根据你输入的内容过滤目录和文件。比如,当我输入 “or” 时会显示如下结果。

未分类

这只是一个例子。你也可以将 pick 命令跟其他命令一起混用。

这是另一个例子。

find -type f | pick | xargs less

该命令让你选择当前目录中的某个文件并用 less 来查看它。

未分类

还想看其他例子?还有呢。下面命令让你选择当前目录下的文件或目录,并将之迁移到其他地方去,比如这里我们迁移到 /home/sk/ostechnix。

mv "$(find . -maxdepth 1 |pick)" /home/sk/ostechnix/

未分类

通过上下按钮选择要迁移的文件,然后按下回车就会把它迁移到 /home/sk/ostechnix/ 目录中的。

未分类

从上面的结果中可以看到,我把一个名叫 abcd 的目录移动到 ostechnix 目录中了。

使用方式是无限的。甚至 Vim 编辑器上还有一个叫做 pick.vim 的插件让你在 Vim 中选择更加方便。

要查看详细信息,请参阅它的 man 页。

man pick

我们的讲解至此就结束了。希望这款工具能给你们带来帮助。如果你觉得我们的指南有用的话,请将它分享到您的社交网络上,并向大家推荐我们。