极狐GitLab 企业级 CI/CD 规模化落地实践指南(一)

news2024/12/24 8:36:58

目录

template 引用,减少代码冗余,增强 CI/CD 构建扩展性

问题 1:代码冗余,低效实践

问题 2:维护性难,工作量大

➤ local

➤ file

➤ remote

➤ template

收益 1:一处修改,多处生效

收益 2:高效构建,简单便捷

Component,打造 CI/CD Pipeline 单一可信源,简化 CI/CD Pipeline 构建

Component 仓库的构建

Component 的发布

Component 的引用

 Runner,CI/CD 高效构建的利器

专有 + 共享,更多灵活选择

动态扩缩容,提高资源使用率

合规流水线,助力流水线的安全合规使用


极狐GitLab CI 内置于极狐GitLab 一体化平台,提供开箱即用的 CI/CD 能力,也是受众多用户喜爱的 CI 工具之一。极狐GitLab CI 独特的设计机制和企业级功能特性,能够帮助企业在大规模落地 CI/CD 实践时,提高 CI/CD 构建效率、降低 Pipeline 维护成本,同时还能保持足够的安全合规性

本文从 CI/CD Pipeline 的构建入手,讲述极狐GitLab CI 三大方面的使用:

  1. 通过 template 、component 来缩短 Pipeline 编写时间、提高维护性;

  2. 通过 Runner 的“花式”玩法来满足不同场景下的 CI/CD Pipeline 运行需求,同时降低使用成本;

  3. 用合规框架来保障 CI/CD Pipeline 的合规使用。

template 引用,减少代码冗余,增强 CI/CD 构建扩展性

在企业内部,一种很常见的场景就是:不同团队或者不同产品线都有自己独有的项目,每个项目都有对应的 CI/CD 流水线,随着项目的增多,流水线的数量也会不断增加,一个企业内部有可能存在数百甚至上千条流水线。

图片

因为 CI/CD 流水线是软件交付(从编码到上线)的自动化展现形式,因此大部分流水线之间会有比较高的相似度,甚至有一些 stage 或者 job 是完全一样的,比如在云原生交付场景下需要将应用程序打包成镜像,使用极狐GitLab CI 进行构建的代码如下:

build:
  image: docker:latest
  stage: build
  services:
    - docker:20.10.7-dind
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:1.0.0 .
    - docker push $CI_REGISTRY_IMAGE:1.0.0

此外,如果都是 java 或者 golang 项目,其编译或者测试的命令可能也是类似的。这种“重复”会随着流水线的增加而增加,以下问题也会随之而来:

问题 1:代码冗余,低效实践

如果每一条流水线都有一个 stage 或者 job 是相似的,大约有 10 行代码,那么数百上千条流水线,其重复的代码数量就是成千上万条。这种代码冗余在软件研发领域本身就是一种低效实践,如果不及时进行重构,随着项目的演进,就会变成技术债。

问题 2:维护性难,工作量大

在对 CI/CD Pipeline 进行优化的过程中,需要对流水线的部分内容进行改造,比如需要升级 dind 的版本,抑或为了安全地构建镜像,将构建方式从 dind 转向 kaniko,那么对应的代码就要变成:

  services:
    - docker:24.0.3-dind

及:

build:
  stage: build
  image:
    name: registry.jihulab.com/jh-xiaomage-devops/go-demo/kaniko:debug
    entrypoint: [""]
  script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
    - >-
      /kaniko/executor
      --context "${CI_PROJECT_DIR}"
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
      --destination "${CI_REGISTRY_IMAGE}:1.0.0"

这时就要对所有的流水线进行改造,数百条乃至上千条流水线的改造将是一个巨大的工作量,且大量代码的“复制粘贴”过程,很难避免不出错。

在软件研发领域,解决冗余代码的重要手段就是通过抽象 + 复用:也就是将相同(或者相似)的内容抽象成模版,将模版“存储”在某一个地方,其他地方只需要简单引用模版即可

