jenkins+github自动部署

1.jenkins安装

下载jenkins

官方网页下载: https://jenkins.io/zh/doc/pipeline/tour/getting-started/
直接下载链接: http://mirrors.jenkins.io/war-stable/latest/jenkins.war

2.运行jenkins

java -jar jenkins.war --httpPort=9999

打开网页: http://ip:port/可以看到:

image.png

过一会后命令行显示(框起来的是密码):
image.png

等待网页加载jenkins:
image.png

输入密码即可进入jenkins

3.Jenkins安装插件提速

  1. 进入jenkins配置目录: cd ~/.jenkins
  2. 进入插件配置目录: cd updates
  3. 更换插件下载地址: sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  4. 重新启动jenkins,需要记录管理员密码

4.安装插件

image.png

5.创建管理员

image.png

6.配置根URL

按照他默认的即可


image.png

7.集成github的WebHook

注意: 部署jenkins服务器必须要是有公网IP的服务器

  1. 打开jenkins管理界面


    image.png
  2. 进入jenkins配置界面


    image.png
  3. 点击高级


    image.png
  4. 配置jenkins回调地址


    image.png
  5. 点击应用


    image.png
  6. github上创建一个项目仓库
    创建一个仓库,私有或公共仓库均可


    image.png
  1. 进入配置仓库WebHook界面


    image.png
  1. 配置仓库的WebHook
    当有人对这个仓库发出push时候,github会调用配置的WebHook地址,这个地址就配置第4步jenkins的回调地址

点击添加WebHook


image.png

点击保存

8.使用BlueOcean进行项目构建

此处使用jenkins最新的Blue Ocean构建项目

  1. 进入插件安装界面


    image.png

    image.png
  2. 安装blue ocean插件

    image.png

  3. 返回首页


    image.png
  4. 进入Blue Ocean界面


    image.png
  5. 创建流水线


    image.png
  6. 选择github


    image.png
  7. 为jenkins创建访问github的 access token


    image.png
  8. 在github上创建即可


    image.png

    点击最后的创建


    image.png
  9. 在jenkins填写生成的token
    输入token,点击connect

    image.png

  10. 选择用户


    image.png
  11. 选择项目


    image.png

    最后因为仓库没有Jenkinsfile文件,会显示如下界面


    image.png

此时,会因为github仓库中没有Jenkinsfile文件,无法进行自动化构建,下面准备编写Jenkinsfile文件

9. 准备一个自动化构建项目

  1. 准备一个Java项目,我们将它进行自动化构建
    项目很简单,使用maven创建一个项目,编写Main.java文件
// Main.java
/**
 * @author: jiangxch
 * @date: 2019/12/31 12:57
 */
public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 11; i++) {
            System.out.println("hello world");
        }

    }
}
  1. 将项目打包成一个可执行的jar包
    因为我们的演示期望可以使用java -jar xxx.jar来执行main函数,所以需要打包成一个可执行的jar文件
    pom.xml添加
     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                        <!-- 替换为你自己的类 -->
                                        com.sanjin.jenkins.demo.Main
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>

                                <!-- 最终生成的可执行文件名${project.artifactId}-${project.version}-jar-with-dependencies -->
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

使用mvn clean package进行打包,可以看到target中生成的jar文件

image.png

使用java -jar target/jenkins-demo-1.0-SNAPSHOT-jar-with-dependencies.jar执行,注意不是jenkins-demo-1.0-SNAPSHOT.jar,输出如下:

image.png

  1. 编写Jenkinsfile文件进行自动化部署
    回想一下上面java项目部署的步骤:1编译 2部署
    我们需要通过jenkins实现这一过程

10. 编写Jenkinsfile自动构建脚本

  1. 我们先将项目与远程库连接
    git remote add origin https://github.com/jiangxiaochuan/jenkins-demo.git

  2. 为jenkins配置docker
    由于我们要实现编译、部署的过程,所以使用docker是最方便的,一些公司也都是用这种方式进行构建的。

  • 首先需要在运行jenkins的服务器上安装docker,此处自行查阅资料
  • 其次jenkins需要安装docker插件
  1. 在项目目录下创建Jenkinsfile文件
    我用的Linux系统,就用touch命令创建了
    touch Jenkinsfile
    注意文件名称: 一定要是 Jenkinsfile
    内容如下:
pipeline {

  // 设置全局变量
  environment {
    // jar 文件的stash名称,maven编译好的jar包需要转移到jdk容器中
    STASH_JAR = "targetfiles"
    // 宿主机maven的.m2目录,会将宿主机的maven库挂载到maven容器中,不需要下载过多的jar包
    MAVEN_M2_PATH = "/home/lanlan/.m2"
    // jar镜像名称,定义jar文件名 ->
    IMAGE_JAR_NAME = "${JOB_NAME}:latest"
  }

  agent none
  stages{

    // 进行maven构建
    stage('Build jar file'){
        agent {
          // 制定docker镜像,jenkins会自动拉取image,运行一个容器
          // 所以需要部署jenkins的服务器事先安装好docker
          docker {
            image 'maven:3-alpine'
            args "-v ${MAVEN_M2_PATH}:/root/.m2"
          }
        }
        steps {
            // 在镜像中执行的shell命令
            sh 'mvn -DskipTests clean package'
            // 将打包的好的jar文件临时存储起来,我们需要把这个jar文件移动到jdk容器中运行起来
            stash includes: 'target/*.jar', name: "${STASH_JAR}"
        }
    }

    // 构建部署镜像
    stage('Build docker image') {
        agent any

        steps {
            script {
                // 删除之前的镜像,${IMAGE_JAR_NAME}相同不会生成重复的image
                // sh "docker rmi ${IMAGE_JAR_NAME}"

                // 将打包的jar从临时存放的位置拿出来,这就转移到了宿主机中
                unstash "${STASH_JAR}"
                // ${JOB_NAME} -> github-jenkins-demo/master
                // 构建镜像
                def targetImage = docker.build("${IMAGE_JAR_NAME}", ' .')
            }
        }
    }

    // 运行容器
    stage('Deploy docker continer') {
        agent any

        steps {
            script {
                // 运行镜像容器,--rm表示容器kill后不保存,直接删除
                sh "docker run --rm ${IMAGE_JAR_NAME}"
            }
        }
    }
  }
}

然后commit

  1. 编写dockerfile
    因为我们需要构建部署的docker容器,所以需要实现编写一个dockerfile文件
    在项目根目录创建dockerfile文件
#install OS
#FROM centos
FROM openjdk:8
#install java
#RUN yum install -y java



#put jar into container
#ADD target/AdWordsProducer-1.0-SNAPSHOT-shaded.jar adwordsproducer.jar
ADD target/*-jar-with-dependencies.jar target.jar
#run jar

ENTRYPOINT ["java", "-jar", "/target.jar"]

  1. push本地项目到github
    push项目后,github因为配置了WebHook,所有会发送一个请求到jenkins,jenkins会根据我们编写的JenkinsFile进行自动化部署。


    image.png

    可以看到jenkins完全已经完成了自动化构建过程

  2. 手动触发构建
    有时候网络等原因可能会导致push代码后无法出发WebHook的自动构建,此时就需要手动拉去代码并进行自动话构建


    image.png

    点击该按钮后会手动进行构建

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容