Docker部署TeamCity来完成内部CI、CD流程

使用TeamCity来完成内部CI、CD流程 

640?wx_fmt=jpeg

本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置。至于完整的DevOps,我们后续独立探讨。

一个简单的CI、CD流程

以下分享一个简单的CI、CD流程(仅供参考):

640?wx_fmt=png

 注意

本流程需要使用git进行代码版本管理,推荐使用TFS搭建自己的代码版本库。自动部署推荐使用腾讯云镜像触发器实现,此步骤也可以使用脚本实现,如果是普通的.NET代码,推荐编写webdeploy命令脚本来完成自动部署。通知推荐大家使用钉钉机器人。

关于TeamCity

TeamCity是一款成熟的CI服务器,来自JetBrains公司。JetBrains已经在软件开发世界中建立了权威,他们的工具如WebStorm和ReSharper正被全球的开发者所使用。

TeamCity在它的免费版本中提供了所有功能,但仅限于20个配置和3个构建代理。额外的构建代理和构建配置需要购买,你可以在这里找到价格。

TeamCity安装后即可使用,可以在多种不同的平台上工作,并支持各种各样的工具和框架。 能够支持JetBrains和第三方公司开发的公开的插件。尽管是基于Java的解决方案,TeamCity在众多的持续集成工具中提供了最好的.NET支持。TeamCity也有多种企业软件包,可以按所需代理的数量进行扩展。

TeamCity分为专业版和企业版,专业版免费,支持100个构建配置,允许完全访问产品的所有功能,足够小团队小公司来完成自己的CI流程的构建了。

640?wx_fmt=png

下载地址:

https://www.jetbrains.com/teamcity/download/#section=section-get

TeamCity可以通过执行文件安装,也可以在Docker容器中运行。本篇教程主要讲解通过腾讯云容器服务(TKV)来搭建和托管TeamCity环境。

640?wx_fmt=png

 官方镜像 

官方镜像地址:
https://hub.docker.com/r/jetbrains/teamcity-server

如果小伙伴们需要在本地测试,也可以使用以下命令在本地运行:

docker run -it --name teamcity-server-instance  \

    -v <path to data directory>:/data/teamcity_server/datadir \

    -v <path to logs directory>:/opt/teamcity/logs  \

    -p <port on host>:8111 \

jetbrains/teamcity-server

此命令需要映射对应的数据目录和日志目录以及端口。镜像名称为jetbrains/teamcity-server。

在本地运行,我们主要用于学习和测试,接下来我们还是回到主题,继续搭建线上的TeamCity服务。

使用腾讯云容器服务(TKE)搭建和托管TeamCity  

创建TeamCity Server容器服务

在TKE创建服务的部分细节在之前的教程中我们讲述过,这里主要讲解一些主要的点。由于TeamCity这边需要使用到数据卷做持久化,那么在TKE中,我们如果实现容器服务的持久化呢?

腾讯云容器服务是基于 Kubernetes 编排系统搭建的,创建服务时可以设置以下类型的数据卷:

· 本地硬盘:将容器所在宿主机的文件目录挂载到容器的指定路径中(对应Kubernetes的HostPath), 也可以不填写源路径(对应Kubernetes的EmptyDir),不填写时将分配主机的临时目录挂载到容器的挂载点,指定源路径的本地硬盘数据卷适用于将数据持久化存储到容器所在宿主机,EmptyDir适用于容器的临时存储。

· 云硬盘:腾讯云基于CBS扩展的Kubernetes的块存储插件。可以指定一块腾讯云的 CBS 云硬盘挂载到容器的某一路径下,容器的迁移,云硬盘会跟随迁移,使用云硬盘数据卷适用于数据的持久化保存,可用于Mysql等有状态服务,设置云硬盘数据卷的服务,实例数量最大为 1。

· NFS盘:可以使用腾讯云的文件存储CFS, 也可使用自建的文件存储NFS, 只需要填写NFS路径,使用NFS数据卷适用于多读多写的持久化存储,适用于大数据分析、媒体处理、内容管理等场景。

· 配置项:将配置项中指定 key 映射到容器中(key作为文件名),使用配置项数据卷主要用于业务配置文件的挂载,可以用于挂载配置文件到指定容器目录。

使用数据卷时有以下注意事项:

1.创建数据卷后需要设置容器的挂载点。

2.同一个服务下数据卷的名称和容器设置的挂载点不能重复。

