« 上一篇下一篇 »

在GitHub平台提交分享源码​后,我们可以在Jenkins上执行其智能搭建功能

     每次我们提交代码到GitHub后,可以在Jenkins上执行构建,但是每次都要动手去执行略显麻烦,今天我们就来实战Jenkins的自动构建功能,每次提交代码到GitHub后,Jenkins会进行自动构建;  如果能自动化的东西,就绝不要手动了,所以自己搭建了个持续集成环境,配好了结合github进行push时自动构建,自动发布的流程,提交代码,泡杯咖啡就发布好了。
本以为很简单,但没想到中间细节还是有不少坑,查了很多资料,墙都翻了好几次,把遇到的问题记录在这里。

前期准备工作
进行本章的实战前,推荐您参照《docker下的Jenkins安装和体验》做安装和体验的实战,以便对Jenkins服务有初步了解;

重要前提
GitHub收到提交的代码后要主动通知Jenkins,所以Jenkins所在服务器一定要有外网IP,否则GitHub无法访问,我的Jenkins服务器是部署在腾讯云的云主机上,带有外网IP;
本次实战要提交源码到GitHub,所以您需要有一个GitHub号,并在上面创建工程;
demo工程源码
本次用来在Jenkins上构建的工程是个springboot的web工程,地址是:git@github.com:zq2599/jenkinsdemo.git,用浏览器访问的地址是:https://github.com/zq2599/jenkinsdemo.git
代码很简单,只有一个controller,接收http请求返回一个字符串,如下所示:

