DevOps系列——Jenkins/Gitlab自动打包部署

前面只说了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 架构

整体部署架构:

DevOps系列——Jenkins/Gitlab自动打包部署

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的:

DevOps系列——Jenkins/Gitlab自动打包部署

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安装:

DevOps系列——Jenkins/Gitlab自动打包部署

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操作客官请随意:

DevOps系列——Jenkins/Gitlab自动打包部署

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操作客官请随意

DevOps系列——Jenkins/Gitlab自动打包部署

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

2.6 接见JenkinsUI,添加 ”Publish Over SSH” 插件(见前文:Jenkins安装),并在 ”系统治理-系统设置” 添加SSH目的主机 (好比我这是192.168.2.226):

DevOps系列——Jenkins/Gitlab自动打包部署

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

2.使用私钥key测试不通过,可能是花样问题,见后文问题部门。

3.RemoteDirectory为SSH毗邻后要接见的目录 4.Test必须显示为Success才算设置乐成

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

DevOps系列——Jenkins/Gitlab自动打包部署

3 义务构建

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

General中我全空,懒得写了。

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

DevOps系列——Jenkins/Gitlab自动打包部署

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

DevOps系列——Jenkins/Gitlab自动打包部署

构建前清空事情目录:

DevOps系列——Jenkins/Gitlab自动打包部署

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

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

DevOps系列——Jenkins/Gitlab自动打包部署

「MoreThanJava」Java发展史及起航新世界

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

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

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

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

DevOps系列——Jenkins/Gitlab自动打包部署

附,完整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 -9 $pid
    fi
fi
echo 'start HelloJenkins wait.'
nohup java -jar HelloJenkins-1.0-SNAPSHOT.jar  > /dev/null 2>error.log &
echo 'finish starting HelloJenkins'
 

3.2 举行 ”立刻构建” 测试:

DevOps系列——Jenkins/Gitlab自动打包部署

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

DevOps系列——Jenkins/Gitlab自动打包部署

控制台内容:

DevOps系列——Jenkins/Gitlab自动打包部署

以上步骤剖析: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另有其他构建方式)。

DevOps系列——Jenkins/Gitlab自动打包部署

以上步骤剖析:1对应执行”构建”设置中shell下令mvn clean package的效果; 2-5是对应”构建后操作” 中的设置,其中2是最先SSH毗邻,

3是最先执行”Exec command”中的shell下令,4断开SSH毗邻,5文件传输的效果

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

DevOps系列——Jenkins/Gitlab自动打包部署

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

DevOps系列——Jenkins/Gitlab自动打包部署

这种错误是由于编写的 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 下令目录一致:

DevOps系列——Jenkins/Gitlab自动打包部署

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

DevOps系列——Jenkins/Gitlab自动打包部署

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

DevOps系列——Jenkins/Gitlab自动打包部署

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

DevOps系列——Jenkins/Gitlab自动打包部署

全文完!

我近期其他文章:

只写原创,敬请关注

DevOps系列——Jenkins/Gitlab自动打包部署

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/14797.html