3.本地硬盘数据卷源路径为空时,系统分配临时目录在

/var/lib/kubelet/pods/pod_name/volumes/kubernetes.io~empty-dir. 

使用临时的数据卷的生命周期与实例的生命周期保持一致。

4.数据卷挂载需要设置权限,默认设置为读写权限。

了解了这些,接下来的实践我们使用本地硬盘和云硬盘来实现我们云端的数据持久化。

创建TeamCity Server容器服务主要分为以下几个步骤:

1. 创建服务,设置镜像

镜像名称为:jetbrains/teamcity-server,如下图所示(注意是直接输入):

640?wx_fmt=png

2. 配置数据卷。

数据卷我们这里选择云硬盘,其中“vol”为硬盘命名:

640?wx_fmt=png

这里我们需要在云硬盘控制台添加好相应的云硬盘:

640?wx_fmt=png

3. 添加挂载点,以保存数据和日志内容,如下图所示:

640?wx_fmt=png

其中“vol”为刚创建的数据卷名称,中间部分为容器内的路径,右侧部分为设置该路径的权限。

4. 配置端口映射

TeamCity Server的默认端口为8111,我们可以这么来配置:

640?wx_fmt=png

如果我们需要将8111映射为80端口,我们可以这么配置:

640?wx_fmt=png

5. 点击【创建服务】按钮,创建服务

创建完成后,可以在服务列表看到我们所创建的服务:

640?wx_fmt=png

注意

至此,TeamCity Server服务创建完成。刚才我们在服务访问方式中选择了【提供公网访问】,TKV自动为我们创建了一个负载均衡实例,以提供外网访问。这时,我们使用IP即可访问对应的服务。

如刚创建的:

640?wx_fmt=png

创建Teamcity Agent代理服务

Server创建好了,我们还需要创建TeamCity Build Agent来为我们构建代码。也就是构建过程还得由专门的构建代理来提供服务。

TeamCity Build Agent官方镜像地址如下:

https://hub.docker.com/r/jetbrains/teamcity-agent/

我们可以通过以下命令在本地跑起来:

docker run -it -e SERVER_URL="<url to TeamCity server>"  \

    -v <path to agent config folder>:/data/teamcity_agent/conf  \      

jetbrains/teamcity-agent

跑起来之后,我们需要在Server的管理中心来连接和授权。

配置特权级容器

值得注意的是,如果我们使用TeamCity的代理来构建Docker容器,那么我们势必需要使用到主机的Docker守护进程,这时,我们可以使用特权级容器来解决这个问题,如下面命令所示:

docker run -it -e SERVER_URL="<url to TeamCity server>"  \

    -v <path to agent config folder>:/data/teamcity_agent/conf \

    -v docker_volumes:/var/lib/docker \

    --privileged -e DOCKER_IN_DOCKER=start \    

    jetbrains/teamcity-agent

使用privileged参数,容器内的root才拥有真正的root权限,并且Docker将允许访问主机上的所有设备,甚至允许我们在容器中启动Docker容器。接下来在腾讯云TKV这边,我们也需要使用到特权级容器,以便于我们使用TeamCity来构建Docker容器镜像,以及推送镜像。

TeamCity Agent基础镜像包括

由于在接下来的步骤中需要使用到Agent来构建代码,因此我们需要知道其包含的内容:

· ubuntu:bionic(Linux)

· microsoft / windowsservercore或microsoft / nanoserver(Windows)

· AdoptOpenJDK 8,JDK 64位

· git

· mercurial(除了nanoserver镜像)

· .NET Core SDK(可以构建.NET Core!!)

· MSBuild工具(基于windowsservercore的镜像)

· docker-engine(Linux)

创建Teamcity Agent代理服务

创建TeamCity Agent容器服务主要分为以下几个步骤:

1. 创建服务,设置镜像

镜像名称为:jetbrains/teamcity-agent,如下图所示(注意是直接输入):

640?wx_fmt=png

2. 配置数据卷。

数据卷我们这里选择使用本地硬盘,主要是为了讲解数据卷的不同类型:

640?wx_fmt=png

使用本地硬盘有两种形式:

· 指定源路径(HostPath),将容器所在宿主机的文件目录挂载到容器指定的挂载点中,如容器需要访问/etc/hosts则可以使用HostPath映射/etc/hosts等场景。

· 空的源路径(EmptyDir),用于容器的数据的临时存储,如基于磁盘的排序场景等。

