一、概述

1.简介

  在工作中接触到CD/CI,Devops相关的技术,本文记录Jenkins的基本使用。Jenkins是一款开源的持续集成工具,能够集成一套自动化部署任务。

  目标

  1. 通过jenkins从github拉取代码(web应用)
  2. 通过jenkins进行maven编译打包
  3. jenkins发送打好的jar包,发送到另一台需要部署的虚拟机上(已安装docker)
  4. 通过dockerfile打新镜像
  5. 停掉已运行的容器,并启动新的容器

2.环境准备

  两台虚拟机 (实现利用Jenkins从github拉取代码,并通过maven打包,部署到另一台服务器的docker容器中)

    a.一台安装了docker (用于部署程序)

    b.一台安装了maven jdk8 git (用于安装jenkins,并拉取代码,编译打包)

二、安装、启动、配置Jenkins

1.下载Jenkins

  本文采用部署war包的方式安装Jenkins,首先下载jenkins war包。

  

$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

  官方链接:

  1.安装向导: https://jenkins.io/zh/doc/book/installing/#setup-wizard

  2.war包下载: http://mirrors.jenkins.io/war-stable/

2.启动Jenkins

  通过war包的方式启动Jenkins的方式很简单,直接使用java -jar命令就可以启动了,Jenkins默认端口是8080 如果需要指定端口可以修改启动参数

$ java -jar jenkins.war --httpPort=

  启动成功后会自动生成admin账号以及密码,第一次登录时需要用到

3.初次登录Jenkins

  访问部署Jenkins那台服务器的9090端口,输入初始密码

  进入安装向导,选择【安装推荐插件】,当然也可以自定义需要安装的插件

  推荐的安装的插件如下图,等待下载安装。

  

  插件下载安装后,创建管理员账号

  接下来配置Jenkins实例绝对地址(本文采用默认URL),这个值会和Jenkins参数BUILD_URL有关

  保存后,开始使用Jenkins,使用刚配置的管理员账号登录即可

  补充安装插件:

  由于我们会将jenkins打好的包发送到另外一台服务器进行部署,因此需要再安装【Publish Over SSH】【Publish Over FTP】插件。

  使用admin账号登录jenkins,点击【系统管理】-【插件管理】-【可选插件】,搜索"publish over",选择【Publish Over SSH】【Publish Over FTP】插件,并直接安装。

  

  配置ssh,点击【系统管理】-【系统设置】,新增,输入远程服务器ip,以及用户名和密码,并填写远程服务器的访问路径(这里是根目录) 点击test查看是否连接成功,成功后保存配置即可

  

  

三、任务创建与执行

1.【方式1】创建自由风格的任务

  下面将创建一个基于上下游自由风格的任务,实现我们的目标

  创建好后,在配置界面,可以看到自由风格的任务包含下面几点内容

  1.在【General】中,选择参数化构建过程,使用文本参数,定义参数为branch,即在构建任务前,可以传递的参数。

  

  2.【源码管理】选择git,输入仓库地址,并添加凭据,类型选择【Username with password】,用户名、密码分别填写github账号和密码。

  3.【构建】,添加两个构架步骤,1.执行shell,2.Send files or execute commands over SSH

  shell命令步骤用于使用maven打包

  Send files or execute commands over SSH 用户发送打好的包到部署服务器

  这里补充说一下,jenkins自带了很多环境变量可以直接使用,例如工作目录 WORKSPACE等,访问jenkins这个路径可以查看 http://192.168.152.133:9090/env-vars.html/

  shell命令步骤:通过maven打包

cd eureka    # 进入项目工程
mvn clean package -Dmaven.test.skip=true # maven 打包

  

  Send files or execute commands over SSH 步骤

  这个步骤会指定需要被发送的jar包,以及发送到远程服务器的指定路径,并构建一个新的镜像进行部署。

  补充:基础镜像Dockerfile(基础镜像安装openjdk 1.8),基础镜像可以安装配置一些软件、环境,之后需要部署的程序都可以FROM这个基础镜像

FROM centos:7

RUN yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

基础镜像Dockerfile

$ docker build -t base_image .

