ZHU 2018-04-19T08:10:15+00:00 zhuxulus@gmail.com docker 持续集成(7) - 配置 jenkins,实现自动构建 2018-04-19T00:00:00+00:00 ZHU http://zhuxulu.com/2018/04/docker-ci-jenkins-settings-push-build 之前我们在 配置 jenkins,实现每日构建、发布、打标签 中介绍了jenkins、gitlab的基础配置,以及如何创建一个定时任务。现在我们在上篇文章的基础上建立一个通过 gitlab webhook 触发的任务,内容是当开发人员提交代码到仓库master分支时,自动触发jenkins的构建任务,对代码进行自动编译。

首先在工程git仓库根目录下新建一个shell脚本,取名叫 “push_build.sh”,内容如下:

#!/bin/bash

cd ~/easygo-web
git pull

docker run --rm -v "$(pwd)":/project  -v /usr/tmp/.m2:/root/.m2  -w /project maven:3.5.3-jdk-8 mvn package

这个脚本的作用是:拉取代码,用maven进行编译打包。

然后开始配置任务,新建一个任务,选择第一项的自由风格,取名叫 easygo-web-push-buildGeneral源码管理 的配置和之前一致。

构建触发器中,选择Build when a change is pushed to GitLab,然后复制下后面的 webhook 地址。

登陆到gitlab,进入仓库的Settings - Integrations,将刚才复制的地址填入到URL中,Trigger只勾选Push events。如下图:

回到jenkins任务配置界面,在构建中,选择之前配置的 ssh siteCommand中填写:

~/easygo-web/push_build.sh

意思是去执行easygo-web目录下的push_build.sh这个脚本。前面的~代表是登陆用户的home目录,可以更换为上文中所说的工作文件夹,一定要是绝对路径,并且确保jenkins系统管理中配置的ssh账号对该目录有读写执行权限。

最后保存任务,然后我们就可以往仓库中提交代码测试是否会触发自动构建了。

任务日志可在Jenkins中查看,当然也可以配置邮件通知功能,将日志通过邮件发送给相关人员。

]]>
docker 持续集成(8) - 配置 jenkins 邮件通知 2018-04-19T00:00:00+00:00 ZHU http://zhuxulu.com/2018/04/docker-ci-jenkins-email-notification 之前我们已经介绍了 配置 jenkins,实现每日构建、发布、打标签配置 jenkins,实现自动构建。虽然实现了自动化,但是任务是否执行成功,执行结果怎么样,具体报告的内容,都需要我们登陆到jenkins去查看,如果某个开发人员提交的代码导致工程编译不通过,那么我们就不能及时发现。下面我们通过配置邮件通知的方式实现任务执行完立即发送邮件通知相关人员,这样整个过程看起来就非常完整了。

首先我们要安装Email Extension Plugin插件,之前已经安装过了,那么转到系统管理 - 系统设置 - Extended E-mail Notification 中,填写相关的邮件服务器信息:

然后我们需要修改之前创建的两个任务,以easygo-web-nightly-build-deploy-tag为例:

构建后操作中,点击增加构建后操作步骤,选择Editable Email Notification

  • Project From 填写发件箱邮件地址。
  • Project Recipient List 填写邮件接收人地址,英文逗号隔开,可以填写项目管理者的邮箱。

  • Content Type 选择 HTML(text\html)
  • Default Subject 邮件标题。
  • Default Content 邮件内容。
  • Attach Build Log 选择 Attach Build Log,将日志当作附件附加到邮件中。

邮件标题和内容模板:

标题:
构建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !

正文:
<hr/>
构建状态:$BUILD_STATUS<br/>
项目名称:$PROJECT_NAME<br/>
构建编号:第$BUILD_NUMBER次每日构建<br/>
构建时间:$BUILD_TIMESTAMP<br/>
触发原因:${CAUSE}<br/>
GIT 仓库:${GIT_URL}<br/>
GIT 分支:${GIT_BRANCH}<br/>
构建日志:<a href=”${BUILD_URL}console”>${BUILD_URL}console</a><br/>
工作目录:<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a><br/>
<hr/>
${JELLY_SCRIPT,template="html"}<br/>
${JELLY_SCRIPT,template="html"}<br/>

保存任务后我们可以手动触发一下任务,看看是否能够收到邮件,构建成功的邮件通知如下:

上文中出现了一些以$开头的变量,这些变量是Jenkins的内置变量,可以从这里查看:jenkins地址 或者 wiki.jenkins.io

]]>
docker 持续集成(5) - 安装 gitlab 2018-04-19T00:00:00+00:00 ZHU http://zhuxulu.com/2018/04/docker-ci-install-gitlab 安装 gitlab

执行以下命令安装 gitlab。

docker pull gitlab/gitlab-ce