对于 CI/CD Pipeline 来说也是一样。极狐GitLab template 就是极狐GitLab CI 内置的模版引擎功能,可以将抽象之后的模版存储在项目仓库中,其他项目通过 include 语法就可完成 template 的引用。

图片

极狐GitLab template 的用法比较灵活,首先需要将“制作”模版,也就是将“重复”的代码提取出来,保存在一个 YAML 文件中。比如上面的镜像构建内容,可以写到一个 docker-image-build.gitlab-ci.yml 文件中。接下来使用 include 进行引用。根据模版存储的位置不同,include 的引用有以下四种方式:

➤ local

模版位于当前项目中,使用 local 关键字来引用。使用语法如下:

include:  
  - local: '/templates/docker-image-build.gitlab-ci.yml'

➤ file

模版和项目位于同一实例,但是不同仓库,使用 file 关键字来引用。使用语法如下:

include  
  - project: xiaomage/templates  
  - ref: main    
  file: /templates/docker-image-build.gitlab-ci.yml

➤ remote

引用远端仓库中的流水线,通常是不同实例之间的引用。使用语法如下:

include:   
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build.gitlab-ci.yml'

➤ template

极狐GitLab 内置模版的引用。极狐GitLab 根据自身多年的经验,沉淀了众多可以直接复用的模版,使用 template 语法即可使用。最典型的就是极狐GitLab DevSecOps 模版的引用。极狐GitLab DevSecOps 有密钥扫描、依赖项扫描、SAST、DAST、容器镜像扫描、模糊测试及许可证合规检测功能,所有功能两行代码即可开启。

图片

因此,使用 template 能带来以下收益:

收益 1:一处修改,多处生效

如果需要对流水线的内容进行优化,比如将 dind 的版本进行升级,则只需要在模版中进行修改,其他引用的地方会随之生效,真正实现“一处修改,多处生效”,这完全避免了“一处变更,处处修改”所带来的重复劳动,而且流水线的冗余度也会降低。

收益 2:高效构建,简单便捷

template 可以实现多级嵌套,也就是模版里面引用模版。这样做的好处就是,可以将模版的内容细粒度化,可能是一个 stage,也可能是一个 job,比如容器镜像构建是一个模版,容器镜像安全扫描又是一个模版。如果要对新项目构建一条流水线,则可以直接使用多个 template 进行“搭积木”的方式就可快速完成流水线的构建,然后根据项目的实际构建流程来对参数或者流程做一些变更即可。

当然,为了高效的使用模版,还有一个问题需要注意,那就是模版中变量的覆盖

为了灵活使用模版,使用同一套模版,构建出多个不同的实例。关键在于模版中变量的使用。比如,构建容器镜像时 tag 可能会随着版本的不同而不同,此时可以将 tag 设置为一个变量:

variables:
  IMAGE_TAG: 1.0.0

build:
  image: docker:latest
  stage: build
  services:
    - docker:20.10.7-dind
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG .
    - docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG

在引用的地方直接进行变量覆盖即可:

variables:
  IMAGE_TAG: "2.0.0"

include: 
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build.gitlab-ci.yml'

覆盖之后,镜像 tag 的值从默认的 1.0.0 就变成了 2.0.0 ,这样就能满足不同场景的诉求,兼具高效和灵活。

Component,打造 CI/CD Pipeline 单一可信源,简化 CI/CD Pipeline 构建

template 的使用大大降低了用户构建 CI/CD Pipeline 的难度,通过引用 + 参数覆盖的模式就能够快速构建出对应场景的 Pipeline,但是目前并没有一个 template 的单一可信源,来方便用户找到自己想用的 Pipeline,同时也无法让愿意贡献的用户将可用的 template 贡献出来,来共同打造 Pipeline 的繁荣生态。