也就是我们留空也可以。

3. 添加挂载点,以保存数据,如下图所示:

640?wx_fmt=jpeg

其中“vol”、“dockervol”为刚创建的数据卷名称,中间部分为容器内的路径,右侧部分为设置该路径的权限。

4. 配置环境变量

如下图所示,我们还需配置以下环境变量:

640?wx_fmt=png

AGENT_NAME

代理实例名称(授权时会显示)

SERVER_URL

服务端UI

DOCKER_IN_DOCKER

Docker内部启动Docker

5. 配置特权级容器

此选项在TKV容器服务的高级设置中,如图所示:

640?wx_fmt=png

6. 配置端口映射

640?wx_fmt=png

这里我们无需提供公网访问,因此选择【仅在集群内访问】即可。端口映射这块,Agent的默认端口为9090。

7. 点击【创建服务】按钮,创建服务

创建完成后,可以在服务列表看到我们所创建的服务:

640?wx_fmt=png

连接和配置Agent 

Server和Agent配置完成后,我们可以访问Server站点,完成初始化工作。然后,我们需要配置好Agent。

打开Agents界面,可以看到我们刚创建的Agent:

640?wx_fmt=png

这时,我们需要先进行授权,也就是打开【Unauthorized】面板,点击【Authorize】按钮:

640?wx_fmt=png

授权成功后,我们就可以看见已连接的代理了:

640?wx_fmt=png

接下来,才可以开始搞事情。

创建项目以及配置CI  

项目创建界面如下所示:

640?wx_fmt=png

推荐大家使用git来管理自己的代码。这里我们可以添加我们的代码仓库地址,如果是私有库,还需要配置账号密码。简单步骤我们这里略过,然后接下来TeamCity会扫描源代码,来提供推荐的构建步骤: 

640?wx_fmt=png

这里我们可以勾选我们需要的步骤,或者自己来创建符合自己需要的步骤。

注意

使用Docker托管的Agent服务镜像并不支持PowellShell。如果选择了不支持的步骤,将无法使用刚才我们创建的Agent执行代码构建。

这里,我们可以添加几个简单的步骤:

640?wx_fmt=png

步骤1、2使用Docker构建Docker镜像,相关参考界面如下所示:

640?wx_fmt=png

步骤3则使用CMD命令发送钉钉消息,以通知团队:

640?wx_fmt=png

通知结果如下图所示:

640?wx_fmt=png

接下来,我们就可以配置触发器、失败条件判断以及参数等其他配置。整个构建步骤配置起来非常简单,大家也可以结合我之前的CI教程来完善配置,比如添加对镜像推送的步骤等。

完成之后,我们就可以尝试着运行构建,并且查看构建历史:

640?wx_fmt=png

整个构建详情我们也可以直接查看:

640?wx_fmt=png

包括构建日志:

640?wx_fmt=png

在这个过程中,可能大家需要用到一些构建参数、环境变量等等,我们可以打开对应agent的Agent Parameters面板来查看详情:

640?wx_fmt=png

 devops实践: teamcity实现持续集成

teamcity的架构:

docker的方式安装快速

安装server端

mkdir -p /data/teamcity_server/datadir  /data/teamcity/logs

docker run -it --name teamcity-server \
-v /data/teamcity_server/datadir:/data/teamcity_server/datadir \
-v /data/teamcity_server/logs:/opt/teamcity/logs \
-p 8111:8111 \
jetbrains/teamcity-server:EAP

然后得到访问的url,后面安装客户端的时候需要用到。

比如这里是: http://172.31.12.168:8111
数据库选择选用默认的hsqldb,这里只要挂载的目录不丢,重新安装之后数据也是存在的;

安装client端

mkdir -p /data/teamcity_agent/conf
chmod -R 777 /data/teamcity_agent/conf

docker run -it -e SERVER_URL="http://172.31.12.168:8111"  \
    -v /data/teamcity_agent/conf:/data/teamcity_agent/conf  \
    jetbrains/teamcity-agent:EAP

可以安装多个;

但是专业版本的限定了3个,所以为了后期的遍历,最多不超过3个客户端吧!

安装完毕之后需要在server端对agent进行授权才能使用。


直接备注即可加入到客户端池。


然后即可加入到服务端的客户端池子。构建的任务的执行即可按照并行度为3进行执行。

也可以物理化部署,不会有docker内核的问题。

这个位置可以下载物理版本的客户端安装包。结合文档修改配置参数即可;