执行以下命令运行 gitlab。

sudo docker run --detach \
--hostname gitlab.1886.org\
--publish 443:443 --publish 8000:80 --publish 2200:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

参考:https://docs.gitlab.com/omnibus/docker/

]]>
docker 持续集成(6) - 配置 jenkins,实现每日构建、发布、打标签 2018-03-11T00:00:00+00:00 ZHU http://zhuxulu.com/2018/03/docker-ci-jenkins-settings-nightly-build-deploy-tag 我们将 docker 宿主机作为测试服务器。通过 jenkins、gitlab 实现工程的每日定时构建、发布、给git仓库打标签的功能。

前期准备工作,首先在 docker 宿主机上安装 git。

yum install git -y

然后,在工程git仓库根目录下新建一个shell脚本,取名叫 “build_deploy.sh”,内容如下:

#!/bin/bash

docker stop $(docker ps -qa --filter name='tomcat')

sleep 3

cd ~/easygo-web && git pull

# 编译工程
docker run --rm -v "$(pwd)":/project  -v /usr/tmp/.m2:/root/.m2  -w /project maven:3.5.3-jdk-8 mvn package

# 将编译后的 war 包映射到 tomcat 容器中,并启动运行 tomcat 容器。
docker run -d --rm -p 8089:8080 -v $PWD/target/easygo-web.war:/usr/local/tomcat/webapps/easygo.war --name tomcat  tomcat:7.0.85-jre7

这个脚本的作用是:删除运行中的tomcat容器,git pull更新工程代码,maven编译代码,将编译后的war包映射到tomcat容器的目录,启动tomcat。

然后我们登陆到测试服务器,生成ssh key,通过ssh方式免密码下载代码。

ssh-keygen -t rsa -C "xxxx@gmail.com" -b 4096

根据提示一路回车,最后在当前登陆用户home目录下生成一个 .ssh 文件夹,拷贝该文件夹下公钥 id_rsa.pub 文件里的内容。

然后登陆到gitlab,找到当前工程,进入工程下的 Settings - Repository, 展开 Deploy Keys,将拷贝的公钥填入到 key 里,title 填写该 key 的名称。Deploy Keys 只允许下载代码,不允许其他操作,这里我们将测试服务器的公钥作为 Deploy Keys,能够保证测试服务器只具有下载代码的权限,其他人登陆到测试服务器,不会对仓库进行更新代码等危险操作。

回到测试服务器,我们需要在服务器中建立一个工作文件夹,然后在该文件夹下 git clone 仓库地址。

git clone https://gitee.com/zhuxulu/project.git

然后登陆到jenkins,对 jenkins 进行配置,实现定时构建、发布、给gitlab仓库打标签。实际上上文中的shell脚本的作用是构建、发布,jenkins只需要配置定时调用该脚本、给gitlab仓库打标签即可。配置方法如下。

credentials - system - global credentials 中,新增一个凭证,kind 选择 Username with Password, 填写 docker 宿主机的用户名和密码。

系统管理 - 系统设置 - SSH remote hosts 中,填入 docker 宿主机的 ip 地址和端口,Credentials 选择刚才我们填写的凭证。

以上的作用是使 jenkins 能够登陆到测试服务器,并在测试服务器上执行命令。

然后在 credentials - system - global credentials 中,再新增一个凭证,kind 选择 GitLab API token,然后我们用对仓库有管理权限的账号登陆到gitlab,在 User Settings - Access Tokens 中生成 API token,注意 token 生成后只显示一次,一定要及时复制,之后不会再显示了。将生成的 token 填入到 jenkins 的凭证中,然后保存。

之前安装jenkins时我们已经安装了gitlab插件,现在转到Jenkins的系统管理 - 系统设置 - Gitlab 中,填写 gitlab 的信息,Connection name 可以填 “gitlab”,Gitlab host URL填写你的gitlab地址,Credentials 选择刚才建立的 GitLab API token 凭证。

以上的作用是使 jenkins 能够连接访问 gitlab,能够给 gitlab 的仓库进行相关操作,例如后续我们需要的打标签操作。

最后开始配置任务,新建一个任务,选择第一项的自由风格,取名叫 easygo-web-nightly-build-deploy-tagGeneral 中的 GitLab connection 选择之前系统设置中配置的gitlab

源码管理中,选择git,在Repository URL中填写仓库地址,因为仓库是私有的,因此需要在下方选择凭证。

我们需要点击图中的 add 按钮,将对仓库有管理权限的账号密码填入。

这里的凭证我们也可以更换为 ssh key,需要在jenkins所在服务器生成,但是由于我们的Jenkins是运行在docker容器中,并且没有将docker宿主机中的.ssh目录映射到容器中,所以我们采用用户名密码的凭证方式,缺点是gitlab不是https方式访问,不安全。

