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项目也被部署起来了

相关推荐
蝎子莱莱爱打怪1 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅2 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒2 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
zhangfeng11332 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh
ZeroNews内网穿透2 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全
失重外太空啦2 天前
nginx
运维·nginx
Gofarlic_oms12 天前
避免Kisssoft高级分析模块过度采购的科学评估方法
大数据·linux·运维·人工智能·matlab
田井中律.2 天前
服务器部署问题汇总(ubuntu24.04.3)
运维·服务器
大大水瓶2 天前
HAProxy 从入门到实战:负载均衡与流量管理全解析
运维·负载均衡