@RestController
public class Hello {
    @RequestMapping("/")
    public String sayHello(){
        return "3. Hello jenkins, " + new Date();

您需要在自己的GitHub创建一个项目,源码可以参照上述demo工程的源码;

实战步骤梳理
本次整个实战过程依次为如下步骤:
1. GitHub上准备一个spring boot的web工程;
2. GitHub上配置Jenkins的webhook地址;
3. 在GitHub上创建一个access token,Jenkins做一些需要权限的操作的时候就用这个access token去鉴权;
4. Jenkins安装GitHub Plugin插件;
5. Jenkins配置GitHub访问权限;
6. Jenkins上创建一个构建项目,对应的源码是步骤1中的web工程;
7. 修改web工程的源码,并提交到GitHub上;
8. 检查Jenkins的构建项目是否被触发自动构建,构建成功后,下载工程运行,看是不是基于最新的代码构建的;

webhook地址
webhook是通知Jenkins时的请求地址,用来填写到GitHub上,这样GitHub就能通过该地址通知到Jenkins;
假设Jenkins所在服务器的地址是:192.168.0.1,端口为8080,那么webhook地址就是http://192.168.0.1:8080/github-webhook

再次提醒,上述地址必须是外网也能访问的,否则GitHub无法访问到Jenkins;

配置GitHub
登录GitHub,进入要本次构建用到的工程;
在工程主页面点击右上角的”Settings”,再点击左侧”Webhooks”,然后点击“Add webhook”,如下图:

如下图,在”Payload URL”位置填入webhook地址,再点击底部的”Add webhook按钮”,这样就完成webhook配置了,今后当前工程有代码提交,GitHub就会向此webhook地址发请求,通知Jenkins构建:

生成Personal access tokens
Jenkins访问GitHub工程的时候,有的操作是需要授权的,所以我们要在GitHub上生成授权的token给Jenkins使用,这就是Personal access tokens,生成步骤如下:
1. 登录GitHub,进入”Settings”页面,点击左下角的”Developer settings”,如下图:

2. 跳转到”Developer settings”页面后,点击左下角的“Personal access tokens”,如下图:

3. 跳转到”Personal access tokens”页面后,点击右上角的”Generate new token”按钮,如下图:

4. 可能会提示输入GitHub密码,输入后跳转到创建token的页面,如下图所示,输入title,再勾选”repo”和”admin:repo_hook”,再点击底部的”Generate token”按钮,就能产生一个新的access token,将此字符串复制下来,后面jenkins任务中会用到:

Jenkins配置
GitHub Plugin插件,在”系统管理->管理插件”位置检查此插件是否已经安装,没有的话请先安装;
配置GitHub,点击“系统管理->系统设置”,如下图:

在系统设置页面找到”GitHub”,配置一个”GitHub Server”,如下图,”API URL”填写”https://api.github.com“,”Credentials”位置如下图红框所示,选择”Add->Jenkins”:

弹出的页面中,”Kind”选择”Secret text”,”Secret”填入前面在GitHub上生成的Personal access tokens,Description随便写一些描述信息,如下图:

填写完毕后,点击右侧的”Test connection”按钮,如果信息没有填错,显示的内容如下图所示:

点击页面最底部的”保存”按钮;
GitHub项目的项目主页和仓库地址
项目主页和仓库地址是不同的,如下图,红框1中是项目主页,点击红框2的按钮后,红框3中是仓库地址(要用HTTPS的,不用SSH 的):

项目主页:https://github.com/zq2599/jenkinsdemo
仓库地址:https://github.com/zq2599/jenkinsdemo.git

新建构建项目
在Jenkins上新建一个maven构建项目,名为test003,如下图:

接下来设置test003的配置信息,分为”源码管理设置”和”构建环境设置”两部分;

源码管理设置

上图中每个红框的设置如下解释:
1. 选择”Git”;
2. “Repository URL”输入仓库地址:https://github.com/zq2599/jenkinsdemo.git
3. “Credentials”创建一个Credentials,Kind选择”Username with password”,Username输入GitHub账号,Password输入GitHub密码;
4. “源码库浏览器”选择”githubweb”;
5. “URL”输入项目主页:https://github.com/zq2599/jenkinsdemo
6. “构建触发器”中勾选”GitHub hook trigger for GiTScm polling”;

构建环境设置
如下图所示,勾选”Use secret text(s) or file(s)”,下面的”Credentials”选择我们之前配置过的”Personal access tokens”
这里写图片描述

设置完成后,点击页面底部的”保存”按钮;

修改web工程代码并提交到GitHub
将GitHub仓库的代码clone到本地,做一些修改然后提交到GitHub上,例如我修改了Hello.java中的源码(修改了sayHello方法的return的字符串的内容),如下所示:

@RestController
public class Hello {

    @RequestMapping("/")
    public String sayHello(){
        //修改返回的字符串的内容
        return "abcdefg. Hello jenkins, " + new Date();
  
 

2.1手动安装插件
安装插件时,由于网络原因,插件基本没法一次安装成功,可以多试几次看脸,我最开始是这么靠人品安的,方便的话挂vpn,我的服务器没有vpn,后来才发现可以手动安装。
在jenkins->管理插件->高级 页面有手动上传功能,安装失败时通过如图复制下载地址,然后挂Lantern之类的下载上传即可。
图片cdn异常,请查看原文

2.2.自动构建的代码路径及权限配置
在Repository URL 请使用ssh方式的url
git@github.com:chulung/chulung.com.git
原因同样是网络问题,走http或https极有可能失败。
另外点击add->Additional Behaviours 将Timeout 设置为30 防止超时导致失败,也可以设置更长。
注意勾上Build when a change is pushed to GitHub,才能在提交后自动构建。

参考:jenkins下使用git获取源码的配置方法
图片cdn异常,请查看原文

2.3.自动部署
我的jenkins和chulung.com是跑在同一台服务器上的,所以脚本发布最直接,注意其中
export BUILD_ID=dontKillMe这行是必不可少的,否则会jenkins会杀掉shell进程,导致自动部署失败。

#!/bin/bash
echo "复制war包"
cp -f /root/.jenkins/workspace/chulung.com/target/*.war /var/www
tomcat_home=/home/apache-tomcat-8.0.28
echo "kill tomcat $tomcat_home"
ID=`ps -ef | grep java | grep $tomcat_home|awk '{print $2}'`
for id in $ID
do
    kill -9 $id
    echo "killed pid=$id"
done
echo "执行tomcat启动shell"
#防止jenkins构建完成后杀死tomcat进程
export BUILD_ID=dontKillMe
sh $tomcat_home/bin/startup.sh
#tail -f $tomcat_home/logs/catalina.out

Jenkins访问GitHub工程的时候,有的操作是需要授权的,所以我们要在GitHub上生成授权的token给Jenkins使用,今天就分享到这里,祝大家生活愉快-。-