前面只说了DevOps的两个基础组件Jenkins和GitLab,客官也不要着急,我们玩就玩的深入一点,Gitlab和Jenkins的各种配置和

插件很多,也够啃一阵子的,不要照着操作一通就感觉万事大吉了,多做些边缘测试,多玩点不一样的操作,那今天我们来点

实战整合加强训练。

作者原创文章,谢绝一切转载,违者必究!

准备:

VMwareWorkstation15Pro/RHEL8.0/Jenkins2.222.3/Gitlab-ee-13.0.0

难度: 新手--战士--老兵--大师

说明:

为了遇见各种问题,同时保持时效性,我尽量使用最新的软件版本。源码地址,其中的day30:https://github.com/xiexiaobiao/dubbo-project

目标:

  1. window主机提交代码到Gitlab主机,Jenkins自动完成jar打包,并发布到Gitlab主机(可为任意主机)上运行。

1 架构

整体部署架构:

2 环境

2.1开发Java应用,一个极简的服务,可打包为jar运行:

package com.biao.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @SpringBootApplication
@RestController
public class AppMain {
public static void main(String[] args) {
SpringApplication.run(AppMain.class,args);
System.out.println("AppMain app started >>>>>>>>>>>>");
} @RequestMapping("/jenkins/{name}")
public String hello(@PathVariable(name = "name") String name){
System.out.println("Variable: "+ name);
return "hello, " + name;
}
}
 

运行测试,GET http://localhost:8081/jenkins/biao 输出:hello, biao

2.2 GitLab主机上建立一个项目,操作步骤,略!注意看下项目的两个git地址,显示的端口号是Gitlab的端口号,不是Nginx的:

2.3 配置Jenkins主机到Gitlab主机的SSH,(配置window到Gitlab主机的SSH,也是一样,window在CMD 下执行):

[root@server224 docker-deploy]#ssh-keygen #生成密钥对
[root@server224 docker-deploy]#ssh-copy-id root@192.168.2.226 #发送公钥

Window下使用git测试ssh安装:

2.4 Jenkins主机上测试使用SSH协议连接GitLab,这样Git可以免密连接,并使用SSH连接执行shell,

进入新建的空白目录 /usr/hellojenkins 下:

[root@server224 hellojenkins]# ssh -T git@192.168.2.226  #测试ssh
[root@server224 hellojenkins]# git init  #初始化本地git库,否则报错not a git repository
[root@server224 hellojenkins]# git remote –v  # -verbose查看远程gitlab url
[root@server224 hellojenkins]# git remote add origin git@192.168.2.226:biao/hellojenkins.git
[root@server224 hellojenkins]# git pull origin master

如下,可见连接成功,其他git操作客官请随意:

2.5 Jenkins主机上测试使用HTTP协议连接GitLab,在 /usr/hellojenkins 下:

[root@server224 hellojenkins]# rm -rf ./* #清空hellojenkins目录,.git和 .idea也要删除
[root@server224 hellojenkins]# git init 
[root@server224 hellojenkins]# git remote -v
[root@server224 hellojenkins]# git remote add origin http://192.168.2.226:9099/biao/hellojenkins.git  #注意url,不是gitlabUI中给的项目url,因有Nginx代理
[root@server224 hellojenkins]# git pull origin master

如下,可见http连接成功,其他git操作客官请随意

特别注意:如开启了Nginx代理,会导致gitlab UI中给的项目url (见图1),在git中无法使用,应使用Nginx的端口号!

2.6 访问JenkinsUI,添加 ”Publish Over SSH” 插件(见前文:Jenkins安装),并在 ”系统管理-系统配置” 添加SSH目标主机 (比如我这是192.168.2.226):

要点: 1.SSH主机登录密码和私钥key,可以二选一,推荐使用私钥key,这样可以使用相同的私钥key登录多个目标主机。

2.使用私钥key测试不通过,可能是格式问题,见后文问题部分。

3.RemoteDirectory为SSH连接后要访问的目录 4.Test必须显示为Success才算配置成功

2.7 其他工具配置:Jenkins主机需先安装好Maven,Git,JDK,略!并在 “系统管理—>全局工具配置”中做对应的配置:

3 任务构建

3.1 我们来个Jenkins自动构建的实验:新建一个任务,选择”构建一个自由风格的软件项目”:

General中我全空,懒得写了。

源码管理使用Git,(也可使用Subversion,需对应的插件),并选择前面配置好的”凭证”:

自动构建触发的条件是 push 事件:

构建前清空工作目录:

构建时执行的shell脚本,source /etc/profile 不能省,可能导致mvn命令无法识别,cd $JENKINS_HOME/workspace/hellojenkins,使用环境变量来进入工作目录,

也可使用 $WORKSPACE/hellojenkins 效果一样,有个环境变量列表链接,可供参考;mvn clean package 即 maven 编译打包命令,内存不足的话可先只测试 mvn clean:

构建后操作:1 source files是待发送的源文件,这里特别注意要写相对路径target/*.jar,不是绝对路径/var/lib/jenkins/workspace/hellojenkins/target/*.jar

2 remove prefix是需要去掉的前缀,置空则将文件和路径一起发送,并在远程主机建立对应目录结构;

3 remote directory是远程主机的目录,发送的文件将保存至此;

4 执行的shell脚本,会在文件发送后执行,先可直接简化为如下建立一个日期文件(最常见的是停止旧jar的运行,并运行新的jar,完整版见后面的脚本);如果需要文件发送前执行,可以添加两个"构建后操作",并将shell脚本执行放前,文件transfer放后:

附,完整Exec comand脚本:

#!/bin/bash
pid=$(ps -ef | grep HelloJenkins-1.0-SNAPSHOT | grep 'java' | grep -v grep | awk '{print $2'})
if [ -z "$pid" ]; then
echo 'there are no HelloJenkins process. starting will be continue.'
fi
if [ -n "$pid" ]; then
echo 'java process id is '$pid
if ps -p $pid > /dev/null
then
echo $pid' will be kill'
kill - $pid
fi
fi
echo 'start HelloJenkins wait.'
nohup java -jar HelloJenkins-1.0-SNAPSHOT.jar > /dev/null >error.log &
echo 'finish starting HelloJenkins'
 

3.2 进行 ”立即构建” 测试:

3.3 等待构建完毕查看控制台日志,或左侧”构建执行状态”查看正在进行的Job:

控制台内容:

以上步骤解析:1 Jenkins生成对应的工作目录,注意 /var/lib/jenkins 对应 JENKINS_HOME 变量,即Jenkins家目录;

2对应配置选项Delete workspace before build starts,构建前删除; 3使用SSH连接远程Gitlab代码库; 4 Git操作完毕后的消息,可用于记录本次构建;

5可以看到Jenkins将构建的配置和构建流程共同生成了一个临时的Shell脚本,然后执行,这也是Jenkins的工作原理之一。

总结:这里的Jenkins自动构建流程是使用Git从远程库clone到本地,然后本地构建,同时部分流程和配置会组合生成一个临时的Shell脚本来执行,最终完成整个构建工作流程。(Jenkins还有其他构建方式)。

以上步骤解析:1对应执行”构建”配置中shell命令mvn clean package的结果; 2-5是对应”构建后操作” 中的配置,其中2是开始SSH连接,

3是开始执行”Exec command”中的shell命令,4断开SSH连接,5文件传输的结果

以下为server226上对应”构建后操作”中的结果,生成的文件和传输过来的jar包:

4 题外话

4.1 我上传的代码中还包含了 Dockerfile 和自动打包/部署Docker镜像的shell脚本,内容太多,各位看官可以尝试一下:使用Jenkins自动构建

并生成镜像和部署运行,有空我就后期再说吧,一次写太多看的也累。

4.2 Gitlab的WebHook功能:在Gitlab收到push事件后,可以 POST 发送定制的信息至指定的URL,从而触发更新。比如SpringCloud的config

配置自动更新,当GitHub上的配置文件更新后,WebHook自动触发Refresh 到Config Server 上,而完成配置自动刷新。

5 问题

5.1 添加SSH服务器时,test失败,提示:

Failed to connect or change directory jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@d8d395a]

这是因为私钥格式Jenkins无法识别,如果打开私钥文件,"-----BEGIN OPENSSH PRIVATE KEY-----" 表示使用的是最新的OpenSSH格式,需要使用旧版格式,重新生成密钥,命令如下:

ssh-keygen -t rsa -b 4096 -m PEM

再打开私钥文件,可见私钥文件内容开头:”-----BEGIN RSA PRIVATE KEY-----”,

5.2 运行自动生成镜像脚本错误提示$'\r' command not found

这种错误是因为编写的 shell脚本是在window下编写的,每行结尾是 \r\n,而 Unix 结束行是 \n , 所以在Linux下运行脚本会认为 \r 是一个字符,需要把文件转换下:

[root@server224 docker-deploy]# sed -i 's/\r//' auto-image.sh

5.3 错误提示:Does not have a commit checked out,这是因为当前目录下存在没有提交的目录,首先使用 pwd (present working directory)命令查看当前目录,

需保持 .init命令和 pwd 命令目录一致:

5.4 提示 http/https协议不支持,可能原因是url错误,或者没添加远程地址,初始化没完成,即git remote add命令:

5.5 打包编译时,内存不足,看控制台输出,我将Jenkins主机由6G调整为8G才解决,还好我的小电脑内存足够大:

总结:控制台输出是个非常有用的记录,比如我之前的构建失败记录,可以看到无法识别 mvn 命令,于是知道是maven未配置好!

全文完!


我近期其他文章:

只写原创,敬请关注

DevOps系列——Jenkins/Gitlab自动打包部署的更多相关文章

  1. Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器

    原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...

  2. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目

    前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...

  3. 【Xamarin开发 Android 系列 13】 应用打包部署

    原文:[Xamarin开发 Android 系列 13] 应用打包部署 开始倒叙咯................ 先更新大宝部署吧,这个章节比较的Easy,童鞋们不用费脑筋.点解?从界面上填写几个参 ...

  4. docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  5. Jenkins+Gitlab+Ansible自动化部署(五)

    Freestyle Job实现静态网站部署交付(接Jenkins+Gitlab+Ansible自动化部署(四)https://www.cnblogs.com/zd520pyx1314/p/102445 ...

  6. Jenkins+Gitlab+Ansible自动化部署(六)

    Pipeline Job实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs. ...

  7. Jenkins+Gitlab+Ansible自动化部署(二)

    接Jenkins+Gitlab+Ansbile自动化部署(一):https://www.cnblogs.com/zd520pyx1314/p/10210727.html Ansible的配置与部署 工 ...

  8. Jenkins+Gitlab+Ansible自动化部署(三)

    接Jenkins+Gitlab+Ansible自动化部署(一)https://www.cnblogs.com/zd520pyx1314/p/10210727.html 和(二)https://www. ...

  9. Jenkins+Gitlab+Ansible自动化部署(一)

    首先准备实验环境 虚拟机 主机名 IP地址 服务 系统版本 内核版本 Vmware Workstation 14 gitlab.example.com 192.168.244.130 gitlab  ...

随机推荐

  1. 「雕爷学编程」Arduino动手做(36)——WS2812B 4位彩灯模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  2. spark机器学习从0到1协同过滤算法 (九)

      一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法.   基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...

  3. css中height, width默认值

    转载自:https://www.cnblogs.com/heyode/p/5973960.html <body> <div class="wrap"> &l ...

  4. 3.4 Go字符型

    1. Go字符型 Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存. 普通字符串就是一串固定长度的字符连接起来的字符序列. Go 的字符串是由单个字节连接起来 ...

  5. SpringBoot瘦身

    1.介绍 本教程中,我们将研究如何使用spring-boot-thin-launcher项目来将Spring Boot项目瘦身. Spring Boot出了名的把所有依赖打包成单个可执行的Fat JA ...

  6. Unity设置应用后台运行

  7. 阿里云服务器centOS安装Docker

    环境准备 1.需要有Linux的基础 2.centOS 7 环境查看 # 系统内核是 3.10 以上的 [root@iz2zeaet7s13lfkc8r3e2kz ~]# uname -r -.el7 ...

  8. 校园网络 luogu P2812 (又是强联通)

    题目传送门!(luogu) 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这 ...

  9. Python每日一练(1)

    这两天在做Python的每日一练,感觉收获颇丰,所以来记录分享一下,一共做了三个,涉及socket,PIL,pymysql三个库,另外终于开始了Flask框架的学习,后续也会做出一些分析 第一个是一个 ...

  10. ForkJoinPool分支合并框架-工作窃取

    Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成 若干个小任务(拆到不可再拆时), 再将一个个的小任务运算的结果进行 join 汇总 For ...