构建基础镜像

  具体配置:

  • Name:选择之前配置的需要远程部署的主机
  • Source files:需要发送到远程主机的文件(注意路径,这里使用相对路径,相对于在jenkins workspace这个任务的路径 这里是相对于这个路径: /root/.jenkins/workspace/Job1 )
  • Remove prefix:删除路径前缀(发送的文件名会受【Source files】配置的影响,这里需要删除路径前缀)
  • Remote directory:远程主机需要接收包的路径(这个路径是相对路径,相对于之前配置远程服务器信息的Remote Directory,由于之前配置的是根路径,因此这里可以使用绝对路径)
  • Exec command:包发送成功后,执行的命令

    # 在远程服务器上
    cd /data/deploy
    docker build -t eureka_image:${branch} .
    docker run -dit -p 18080:8761 eureka_image:${branch} /bin/bash #暴露端口 宿主机18080端口与容器8761端口映射

  附上需要部署程序的Dockerfile

FROM base_image:latest

ADD eureka-0.0.1-SNAPSHOT.jar /data/eureka.jar

WORKDIR /data

ENTRYPOINT ["java","-jar","eureka.jar"]

EXPOSE 8761

  执行

  配置完成后点击保存,Build with Parameters,输入参数(需要部署的分支),点击开始构建

  

  点击正在进行的任务,【控制台输出】可以看到构建日志

  可以看到最后是SUCCESS,说明构建成功。如果构建失败可以根据日志提示进行排查。

  访问服务器18080端口,看到Eureka界面,说明部署成功。

2.【方式2(推荐)】创建Pipeline任务

  创建以及配置

   新建一个【流水线】任务,创建好后直接编写Pipeline script

 

  