为此,极狐GitLab 推出了 CI/CD Component 这一特色功能,其目的就是打造 CI/CD Pipeline 的单一可信源,通过将不同流水线(或者单独的作业)变成不同的 component,然后发布到 component 仓库,其他用户可以在此仓库中通过搜索来找到自己想要的 component,在构建流水线的时候直接引用即可,多个组件的引用就能够快速搭建起整个完整的流水线,这极大的改变了用户使用 CI/CD 的体验。

更为重要的是用户可以将自己认为已经得到实践的一些优秀流水线(或者单独的作业)以 component 的形式发布到 component 仓库,通过不同用户的不断贡献、迭代来共同打造繁荣的 CI/CD Pipeline 生态,最终构建企业内部 CI/CD Pipeline 单一可信源,提高 CI/CD Pipeline 构建效率的同时,安全性也得到了很大的提升。

注意:CI/CD Component 目前处于实验阶段。

图片

CI/CD Component 示意图

因此,componnt 的核心是:component 仓库的构建、 component 的发布及 component 的引用

Component 仓库的构建

通过创建一个极狐GitLab 仓库,并且将其标记为 component 仓库来构建一个初始的 component 仓库。该仓库至少需要两个文件 README.md 和 template.yml

  • README.md 可以对仓库中包含的 component 进行描述,方便用户学习使用;

  • template.yml 就是 component 的具体内容。

可以通过不同的目录结构(分支、tag 等)来实现不同 component 的区分,比如:

├── template.yml
├── README.md
├── .gitlab-ci.yml
├── forntend/
│   └── template.yml
└── backend/
    └── template.yml

上述目录表示,在此 component 仓库中有三个可用的 component:

  • 根目录下 template.yml 表示的 component;

  • frontend 目录下 template.yml 表示的 component;

  • backend 目录下 template.yml 表示的 component。

可以通过项目 → 设置 → 通用 → 可见性、项目功能、通用 → 开启 CI/CD 目录资源来将一个仓库标记为 component 仓库。

Component 的发布

如果需要发布一个 component,则需要将对应的内容写入到某个 template.yml 内,然后将该文件推送至 component 仓库即可。以上述镜像构建为例,将下述内容写入到某个 template.yml 中:

spec:  
  inputs:    
    stage:      
      default: test    
    image:      
      default: docker:latest    
    tags:      
      default: tags    
    image_tag:      
      default: 1.0.0
      
component-job-build-image:  
  image: $[[ inputs.image ]]  
  stage: $[[ inputs.stage ]]  
  tags:    
    - $[[ inputs.tags ]]  
  script:     
    - docker login -u "$REGISTRY_USER" -p "$REGISTRY_PWD" REGISTRY_URL    
    - docker build -t dllhb/cicd-component:$[[ inputs.image_tag ]] .    
    - docker push dllhb/cicd-component:$[[ inputs.image_tag ]]

然后推送至 jh.instance.url/username/component-project 目录下。参数说明:

  • jh.instance.url:极狐GitLab 私有化部署实例地址;

  • username:极狐GitLab 用户名;

  • component-project:component 仓库名称。

上述 component 位于仓库根目录下,有一个 component-job-build-image job。

Component 的引用

如果想要在其他 Pipeline 中引用上述发布的 component,在 .gitlab-ci.yml 中用如下语法引用:

include:  
  - component: jh.instance.url/username/component-project@main    
  inputs:      
    stage: build      
    image: docker:latest      
    tags: cicd      
    image_tag: 2.0.0
    
stages: [build]

需要注意的地方有:

  • 在 include 中完整写入 component(也就是 tempate.yml 存在的路径)的路径,通过 @ 来明确引用的是 component 的哪个版本(可以用分支、commit hash、tag 等表示);

  • 在 inputs 中写入具体的参数。

触发 CI/CD Pipeline,可以看到 component-job-build-image job 执行成功:

图片

同样地,如果想要将 dind 的构建方式换为 kaniko,则无需替换上述 component 的内容,只需要再次发布一个以 kaniko 为主题的 component 即可。

