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

相关推荐
追风赶月、24 分钟前
【Linux】线程概念与线程控制
linux·运维·服务器
szc176732 分钟前
docker 相关命令
java·docker·jenkins
CP-DD38 分钟前
Docker 容器化开发 应用
运维·docker·容器
努力的悟空2 小时前
国土变更调查拓扑错误自动化修复工具的研究
运维·自动化
pumpkin845142 小时前
GitHub 和 GitLab
gitlab·github
周末不下雨3 小时前
win11+ubuntu22.04双系统 | 联想 24 y7000p | ubuntu 22.04 | 把ubuntu系统装到1T的移动固态硬盘上!!!
linux·运维·ubuntu
lizz6663 小时前
gitlab:使用脚本批量下载项目,实现全项目检索
gitlab
脸ル粉嘟嘟3 小时前
GitLab使用操作v1.0
学习·gitlab
耗同学一米八4 小时前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题四
运维·网络
东华果汁哥5 小时前
【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录
linux·运维·服务器