构建触发器中,我们按照定时触发的方式来执行任务,选择Build periodically,在日程表中填写:

TZ=Asia/Chongqing
@midnight

这段代码的意思是,午夜执行,时区设置为亚洲重庆。如下图:

构建中,选择之前配置的 ssh siteCommand中填写:

~/easygo-web/build_deploy.sh

意思是去执行easygo-web目录下的build_deploy.sh这个脚本。前面的~代表是登陆用户的home目录,可以更换为上文中所说的工作文件夹,一定要是绝对路径,并且确保jenkins系统管理中配置的ssh账号对该目录有读写执行权限。

注意:当真正去执行Jenkins的这个任务时,可能会出现build_deploy.sh文件没有执行权限的错误,需要在git提交时对文件权限做相应的修改,使用如下代码:

git update-index --chmod=+x build_deploy.sh

然后我们在构建后操作中,点击增加构建后操作步骤,选择Git Publisher,勾选第一项Push Only If Build Succeeds,只有在构建成功后才操作。然后在Tags中的Tag to Push,填写tag的名称,一般情况下只能用Jenkins的内置变量,例如构建编号$BUILD_NUMBER,假如我们还想用日期作为tag的名称,就需要用到插件。

之前我们在安装jenkins时安装了一个Build Timestamp Plugin插件,这个插件的作用就是生成日期变量。在Jenkins的系统管理 - 系统设置 - Gitlab 中找到Build Timestamp,配置新的日期参数,如下图:

然后回到刚才的任务配置界面,在Tag to Push中填写tag名称时,就可以使用这个变量,例如:

nightly-$BUILD_NUMBER-$BUILD_DATE

然后勾选上Create new tagTarget remote name填写 “origin”。

最后保存任务,这个任务将会在每天的北京时间凌晨12点多运行,运行的步骤和结果是:关闭正在运行的tomcat、拉取代码、编译代码、发布到tomcat、运行tomcat。构建成功后,可以打开浏览器访问 tomcat 了。

也可以手动触发任务执行,测试下任务配置是否有问题。

任务日志可在Jenkins中查看,当然也可以配置邮件通知功能,将日志通过邮件发送给相关人员。

]]>
docker 持续集成(4) - 安装 tomcat 2018-03-11T00:00:00+00:00 ZHU http://zhuxulu.com/2018/03/docker-ci-install-tomcat 安装 tomcat

执行以下命令安装 tomcat。

docker pull tomcat:7.0.85-jre7

执行以下命令运行 tomcat。

docker run -itd --rm -p 8888:8080 tomcat:7.0.85-jre7

或者,将宿主机的文件或目录映射到容器中,并运行 tomcat:

docker run -itd --rm -p 8888:8080 \
    -v $PWD/target/easygo.war:/usr/local/tomcat/webapps/easygo.war \
    --name tomcat \
    tomcat:7.0.85-jre7

参考:https://hub.docker.com/_/tomcat/

]]>
docker 持续集成(3) - 安装 maven 2018-03-11T00:00:00+00:00 ZHU http://zhuxulu.com/2018/03/docker-ci-install-maven 安装 maven

执行以下命令安装 maven

docker pull maven

使用方法:

docker run -it --rm --name my-maven-project \
    -v "$(pwd)":/project \
    -v /usr/tmp/.m2:/root/.m2 \
    -w /project \
    maven:3.5.3-jdk-8 \
    mvn package
  • docker run,创建了 maven:3.5.3-jdk-8 镜像的一个实例。该实例中执行了 mvn package 命令。原则上,这不会影响主机系统。
  • -v $(pwd):/project,将当前目录挂载到容器中,作为 /project 目录。这样以来,容器就可以读写主机系统的当前目录了。
  • -v /usr/tmp/.m2:/root/.m2,使用卷缓存 Maven 本地仓库。
  • -w /project,设置了 /project 作为工作目录。这意味着执行 mvn 命令将在 project 目录中有效。
  • –rm,将在执行完毕后删除容器。

这与在主机上直接运行 mvn package 的结果是一样的,只是不必实际安装 Java或 Maven。

可以运行maven clean命令清理项目:

docker run -it --rm \
    -v "$(pwd)":/project \
    -v /usr/tmp/.m2:/root/.m2 \
    -w /project \
    maven:3.5.3-jdk-8 \
    mvn clean

参考:http://www.infoq.com/cn/articles/docker-executable-images

]]>
docker 持续集成(2) - 安装 jenkins 2018-03-11T00:00:00+00:00 ZHU http://zhuxulu.com/2018/03/docker-ci-install-jenkins 安装 jenkins

执行以下命令安装 jenkins。

docker pull jenkins/jenkins

执行以下命令运行 Jenkins。

docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins

或者