这有很多种做法来实现,比如将 template.yml 放在 component 仓库的另外一个目录(非根目录下,因为根目录下已经有 dind 的 component)、分支、tag 下来表示这是不同的 component;比如针对上述的 component,main 分支表示 dind component,那么可以新建一个 kaniko 分支来存放 kaniko 对应的 component,最后在 .gitlab-ci.yml 中引用的时候指明分支即可:

include:  
  - component: jh-jhma.gitlab.cn/cicd-component/cicd-component-demo@kaniko   
  inputs:      
    stage: build      
    image: gcr.io/kaniko-project/executor:debug      
    tags: cicd      
    image_tag: 2.0.0
    
stages: [build]

当然,镜像也要由原来的 dind 改为 kinako,这只需要修改 inputs 的参数即可。

运行 CI/CD Pipeline 可以得到相同的结果。

component 的引入拉开了极狐GitLab CI/CD 使用新范式的序幕。这种通过用户贡献来打造 CI/CD Pipeline 单一可信源的做法,对于用户构建完整的 Pipeline 有着巨大帮助,不仅加速了 CI/CD Pipeline 的构建,还大大降低了用户学习繁杂 YAML 语法的成本。

以上所演示的代码均存储在极狐GitLab 私有化部署实例上,地址为 https://jh-jhma.gitlab.cn/cicd-component。

 Runner,CI/CD 高效构建的利器

Runner 是极狐GitLab CI 的一个重要组件,它能够帮助运行 CI/CD 流水线中所定义的 Job。当研发人员提交代码变更后,极狐GitLab 就会“通知” Runner 去按照 .gitlab-ci.yml 定义的流水线步骤完成变更代码的构建、测试、部署等,此过程中 Runner 会根据所选择的 executor(比如针对 PowerShell 的 shell、针对容器的 docker 等)来针对不同环境进行 Job 的运行。关于 executor 的选择可以参考极狐GitLab 执行器官网。

图片

Runner 像是一个“agent”,接受“server”端(极狐GitLab 实例)的请求,因此为了满足不同场景的需求,Runner 要能够满足在不同 OS、不同 CPU 架构上以不同的安装方式来运行。

专有 + 共享,更多灵活选择

Runner 分为专有和共享两大类:

  • 专有:指 Runner 只给指定的项目用,通常是使用项目的一些信息( Runner register token)来将 Runner 注册到对应的项目下面;

  • 共享:指 Runner 是针对整个极狐GitLab 实例的,意味着整个实例下面的所有项目都可以使用这些 Runner,至于如何用、谁先用、谁后用是由极狐GitLab 的内部调度机制来实现的。

专有 Runner 的最大优势在于:

  • 节省时间:专有 Runner 只给对应的项目运行 CI/CD 流水线,因此不用排队去等待共享 Runner 来执行 CI/CD 流水线,且随着项目、流水线的增加,排队将耗费大量时间;

  • 自主可控:专有 Runner 是用户自己安装在自己可控的服务器上,在使用过程中如果要对流水线过程进行 Debug 或者对 Runner 配置进行修改,甚至想获取某些运行过程中的数据,则可以直接登陆到对应的 Runner 中进行操作。

图片

专有 Runner 的配置信息

共享 Runner 的好处也是显而易见的:用户无需了解 Runner 的过多信息,也无需自己安装运维等。是一种比较省事的方式。

因此,用户可以根据自身的需求,来选择不同方式的 Runner 来完成相应的 CI/CD 流水线运行。

图片

动态扩缩容,提高资源使用率

Runner 可以和云资源动态伸缩的特性紧密绑定,实现 Runner 的动态伸缩:当有 CI/CD 流水线需要运行的时候,Runner 使用一些资源(CPU、内存等)来执行所有 Job,当 CI/CD 流水线运行结束(成功或失败)后,对应的资源被释放,对环境进行恢复。

