在工做中接触到CD/CI,Devops相关的技术,本文记录Jenkins的基本使用。Jenkins是一款开源的持续集成工具,可以集成一套自动化部署任务。html
两台虚拟机 (实现利用Jenkins从github拉取代码,并经过maven打包,部署到另外一台服务器的docker容器中)java
a.一台安装了docker (用于部署程序)git
b.一台安装了maven jdk8 git (用于安装jenkins,并拉取代码,编译打包)github
本文采用部署war包的方式安装Jenkins,首先下载jenkins war包。web
$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
官方连接:docker
1.安装向导: https://jenkins.io/zh/doc/book/installing/#setup-wizardshell
2.war包下载: http://mirrors.jenkins.io/war-stable/express
经过war包的方式启动Jenkins的方式很简单,直接使用java -jar命令就能够启动了,Jenkins默认端口是8080 若是须要指定端口能够修改启动参数centos
$ java -jar jenkins.war --httpPort=9090
启动成功后会自动生成admin帐号以及密码,第一次登陆时须要用到bash
访问部署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.在【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
$ docker build -t base_image .
具体配置:
# 在远程服务器上
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界面,说明部署成功。
新建一个【流水线】任务,建立好后直接编写Pipeline script
pipeline{ agent any //代理 options { // 针对流水线的控制选项 timeout(time: 10, 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 18080:8761 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.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } } post { //13.post步骤 success { // always changed failure success unstable aborted echo "success" } } }
这里对上面的pipeline script进行说明:
补充说明经过Jenkins界面生成流水线脚本,以git脚本为例(ssh脚本同理)
能够参考官网语法:Jenkins官方语法介绍
能够看到【阶段视图】
外部访问成功(因为虚拟机重启,ip地址变动,这里的ip地址与以前的ip地址不一样,请读者忽略这个问题)