Jenkins和gitlab实现CICD

1 背景

在开发TracerBackend服务的时候,每次更改代码之后需要推送到gitlab,然后ssh登录到Ubuntu的服务器上部署新的代码。服务成功启动之后,在本地执行测试用例,觉得这一套操作流程还是挺复杂的。想起公司的代码发布流程,只要个人分支的代码测试通过之后,合并到master分支的时候会自动构建和发布还是挺方便的,想着是不是能借鉴下,自己弄一个只要代码提交到gitlab的时候Jenkins自动构建自动发布自动生成测试报告呢。

2 执行过程流程图

Jenkin是部署在docker中的,毕竟docker部署软件比较方便。但是有个问题docker是在宿主机中的,Jenkins是安装docker容器中的,咱们的TracerBackend服务也是用容器部署的,那安装在Jenkins的容器怎么调用到宿主机的docker呢。

其实有好几种方式可以实现

  1. Jenkins安装插件ssh,通过ssh执行执行宿主机命令
  2. 安装Jenkins的将宿主机的docker守护进程和文件夹共享jekins容器中,就可以通过jenkins操作宿主机的docker了
  3. 宿主机启动一个服务专门接收命令,执行命令。

我选择了第三种,写了一个RunShellServicer的服务,该服务在宿主机上运行,专门接收命令然后再宿主机上原封不动的执行命令

因为这个服务比较通用不依赖Jenkins,构建工具换成其他的也能使用,或者觉得Jenkins不好用,自己写一个简单服务监控gitlab,giblab有推送的时间,发送请求到监控服务商也能使用RunShellServicer服务在宿主机执行命令。

3 安装Jenkins

3.1 安装jenkins容器

没有安装docker可以看我以前的博客安装docker

ubuntu 中安装docker-CSDN博客

bash 复制代码
docker pull jenkins/jenkins:lts
docker run  -u root -d --name=jenkins -p 8011:8080 -v/home/wuzhibin/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts
# 检查容器是否启动成功
docker ps |grep jenkins
# 如果未成功目录添加权限继续执行上一个步骤
chmod 777 -R /home/wuzhibin/docker

3.2 登录jenkins

jenkins选择不按照插件,因为docker中安装docket不是最新的版本,好多插件都是按照失败,需要将docker中的Jenkins更新到最新的版本在按照插件

3.3 更新Jenkins的版本


更新Jenkins等待更新完成之后重启Jenkins,可以看到jenkin已经更新到了最新的版本2.440.3

3.4 更新jekins的插件镜像安装插件

Index of /jenkins/updates/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

使用清华的镜像源,找到最新的版本的源更新到Jenkins插件中更新站点中。

更新完成之后重启jenkins

4 配置gitlab和Jenkins

4.1 jenkins中配置webhook

在Jenkins中配置gitlab webhook, 复制webhook的url和Secret token的值

4.2 gitlab中配置webhook

没有gitlab想使用gitlab管理项目代码可以看这篇博客安装

Docket常见的软件部署1-CSDN博客

在项目设置中添加webhook填Jenkins生成的url和Secret token, gitlab网络配置中允许网络外发

点击测试看Jenkins中是否能触发自动构建,能自动构建表示配置成功

5 RunShellServicer服务

python 复制代码
import os
import uvicorn
from pydantic import BaseModel
from typing import Union
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.openapi.docs import get_swagger_ui_html
from logger import Logger
import subprocess

logger = Logger.get_logger()

desc = """
执行命令服务
在宿主机上执行传入的命令

"""

app = FastAPI(
    title="执行命令服务",
    docs_url=None)
app.mount("/static", StaticFiles(directory="static"), name="static")


@app.get("/docs", include_in_schema=False)
def custom_swagger_ui_html():
    return get_swagger_ui_html(
        openapi_url=app.openapi_url,
        title=app.title + " - Swagger UI",
        oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,
        swagger_js_url="/static/swagger-ui-bundle.js",
        swagger_css_url="/static/swagger-ui.css",
    )

app.add_middleware(
    CORSMiddleware,
    allow_origins="*",
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


class Body(BaseModel):
    cmd: str  # 命令
    params: Union[str, None] = None  # 参数


@app.post("/")
def run_shell(body: Body):
    try:
        cmd = body.cmd
        params = body.params
        logger.info(f"run {cmd} {params}")
        if os.name == "nt":
            encoding = "gbk"
        else:
            encoding = "utf-8"
        res = subprocess.run(f"{cmd} {params}", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE, encoding=encoding)
        if res.returncode == 0:
            logger.info(f"{cmd} {params} success")
            message = res.stdout
            logger.info(f"result:{message}")
        else:
            logger.error(f"{cmd} {params} failed")
            message = res.stderr
            logger.error(f"result:{message}")
    except Exception as e:
        logger.exception("执行异常")
        message = str(e)
    return message


if __name__ == '__main__':
    uvicorn.run("main:app", host="0.0.0.0", port=8010, workers=1)

RunShellSeviser是部署在宿主机上的接收容器中Jenkins命令的服务,它会在宿主机上执行

6 验证

1 提交TracerBackend代码

2 Jenkins会自动构建

3 容器也会被更新

4 TracerBackend项目也被部署起来了

相关推荐
SRExianxian几秒前
docker(一)之cgroup详解
运维·docker·容器
爱吃龙利鱼21 分钟前
nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
linux·运维·服务器·nginx·云原生
孟林洁32 分钟前
Jenkins入门:从搭建到部署第一个Springboot项目(踩坑记录)
java·运维·jenkins
mujingluo35 分钟前
Jenkins 2.477版本升级
运维·jenkins
Arvin62736 分钟前
Jenkins提示Host key verification failed的解决办法
运维·jenkins
张某布响丸辣2 小时前
使用Docker-Compose部署SpringBoot项目的案例
运维·docker·容器
henan程序媛2 小时前
初识Jenkins持续集成系统
运维·ci/cd·jenkins
小O_好好学2 小时前
Linux 计划任务
linux·运维·服务器
KookeeyLena53 小时前
使用电脑当服务器,来组建局域网是否安全
运维·服务器·安全
万界星空科技3 小时前
万界星空科技铜拉丝行业MES系统,实现智能化转型
运维·经验分享·科技·5g·能源·制造·业界资讯