比如说,可以使用容器来运行 Runner,最典型的就是使用 Kubernetes 来运行极狐GitLab Runner。

图片

当执行 CI/CD 时,Kubernetes 会动态创建一个 pod,pod 会根据 .gitlab-ci.yml 文件中描述的 stage 以及对应的镜像来生成相应的容器(所有容器在一个 pod 内,共享 pod 内部资源),流水线的运行都在容器内部,当流水线运行结束,pod 会删除,运行过程中的数据、所需的资源会被释放。

此外,还可以使用云厂商提供的 serverless 产品实现 Runner 的动态扩所容,提高资源的使用率。

合规流水线,助力流水线的安全合规使用

流水线使用过程中还会遇到一个场景:某一个流程是需要所有项目的流水线都必须运行的,比如在镜像构建结束必须进行镜像安全扫描,如果有安全漏洞就需要终止流水线的运行。这种情况下的解决方案往往是针对所有项目在流水线中使用 include 加入容器镜像扫描环节,但是随着项目数量的增多(成百乃至上千),这意味着巨大的重复工作量,而且无法确保操作的精准度。

而正确的解决方案就是:合规流水线。

合规流水线是极狐GitLab CI/CD 流水线内置的一个安全功能,主要是确保群组内的所有项目都能够运行指定的合规作业。通过在群组级别配置好合规框架,选择好每个项目都必须运行的合规流水线作业,则此群组下面的所有项目都会运行此合规作业,甚至后续在该群组下新创建的项目也会默认执行此合规作业。

图片

合规流水线的使用,首先需要在群组级别进行合规框架的配置。在群组 → 设置 → 通用 → 合规框架中,选择新建合规框架,然后填入合规框架名称、描述、合规流水线配置(也就是合规流水线所存储的位置),最后选择一个背景颜色即可。

图片

如将此合规框架设置为群组的默认合规框架,则此群组下面新建的项目都会默认使用此合规框架,默认运行此合规流水线,而且在项目页面会有合规框架的标签生成。

图片

接着需要将合规流水线写入到此群组下面的一个项目(比如 Compliance-Pipeline)中。以容器镜像构建和扫描流水线为例,在 .gitlab-ci.yml 文件中写入如下内容:

include: 
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build.gitlab-ci.yml'
  - template: Security/Container-Scanning.gitlab-ci.yml

后续所有的新建项目都会执行容器镜像构建和容器镜像扫描这两个作业,而不是项目自带的流水线。

如果想要项目自带的流水线也被执行,只需要将合规流水线的内容和项目自带流水线的内容进行合并即可。比如自带流水线需要使用 cosgin 对打包的容器镜像进行签名和验证,防止镜像被篡改:

stages:
  - singature
  - verfication

image-singature:
  stage: singature
  tags:
    - cosign
  image: 
    name: dllhb/cosign:1.0.0
    entrypoint: [""]
  before_script:
    - mkdir ~/.docker
    - cat "$DOCKER_CRED_FILE" > ~/.docker/config.json
    - cat "$COSIGN_KEY" > /tmp/cosign.key
    - export COSIGN_PASSWORD="$COSIGN_PASSWORD"
  script:
    - cosign sign --key /tmp/cosign.key $CI_REGISTRY_IMAGE:1.0.0

image-verfication:
  stage: verfication
  tags:
    - cosign
  image: 
    name: dllhb/cosign:1.0.0
    entrypoint: [""]
  before_script:
    - cat "$COSIGN_PUB" > /tmp/cosign.pub
    - export COSIGN_PASSWORD="$COSIGN_PASSWORD"
  script:
    - cosign verify --key /tmp/cosign.pub $CI_REGISTRY_IMAGE:1.0.0

需要将上述流水线引入到合规流水线当中:

include:
  - project: 'Compliance-Pipeline-Group/regular-pipeline'
    file: '.gitlab-ci.yml'

最终该群组下的其他项目的流水线都会执行容器镜像的打包、扫描、签名及验证这四个步骤。