mkdir -p /var/jenkins_home && chmod -R 777 /var/jenkins_home

docker run -itd  -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home --name jenkins jenkins/jenkins

后一种方式会在 docker 宿主机上自动创建一个叫 ‘jenkins_home’ 的卷。容器无论停止、重启或删除,都会保留下来。

使用下面的命令查看容器启动日志。

docker logs -f jenkins

jenkins 启动后,会要求输入一个字符串,并且提示该字符串的位置,这个字符串能够在 /var/jenkins_home 目录下对应位置找到。

jenkins 启动后,我们可以安装推荐的插件,此外有些有用的插件最好也安装以下。例如:

  • gitlab 插件
  • Build Timestamp Plugin
  • Email Extension Plugin

插件的作用后续章节会介绍。

参考:https://github.com/jenkinsci/docker/

]]>
docker 持续集成(1) - 安装 docker 2018-03-11T00:00:00+00:00 ZHU http://zhuxulu.com/2018/03/docker-ci-install-docker 安装 docker

以 centos 7 作为安装环境。官方文档:https://docs.docker.com/

一、卸载 docker 的旧版本。

如果没有旧版本可省略这一步。

sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-selinux \
    docker-engine-selinux \
    docker-engine

卸载后,/var/lib/docker 内的 images, containers, volumes, 以及自定义配置文件不会被删除。如果需要删除,使用以下命令。

sudo rm -rf /var/lib/docker

二、安装 docker。

安装 docker 有三种方式:

1.设置 Docker’s repositories,推荐。

2.下载 RPM package,手动安装,手动更新,适合无法访问互联网的服务器。

3.在测试和开发环境中,使用 convenience scripts 安装。

下面介绍下第一种安装方法。

首先安装依赖包。

sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2

然后使用下面的命令设置 stable repository。

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

使用下面的命令安装最新的 docker CE。

sudo yum install docker-ce

docker 安装成功后,系统中增加了一个 docker group,但是该 group 下没有用户。如果希望用非 root 用户执行 docker 命令,需要新增一个用户,加入到 docker group 中。参考:https://docs.docker.com/

生产系统下最好是安装指定版本的 docker,使用下面的命令列出 docker 可用的版本,然后选择安装。

yum list docker-ce --showduplicates | sort -r

使用下面的命令安装指定版本。

sudo yum install <FULLY-QUALIFIED-PACKAGE-NAME>

启动 docker。

sudo systemctl start docker

使用下面的命令,验证是否安装、运行成功。这条命令会下载一个测试 image,并在容器中运行,运行成功后会在控制台打印信息并退出。

sudo docker run hello-world

配置 docker 开机启动。

开机启动
sudo systemctl enable docker

禁止开机启动
sudo systemctl disable docker
]]>
结婚了! 2014-05-27T00:00:00+00:00 ZHU http://zhuxulu.com/2014/05/marry 我和我媳妇结婚了!

从一开始的磕磕绊绊,到现在的如胶似漆,中间也有吵架闹矛盾的不愉快,但最终我俩还是修成正果。记得以前一起住宾馆、一起去新泰,在新泰我还加了一夜班,把媳妇一个人撂在宾馆一整天。后来找房子还吵了一架,住到一块后,第一次一块做饭,还因为锅盖子怎么放吵了一架,后来老长一段时间,媳妇买了个饭盒带饭,每天我们做好晚饭,吃剩下后再打包给媳妇第二天带着,现在想想,媳妇真是受苦了。再后来我第一次去丈母娘家紧张的不行,媳妇来我家好像也很紧张。再后来就订婚、过年给丈母娘家送礼,吃饭的时候我不懂规矩,结果饭吃的久了些。。。然后我就把媳妇接我家来过年了,婆媳二人还挺撂得来的。初六亲家见面,定了亲事,看了日子,定下了我俩大喜的日子:农历四月十六,黄道吉日。5月4号,我俩又把证领了。结婚那天很累很累,,但是我是非常激动非常感动的。一夜几乎没睡,半夜去盘新娘头,早晨去接新娘,举行婚礼等等仪式礼节,一直到主持人喊「送入洞房」的那一刻,我知道,从此,我就是有妇之夫,王大宝就是有夫之妇了,我俩都多了一对父母,我肩膀上的责任更重了,我们也有了属于我们俩自己的「家」了!

]]>
新年快乐 2013-02-17T00:00:00+00:00 ZHU http://zhuxulu.com/2013/02/happy-new-year 新年快乐!我又长了一岁! 2012半年多时间都在出差,好多事情都没做。新的一年开始,首先希望我和我的家人都身体健康, 妈妈的身体快点好起来。另外制定一下今年的计划,希望2013年能够完成。

  • 买房
  • 考驾照
  • 辞职
  • 减肥「回到正常体重」
]]>