pipeline{
agent any //代理
options { // 针对流水线的控制选项
timeout(time: , unit: 'MINUTES')
}
parameters { // 1.构建构建参数
string(name: 'BRANCH', defaultValue: 'dev', description: '分支')
}
stages { // 2.包含以系列stage
stage('Pull Code') { // 3.stage 定义代码拉取阶段
steps{ // 6.步骤
git branch: '$BRANCH', credentialsId: 'your credentials', url: 'https://github.com/SherryXRJ/test.git' // 9.选择git仓库
}
} stage('Build') { // 4.stage 定义构建阶段
environment { // 10.环境变量定义
skipTest = 'true'
} input { // 11.pipeline用户输入框
id "Deploy" // 默认与stage一致
message "Should we Build now?"
ok "Yes, we should."
submitter "admin" // 可以提点击确认的用户
parameters { // 14.参数定义
string(name: 'MSG', defaultValue: 'admin', description: 'Who should I say hello to?')
}
}
steps{ // 7.步骤
sh 'printenv'
sh 'echo msg: ${MSG}'
sh ''' cd eureka
mvn clean package -Dmaven.test.skip=$skipTest '''
}
} stage('Deploy'){ // 5.stage 定义部署阶段
when { // 12.pipeline scripe 条件分支
allOf { // allOf not anyOf
expression { return params.BRANCH == 'dev' } // 只有dev分支才部署 // other conditions ...
} } steps{ // 8.步骤
sh ''' echo ${PERSON} '''
// 15.ssh脚本
sshPublisher(publishers: [sshPublisherDesc(configName: 'remote_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd /data/deploy
docker build -t eureka_image:${branch} .
docker run -dit -p : eureka_image:${branch} /bin/bash''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/data/deploy', remoteDirectorySDF: false, removePrefix: 'eureka/target/', sourceFiles: 'eureka/target/eureka-0.0.-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
post { //13.post步骤
success { // always changed failure success unstable aborted
echo "success"
} }
}

  这里对上面的pipeline script进行说明:

  • parameters: 注释1 14

    •   构建参数,定义任务参数。在自由风格的任务中,参数化构建是在界面上进行的新增,这里通过脚本定义,参数为需要拉取的分支
  • stages:注释2
    •    需要在stages中定义一系列的stage
  • stage:注释3.4.5
    •   可以定义阶段名称
  • steps: 注释6.7.8  
    •   具体执行步骤,可以为shell脚本、流水线脚本等
  • 流水线脚本:注释9.15
    •   可以通过Jenkins界面操作生成流水线脚本
  • environment:注释10   
    •   环境变量,在本任务中定义环境变量,该环境变量仅在每次执行的任务中生效
  • input:注释11                 
    •   用户输入框,例如这里配置,当任务执行到‘Build’阶段时,需要admin用户点击确认,才能继续执行
  • when:注释12
    •   条件判断,满足了这些条件才能执行之后的步骤(上面的脚本中只有当构建的分支为dev时,才进行Deploy步骤)
  • post:  注释13
    •   当该任务状态发生改变时,会触发post里对应阶段的内容(状态包括:always, changed,failure,success,unstable,aborted)

  

  补充说明通过Jenkins界面生成流水线脚本,以git脚本为例(ssh脚本同理)

  

  可以参考官网语法:Jenkins官方语法介绍

  启动

  

  可以看到【阶段视图】

  

  

  外部访问成功(由于虚拟机重启,ip地址变更,这里的ip地址与之前的ip地址不同,请读者忽略这个问题)

Jenkins初体验-安装与部署服务的更多相关文章

  1. Jenkins教程——从安装到部署Docker服务(一)安装Jenkins

    前言 写了好久Jenkins的脚本了,写得虽然不是太好,但是可以基本满足需要,最近比较忙,这个月也没怎么更新博客,开始更新Jenkins这个系列的文章,打算从安装Jenkins -> 流水线工程 ...

  2. Jenkins教程——从安装到部署Docker服务(二)声明式流水线HelloWorld

    前言 本文通过一个声明式流水线的HelloWorld程序做一下流水线基础入门,对常用的流水线参数进行简要说明 什么是流水线 现实中的流水线 流水线比较好理解,类比于现实生活中的生产流水线,每个流程只做 ...

  3. MySQL初体验--安装MySQL

    操作系统版本:redhat 6.7 64位 [root@mysql ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server releas ...

  4. Cocos2d-x 3.4 初体验——安装教程

    电脑系统window7 32位 1.首先从官网下载cocos2d-x并解压 http://cn.cocos2d-x.org/download/ 解压后的文件夹中有一个setup.py,双击运行.需要安 ...

  5. scrapy初体验 - 安装遇到的坑及第一个范例

    scrapy,python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.scrapy的安装稍 ...

  6. docker初体验:Docker部署SpringCloud项目eureka-server

    Docker部署SpringCloud项目eureka-server 1 创建eureka-server工程 创建父工程cloud-demo,其pom.xml如下: <?xml version= ...

  7. Jmeter的初体验--安装

    准备工作 安装JMeter前需要安装配置好Java 一.安装 1.直接在官网下载安装即可,下载地址:http://jmeter.apache.org/download_jmeter.cgi,(Wind ...

  8. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  9. 文档数据库RavenDB-介绍与初体验

    文档数据库RavenDB-介绍与初体验 阅读目录 1.RavenDB概述与特性 2.RavenDB安装 3.C#开发初体验 4.RavenDB资源 不知不觉,“.NET平台开源项目速览“系列文章已经1 ...

随机推荐

  1. 『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

    本文索引目录: 一.PTA实验报告题1 : 数字三角形 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 最大子段和 2.1 实践题目 ...

  2. conversion function——转换函数

    类型转换函数 与 explicit关键字 1.类型转换函数 在C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function) ...

  3. Jenkins构建Jmeter项目之源代码管理(SVN)

    1.查看项目创建中是否又svn插件,没有的话下载插件subversion 2.配置svn源代码管理,如下图(testcases目录下包含build.xml和脚本文件) 3.查看Jenkins本地工作空 ...

  4. 使用Swagger服务搭建.Net Core API

    使用Swagger服务搭建.Net Core API 创建.Net Core API 新建项目.文件——新建——项目 选择应用程序模板. 设置存放路径,命名方案名称. 创建API. 搭建成功. 使用S ...

  5. Oracle11g安装与基本使用

    目录 安装 修改用户密码 配置文件修改 使用PLSQL连接Oracle数据库 如何执行SQL 语句 本教程基于oracle11g和PLSQL进行 下载资源见百度网盘链接:https://pan.bai ...

  6. Ubuntu16.04 安装apache+mysql+php(LAMP)

    记录下ubuntu环境下安装apache+mysql+php(LAMP)环境. 0x01安装apache sudo apt-get update sudo apt-get install apache ...

  7. PHP array_mulitsort

    1.函数的作用:对多维数组进行排序 2.函数的例子: 例子一: <?php // http://php.net/manual/zh/function.array-multisort.php $m ...

  8. java集合之Vector向量基础

    Vector向量: vector类似动态数组,向量和数组类似,但是数组容量一旦确定不可更改,而向量的容量可变.向量只可以保存任何类型对象且容量不限制,数组对元素类型无限制但是容量有限. 适用场合:向量 ...

  9. python编程系列---可迭代对象,迭代器和生成器详解

    一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...

  10. office visio 2019 下载激活

    安装 下载 office ed2k://|file|cn_office_professional_plus_2019_x86_x64_dvd_5e5be643.iso|3775004672|1E4FF ...