因此合规框架的选择,是为了标记某些项目必须满足某些合规要求或者需要额外的监督,然后通过执行合规流水线来完成合规工作的完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEEE权威杂志特别报道一款国内大语言模型,不是百度、不是阿里、不是华为……

现如今,大模型早已成为街谈巷议的 AI 话题,ChatGPT 更火出了圈。NLP、CV 和多模态领域的大模型层出不穷,并朝着通用方向不断演进,让人们看到了 AGI 的希望。 在大模型时代,除了继续升级预训练、微调等技术和算法之外&a…

Python 基础教程,Python 是什么?

Python 的诞生是极具戏曲性的,据 Guido 自述记载,Python 语言是在圣诞节期间为了打发无聊的时间而开发的,之所以会选择 Python 作为该编程语言的名字,是因为 Guido 是 Monty Python 戏剧团的忠实粉丝。 Python 语言是在 ABC 语言的…

uniapp封装组件,选中后右上角显示对号√样式(通过css实现)

效果&#xff1a; 一、组件封装 1、在项目根目录下创建components文件夹&#xff0c;自定义组件名称&#xff0c;我定义的是xc-button 2、封装组件代码 <template><view class"handle-btn"><view :class"handleIdCode 1 ? select : unSelec…

RL 实践(7)—— CartPole【TPRO PPO】

本文介绍 PPO 这个 online RL 的经典算法&#xff0c;并在 CartPole-V0 上进行测试。由于 PPO 是源自 TPRO 的&#xff0c;因此也会在原理部分介绍 TPRO参考&#xff1a;张伟楠《动手学强化学习》、王树森《深度强化学习》完整代码下载&#xff1a;8_[Gym] CartPole-V0 (PPO) 文…

超过2个G的视频怎么发给朋友?快来学视频压缩

影响视频体积大小的主要因素无非就是比特率、码率、格式以及视频时长等&#xff0c;当我们的视频文件过大无法通过平台或者软件发送给朋友的时候&#xff0c;就可以借助压缩的方法解决问题&#xff0c;下面就给大家分享几个压缩技巧&#xff0c;一起来看看吧。 方法一&#xff…

LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表

一.48. 旋转图像 题目要求&#xff1a;就是一个顺时针的旋转过程。 思路&#xff1a;观察矩阵&#xff0c;得出翻转前第i行的第J个元素 等于 翻转后倒数第i列的第J个元素&#xff0c;举例说明&#xff0c;第1行第2个元素为“2”&#xff0c;翻转后到了 倒数第1列的第2个元素…

AIGC|AGI究竟是什么?为什么大家都在争先入场?

一、AI大语言模型进入爆发阶段 2022年12月ChatGPT突然爆火&#xff0c;原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式&#xff0c;但是它的内容化水平非常强大&#xff0c;甚至在某些方面已经超过人类了&#…

多主题自适应知识变现博客论坛,支持docker一键部署

iblog 给大家推荐一个多主题自适应&#xff0c;支持付费收款的博客论坛系统&#xff0c;支持docker一键部署&#xff0c;支持企业微信通知。 前端 多主题 自适应 个人页 后端 H2 console 运行命令 docker run -d --name iblog --restartalways -p 8080:8080 -e consoletrue …

易服客工作室:Pixwell主题 – 现代杂志/WordPress新闻主题

PixWell主题概述 Pixwell主题是一个强大、多用途和现代的WordPress杂志主题&#xff0c;具有像素完美的设计、出色的功能、完全响应和移动友好。它非常灵活&#xff0c;非常适合食谱、时尚、旅行、技术、个人或任何其他很棒的杂志和博客网站。 该主题与 Elementor、Cooked&am…

SAP MM学习笔记22- 购买发注的项目种类(明细Category)