主要修改的是服务端server的地址和客户端的应用名称;
位置:/data/team_agent4/conf/buildAgent.properties


启动指令: ./bin/agent.sh start

然后在服务端授权即可使用。

使用初体验

一个后端工程的CI和CD过程:
下面是实践过程:


创建工程


然后贴入你的 gitlab或者github仓库地址;

填写一个有只读权限的账号和密码。

配置CICD构成脚本

1 、后端打jar包

2 、打后端docker镜像

3 、前端npm打包

4 、前端镜像制作

5 、推送前端和后端镜像到镜像仓库

6、 发布到k8s环境

7 、发动钉钉通知到项目群


整体的kotlin代码

package _Self.buildTypes

import jetbrains.buildServer.configs.kotlin.v2019_2.*
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.MavenBuildStep
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.dockerCommand
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.maven
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.nodeJS
import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script
import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs

object Build : BuildType({
    name = "appBuild"
    description = "构建"

    allowExternalStatus = true
    artifactRules = "app-tp/start/target/app-tp.jar => app-tp.jar"
    publishArtifacts = PublishMode.SUCCESSFUL

    vcs {
        root(HttpGitlabH3yunComHermesSystemAppTpGitRefsHeadsMaster)

        showDependenciesChanges = true
    }

    steps {
        maven {
            name = "打jar包"
            goals = "clean install -Dmaven.test.skip=true -U"
            pomLocation = "app-tp/pom.xml"
            runnerArgs = "-Dmaven.test.failure.ignore=true"
            workingDir = "app-tp"
            userSettingsSelection = "我的nexus配置"
            localRepoScope = MavenBuildStep.RepositoryScope.MAVEN_DEFAULT
            isIncremental = true
            jdkHome = "%env.JDK_18%"
            dockerImagePlatform = MavenBuildStep.ImagePlatform.Linux
            dockerPull = true
        }
        dockerCommand {
            name = "制作后端docker镜像"
            commandType = build {
                source = file {
                    path = "app-tp/app.Dockerfile"
                }
                namesAndTags = "registry.cn-shenzhen.aliyuncs.com/cloudpivot/app-tp:tptest"
                commandArgs = "--pull"
            }
        }
        nodeJS {
            name = "前端npm打包"
            shellScript = """
                cd front-tp
                npm install
                npm run build
            """.trimIndent()
            dockerPull = true
        }
        dockerCommand {
            name = "制作前端docker镜像"
            commandType = build {
                source = file {
                    path = "front-tp/front.Dockerfile"
                }
                namesAndTags = "registry.cn-shenzhen.aliyuncs.com/cloudpivot/front-tp:tptest"
                commandArgs = "--pull"
            }
        }
        script {
            name = "登录推送到远程镜像仓库"
            scriptContent = """
                docker login -u="aaaa" -p xxxxyun registry.cn-shenzhen.aliyuncs.com

                echo "推送到远程仓库"
                docker push registry.cn-shenzhen.aliyuncs.com/cloudpivot/app-tp:tptest
                docker push registry.cn-shenzhen.aliyuncs.com/cloudpivot/front-tp:tptest

                echo "删除本地镜像===节约磁盘空间===="
                docker images | grep app-tp | awk '{print ${'$'}3 }' | xargs docker rmi
                docker images | grep front-tp | awk '{print ${'$'}3 }' | xargs docker rmi
            """.trimIndent()
        }
        script {
            name = "更新k8s环境"
            scriptContent = """
                cd %system.teamcity.build.checkoutDir%
                cd deploy
                sh app_tp_deploy.sh
                sh front_tp_deploy.sh
            """.trimIndent()
        }
        script {
            name = "推送钉钉通知到项目群"
            scriptContent = """
                url='https://oapi.dingtalk.com/robot/send?access_token=b0dc2aee487a842dd5648566ade86xxxxxxx'
                programe=技术管理平台
                server=tptest.cloudpivot.cn
                content=%teamcity.build.branch%
                buildInfo=%vcsroot.useAlternates%

                function sendDingtalk(){
                    curl ${'$'}{1} \
                       -H 'Content-Type: application/json' \
                       -d "
                      {\"msgtype\": \"text\", 
                        \"text\": {
                            \"content\": \"消息内容:项目-${'$'}{2},域名-${'$'}{3},分支-${'$'}{4} 更新内容-${'$'}{5}\"
                         },
                         \"isAtAll\": true, 
                      }"
                }

                sendDingtalk ${'$'}{url} ${'$'}{programe} ${'$'}{server} ${'$'}{content} ${'$'}{content} ${'$'}{buildInfo}
            """.trimIndent()
        }
    }

    triggers {
        vcs {
            branchFilter = "+:refs/heads/test"
        }
    }
})

