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-build
,General
和 源码管理
的配置和之前一致。
在构建触发器
中,选择Build when a change is pushed to GitLab
,然后复制下后面的 webhook 地址。
登陆到gitlab,进入仓库的Settings - Integrations
,将刚才复制的地址填入到URL中,Trigger
只勾选Push events
。如下图:
回到jenkins任务配置界面,在构建
中,选择之前配置的 ssh site
,Command
中填写:
~/easygo-web/push_build.sh
意思是去执行easygo-web
目录下的push_build.sh
这个脚本。前面的~
代表是登陆用户的home目录,可以更换为上文中所说的工作文件夹,一定要是绝对路径,并且确保jenkins系统管理中配置的ssh账号对该目录有读写执行权限。
最后保存任务,然后我们就可以往仓库中提交代码测试是否会触发自动构建了。
任务日志可在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
执行以下命令安装 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
前期准备工作,首先在 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 "[email protected]" -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-tag
,General
中的 GitLab connection
选择之前系统设置中配置的gitlab
。
在源码管理
中,选择git
,在Repository URL
中填写仓库地址,因为仓库是私有的,因此需要在下方选择凭证。
我们需要点击图中的 add
按钮,将对仓库有管理权限的账号密码填入。
这里的凭证我们也可以更换为 ssh key,需要在jenkins所在服务器生成,但是由于我们的Jenkins是运行在docker容器中,并且没有将docker宿主机中的.ssh
目录映射到容器中,所以我们采用用户名密码的凭证方式,缺点是gitlab不是https方式访问,不安全。
在构建触发器
中,我们按照定时触发的方式来执行任务,选择Build periodically
,在日程表
中填写:
TZ=Asia/Chongqing
@midnight
这段代码的意思是,午夜执行,时区设置为亚洲重庆。如下图:
在构建
中,选择之前配置的 ssh site
,Command
中填写:
~/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 tag
,Target remote name
填写 “origin”。
最后保存任务,这个任务将会在每天的北京时间凌晨12点多运行,运行的步骤和结果是:关闭正在运行的tomcat、拉取代码、编译代码、发布到tomcat、运行tomcat。构建成功后,可以打开浏览器访问 tomcat 了。
也可以手动触发任务执行,测试下任务配置是否有问题。
任务日志可在Jenkins中查看,当然也可以配置邮件通知功能,将日志通过邮件发送给相关人员。
]]>执行以下命令安装 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
执行以下命令安装 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
这与在主机上直接运行 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
]]>执行以下命令安装 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 启动后,我们可以安装推荐的插件,此外有些有用的插件最好也安装以下。例如:
插件的作用后续章节会介绍。
]]>以 centos 7 作为安装环境。官方文档:https://docs.docker.com/ 。
如果没有旧版本可省略这一步。
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 有三种方式:
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
从一开始的磕磕绊绊,到现在的如胶似漆,中间也有吵架闹矛盾的不愉快,但最终我俩还是修成正果。记得以前一起住宾馆、一起去新泰,在新泰我还加了一夜班,把媳妇一个人撂在宾馆一整天。后来找房子还吵了一架,住到一块后,第一次一块做饭,还因为锅盖子怎么放吵了一架,后来老长一段时间,媳妇买了个饭盒带饭,每天我们做好晚饭,吃剩下后再打包给媳妇第二天带着,现在想想,媳妇真是受苦了。再后来我第一次去丈母娘家紧张的不行,媳妇来我家好像也很紧张。再后来就订婚、过年给丈母娘家送礼,吃饭的时候我不懂规矩,结果饭吃的久了些。。。然后我就把媳妇接我家来过年了,婆媳二人还挺撂得来的。初六亲家见面,定了亲事,看了日子,定下了我俩大喜的日子:农历四月十六,黄道吉日。5月4号,我俩又把证领了。结婚那天很累很累,,但是我是非常激动非常感动的。一夜几乎没睡,半夜去盘新娘头,早晨去接新娘,举行婚礼等等仪式礼节,一直到主持人喊「送入洞房」的那一刻,我知道,从此,我就是有妇之夫,王大宝就是有夫之妇了,我俩都多了一对父母,我肩膀上的责任更重了,我们也有了属于我们俩自己的「家」了!
]]>