SAP中控制购买流程的是购买发注页面中购买发注明细行的项目种类&#xff08;明细Category&#xff09;栏目。 ・项目种类&#xff08;明细Category&#xff09;有&#xff1a; 1&#xff0c; 标准 2&#xff0c;K 受托品 3&#xff0c;L 外注 4&#xff0c;S 仕入先直送…

Linux系统中基于NGINX的代理缓存配置指南

作为一名专业的爬虫程序员&#xff0c;你一定知道代理缓存在加速网站响应速度方面的重要性。而使用NGINX作为代理缓存服务器&#xff0c;能够极大地提高性能和效率。本文将为你分享Linux系统中基于NGINX的代理缓存配置指南&#xff0c;提供实用的解决方案&#xff0c;助你解决在…

Blender增强现实3D模型制作指南【AR】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 将静态和动画 3D 内容集成到移动增强现实 (AR) 体验中是增强用户沉浸感和参与度的高效方法。 然而&#xff0c;为 AR 创建 3D 对象可能相当艰巨&#xff0c;尤其是对于那些缺乏 3D 建模经验的人来说。 与添加视频或照片 AR…

智慧工地源码,PC+APP源码,项目管理端+企业监管端+数据大屏端

智慧工地概念 智慧工地是一种崭新的工程全生命周期管理理念&#xff0c;是指运用信息化手段&#xff0c;通过对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟…

python3 0基础学习笔记

0基础学习笔记&#xff0c;临时有事暂停后边会继续学习 基础内容1. 条件语句 if - elif - else2. 错误铺捉try - except(一种保险策略&#xff09;3. 四种开发模式4. 函数&#xff1a;def用来定义函数的5. 最大值最小值函数&#xff0c;max &#xff0c;min6. is 严格的相等&am…

神经网络基础-神经网络补充概念-02-逻辑回归

概念 逻辑回归是一种用于二分分类问题的统计学习方法&#xff0c;尽管名字中带有"回归"一词&#xff0c;但实际上它用于分类任务。逻辑回归的目标是根据输入特征来预测数据点属于某个类别的概率&#xff0c;然后将概率映射到一个离散的类别标签。 逻辑回归模型的核…

echarts绘制仪表盘

代码展示&#xff1a; /**绘制仪表盘图表 */function drawInstrument(id) {setTimeout(()> {var chart echarts.init(document.getElementById(id)); var option {series: [{name: 风险指数,type: gauge,center: [50%, 60%],radius: 90%,min: chartData.min,max: chartDat…

捷码低代码+智慧水务:降本增效,灵活应变

数字经济正在强势崛起&#xff0c;已成为未来经济发展的主要动力。如何通过数字化转型获得最大收益&#xff0c;成为当下各行业最关心的问题。水务行业&#xff0c;作为我国的传统行业&#xff0c;也迎来数字化转型的快速发展期。如何利用新技术&#xff0c;实现以创新为核心的…

Android splash.img的制作

在device\qcom\common\display\logo下找到logo_gen.py如果没有安装Python&#xff0c;先执行以下命令 sudo apt-get install python-imaging将需要制作logo的图片拷贝到logo_gen.py的同级目录 需要注意的是图片分辨率应该与设备屏分辨率一致运行如下命令生成splash.img,执行 py…

相约天津!全国智能汽车竞赛百度创意组总决赛通知

“全国大学生智能汽车竞赛”是教育部倡导的大学生科技A类竞赛&#xff0c;中国高等教育学会将其列为含金量最高的大学生竞赛之一&#xff0c;为《全国普通高校大学生竞赛排行榜》榜单内赛事。 飞桨共承办了百度完全模型组和百度智慧交通组两大赛道。下文为百度智慧交通组具体安…

NeMo 声纹识别VPR-实战

声纹识别(VPR) ,生物识别技术的一种,也称为说话人识别 ,是从说话人发出的语音信号中提取声纹信息,从应用上看,可分为: 说话人辨认(Speaker Identification):用以判断某段语音是若干人中的哪一个所说的,是“多选一”问题;说话人确认(Speaker Verification):用以确认某…