小结

teamcity专业版本限制3个执行客户端,100个构建配置,适合小型团队;


用户体验比较好,界面比较好看。

自动检测代码变化,进行构建;(可以大大提高CI效率)


比如推送了一个修改到某个分支,直接就发布到了集成测试环境了。


pk

(开发完毕一个功能,然后合并到集成测试分支,再到CICD系统点发布,碰到问题再惊起一滩鸥鹭)

更优雅。

钉钉消息通知

拉一个钉钉群,增加一个机器人:

完整之后,即可拿到通知token:

https://oapi.dingtalk.com/robot/send?access_token=c30f5008258474da14e65d3141536953b79df3bf3ab64f33a583e83165b19665

准备的shell脚本:

url='https://oapi.dingtalk.com/robot/send?access_token=c30f5008258474da14e65d3141536953b79df3bf3ab64f33a583e83165b19665'
programe=技术管理平台
server=tptest.cloudpivot.cn
content='程序中断'

function sendDingtalk(){
    curl ${1} \
       -H 'Content-Type: application/json' \
       -d "
      {\"msgtype\": \"text\", 
        \"text\": {
            \"content\": \"消息内容:项目-${2},服务地址-${3},更新内容-${4}\"
         },
         \"isAtAll\": true, 
      }"
}

sendDingtalk ${url} ${programe} ${server} ${content}

实际例子:

url='https://oapi.dingtalk.com/robot/send?access_token=b0dc2aee487a842dd5648566ade86e2217dac868c0ffdcab5138cb7eab163978'
programe=技术管理平台
server=tptest.cloudpivot.cn
content=%teamcity.build.branch%
buildInfo=%vcsroot.useAlternates%

function sendDingtalk(){
    curl ${1} \
       -H 'Content-Type: application/json' \
       -d "
      {\"msgtype\": \"text\", 
        \"text\": {
            \"content\": \"消息内容:项目-${2},域名-${3},分支-${4} 更新内容-${5}\"
         },
         \"isAtAll\": true, 
      }"
}

sendDingtalk ${url} ${programe} ${server} ${content} ${content} ${buildInfo}

通知效果截图:

材料

使用手册: (必看英文材料)

https://www.jetbrains.com/help/teamcity/2021.1/configure-and-run-your-first-build.html

teamcity之旅 (必看中文材料)
https://developer.aliyun.com/article/738443

腾讯云搭建teamcity过程:(特权容器解决docker agent无法打镜像的问题)
https://blog.csdn.net/sD7O95O/article/details/88264986

钉钉机器人通知文档:
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

程序启动之后通过shell通知到钉钉群:
https://blog.csdn.net/weixin_37836950/article/details/107924910

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AJAX-原理XMLHttpRequest

定义 使用 查询参数 定义&#xff1a;浏览器提供给服务器的额外信息&#xff0c;让服务器返回浏览器想要的数据 语法&#xff1a;http://xxxx.com/xxx/xxx?参数名1值1&参数名2值2

yocto编译测试

源码下载 git clone -b gatesgarth git://git.yoctoproject.org/poky lkmaolkmao-virtual-machine:~/yocto$ git clone -b gatesgarth git://git.yoctoproject.org/poky Cloning into poky... remote: Enumerating objects: 640690, done. remote: Counting objects: 100% (13…

部署Zabbix Agents添加使能监测服务器_Windows平台_MSI/Archive模式

Windows平台 一、从MSI安装Windows代理,添加Windows Servers/PC 概述 可以从Windows MSI安装包(32位或64位) 安装Zabbix agent 32位包不能安装在64位Windows中 所有软件包都支持TLS,配置TLS可选 支持UI和命令行的安装。 1、下载Agent代理程序,使用Agent2升级版,官网链接如…

计算机视觉之三维重建(1)---摄像机几何

文章目录 一、针孔模型和透镜1.1 针孔摄像机1.2 近轴折射模型1.3 透镜问题 二、摄像机几何2.1 像平面和像素平面2.2 齐次坐标下的投影变换2.3 摄像机倾斜2.4 规范化摄像机2.5 世界坐标系2.6 Faugeras定理2.7 投影变换性质&#xff1a; 三、其他投影摄像机模型3.1 弱透视投影摄像…

MacOS本地使用Docker Desktop 搭建Minio容器

1. 下载docker Desktop docker官网&#xff1a;https://www.docker.com/products/docker-desktop/ 根据自己的型号进行选择&#xff0c;我的M系列芯片&#xff0c;选择的是Apple-Chip&#xff0c;记得需要看到最后噢&#xff01; 最后有坑点解决办法&#xff01; 最后有坑点解…

Zinx框架的高级用法

一、使用框架提供的实用类 zinx框架已经提供了常用的IO通道类-TCP。 阅读Tcp相关类的使用文档&#xff0c;将之前的3个案例用TCP的方式实现。 步骤&#xff1a; 创建Tcp数据通道类继承ZinxTcpData&#xff0c;重写GetInputNextStage函数&#xff0c;内容跟之前标准输入通道类…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Polygon)

多边形绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Polygon(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

python知识点总结(四)

这里写目录标题 1、Django 中的缓存是怎么用的&#xff1f;2、现有2元、3元、5元共三种面额的货币&#xff0c;如果需要找零99元&#xff0c;一共有多少种找零的方式?3、代码执行结果4、下面的代码执行结果为&#xff1a;5、说一下Python中变量的作用域。6、闭包7、python2与p…

STM32:定时器

TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时72/65536/65536 不仅具备基本的定时中断功能&…

Grid布局

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Flex布局和Grid布局</title><style&…

每周编辑精选|微软开源 Orca-Math 高质量数学数据集、清华大学研究团队发布条件去噪扩散模型 SPDiff...

Orca-Math 是微软研究院发布的数学推理模型&#xff0c;该模型展示了较小的专业模型在特定领域的价值&#xff0c;它们可以匹配甚至超越更大模型的性能。微软近期开源了用于训练 Orca-Math 的 Orca-Math-200K 数学单词问题数据集&#xff0c;现已在 hyper.ai 官网提供下载&…

深入学习NIO三大核心:缓冲区 Buffer、通道Channel、Selector选择器

缓冲区 Buffer 一、简单介绍 Buffer&#xff0c;顾名思义就是缓冲区的意思&#xff0c;它是NIO中数据交换的载体&#xff0c;实质上是一种承载数据的容器。在上一篇BIO文章中我们提到BIO的工作模式是使用流来进行数据交换&#xff0c;并且根据操作的不同&#xff0c;分为输入…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

《LeetCode热题100》笔记题解思路技巧优化_Part_5

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_5 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题图论&#x1f7e1;1. 岛屿数量&#x1f7e1;2. 腐烂的橘子…

量子计算+HPC!ORNL与Riverlane、Rigetti合作研发

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 1000字丨8分钟阅读 近日&#xff0c;英国量子计算初创公司Riverlane和美国量子计算公司Rigetti Computing宣布将参与由美国能源部橡树岭国家实验室&#xff08;OR…

day03vue学习

day03 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔仙首页 拆分模块-局部注册结构样式完善…

sheng的学习笔记-AI-残差网络-Residual Networks (ResNets)

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 非常非常深的神经网络&#xff0c;网络发生了退化&#xff08;degradation&#xff09;的现象&#xff1a;随着网络层数的增多&#xff0c;训练集loss逐渐下降&#xff0c;然后趋于饱和&#xff0c;当你再增加网络深度的话&am…

【C++初阶】第七站:string类的初识(万字详解、细节拉满)

前言&#xff1a; &#x1f4cd;本文知识点&#xff1a;string的初识 本专栏&#xff1a;C 目录 一、什么是STL 二、STL的六大组件 三、STL的缺陷 四、为什么学习string类&#xff1f; 五、标准库中的string类 1、string类(了解) 2、string类的常用接口说明&#xff08;…

最新Java面试题2【2024初级】

下载链接&#xff1a;博主已将以上这些面试题整理成了一个面试手册&#xff0c;是PDF版的 互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字…

如何通过ETL做数据转换

在数字化时代&#xff0c;数据被誉为新时代的石油&#xff0c;而数据的价值往往隐藏在海量数据背后的信息中。然而&#xff0c;海量的原始数据并不总是直接可用的&#xff0c;这就需要一种有效的工具来对数据进行提取、转换和加载&#xff08;ETL&#xff09;&#xff0c;从而将…
最新文章