GitHub + VSTS 开源代码双向同步

GitHub替代方案全解析:从GitLab到Gitee,构建稳定自主的开发工作流 在软件开发领域,代码托管与协作平台是支撑团队高效交付的核心基础设施。其核心原理是基于分布式版本控制系统(如Git)构建,通过仓库管理、分支模型和协作工具(如Pull Request)来协调多人开发。这类平台的技术价值在于保障代码安全、提升协作效率并实现开发流程自动化。随着团队对数据主权、访问稳定性及特定工作流集成的需求日益增长,单一平台依赖可能带来风险。因此,探索主流替代方案(如GitLab、Gitea、Bitbucket、Gitee等)成为构建健壮开发体系的关键。这些方案覆盖了从企业级一体化DevOps平 阅读详情

GitHub已经是全球开源代码的大本营了,通过以下统计你可以看到仅仅javascript在github就有超过32万个活动的repo。很多开发人员都会把自己的一部分代码分享到github上进行开源,一方面可以提高自己在编程领域的知名度,也可以吸引其他的开发人员帮助你一起改进,当然还可以认识更多的朋友,要不怎么说github其实是个交友网站呢。

github-code-stats

但是github上免费的repo只能是公开的,对于一些我们不希望完全开源的项目,就没有办法免费分享了,当然你可以付费升级到专业版,这样就可以托管私有repo了。

Visual Studio Team System是微软提供的免费的企业级软件开发Saas服务,提供免费的私有git repo服务。我周围的很多朋友都将自己或者公司的项目托管在VSTS上,其中也有一部分是开源的。

结合GitHub免费的公有repo和VSTS上免费的私有repo,我们可以搭建一套内外结合的开源代码开发平台,让我们可以控制哪些代码开源,同时接受社区对开源代码的贡献。常见场景主要有:

  • 将私有的repo的master分支与公有repo的master分支进行双向同步,支持主要发行版与社区的分享,接受PR。
  • 将私有repo的特定分支与公有repo的master分支进行双向同步,支持特定发行版与社区的分享,接受PR;在内部经过新一轮PR后并入私有master分支。
  • 支持私有发行版与公有发行版的差异化发布。
  • 支持自动和手动同步。

在VSTS上创建CI来完成同步配置

VSTS上的CI引擎内置对GitHub和VSTS本身自带的git的支持,借助这个功能我们可以很容易的建立同步机制。

1. 建立从VSTS到GitHub的同步作业

建立一个构建定义,使用Empty的模版,选择VSTS上的repo作为代码来源

build-def-from-vsts

在里面添加2个Command line的任务,分别配置成以下命令

Git pull https://github.com/ups216/vsalm-hols.git master
Git push https://$(githubtoken)@github.com/ups216/vsalm-hols.git head:master

build-def-vsts-cmd1

build-def-vsts-cmd2

你会注意到在第二个命令中我使用了一个叫做$(githubtoken)的参数。你可以通过GitHub生成这样一个Personal Access Token,并使用以下页面绑定到构建定义,这样在运行的时候用户是看不到这个token的具体内容的。

build-def-vsts-pat

注意图中箭头所指向的加锁标注,VSTS会采用加密的方式存储密钥,确保用户看不到具体内容。

2. 建立从GitHub到VSTS的同步作业

这里的配置过程相反,在第一步我们创建一个从GitHub上获取代码的构建定义

build-def-from-github

然后运行以下两个命令

Git pull https://$(vststoken)@almnetworks.visualstudio.com/DefaultCollection/_git/vsalm-hols master
Git push https://$(vststoken)@almnetworks.visualstudio.com/DefaultCollection/_git/vsalm-hols head:master

你会注意到这里在pull和push的命令上都用了$(vststoken)参数,这是因为我们所操作的vsts上的repo是一个私有的repo,读取和写入都需要认证。

建立好以上配置我们就可以测试这个双向同步过程了,以下是测试视频:

以上是最简单的针对master分支的双向同步配置,如果需要同步特定分支,我们只需要对git命令进行简单修改即可。

本文基于以下博客:
https://nkdagility.com/open-source-vsts-tfs-github-better-devops/


请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

​qrcode_for_gh_b7c158df1fd1_430

加入Microsoft Biology Foundation v2.0开发预览:参与开源生物信息学工具现代化重构 在生物信息学领域,高性能计算和可扩展的算法库是处理海量基因组、蛋白质组数据的基石。其核心原理在于通过优化的数据结构和并行计算模型,实现对FASTQ、BAM等复杂生物数据格式的高效解析与分析。这类基础工具的技术价值在于为研究人员和开发者提供了稳定、标准化的计算组件,能显著提升数据分析流水线的开发效率与运行性能。随着云计算和异构计算(如GPU加速)的普及,现代生物信息学工具正朝着云原生、模块化方向演进,以适应大规模队列研究和实时分析等应用场景。Microsoft Biology Foundation (MBF) 阅读详情

相关推荐

测试管理平台选型指南:从核心功能到落地实践的全方位评测

测试管理是软件质量保障体系的核心环节,它通过系统化方法对测试用例、缺陷和测试活动进行规划、执行与追踪。其核心原理在于构建一个数字化的质量中枢,将原本割裂的测试环节串联成可视、可控、可追溯的闭环。这一技术价值在于显著提升测试效率、加强团队协作,并为质量决策提供数据支撑。在敏捷开发和DevOps实践中,测试管理平台的应用场景尤为关键,它需要与需求管理、持续集成工具深度集成,实现端到端的质量反馈。本文聚焦于如何通过科学的评测维度,如核心功能完备性、集成生态开放性和团队协作体验,帮助团队选择最适合的测试管理平台,并

weixin_30882895的博客 428

推荐开源项目:SyncDreamer - 实时代码同步与协作工具

推荐开源项目:SyncDreamer - 实时代码同步与协作工具 SyncDreamer [Arxiv23] SyncDreamer: Generating Multiview-consistent Images from a Single-view Image ...

gitblog_00099的博客 1023

Azure DevOps编排多云MLOps:SageMaker与Azure协同实战

MLOps是将机器学习模型从实验走向生产的关键工程范式,其核心在于自动化、可审计与跨环境一致性。在多云架构日益普及的今天,如何实现AWS SageMaker与Azure DevOps的深度协同,成为金融、零售等强合规行业落地AI的核心挑战。本文聚焦MLOps流水线的跨云编排原理,解析以Azure DevOps为统一调度中枢的技术价值——既复用企业现有CI/CD成熟度,又满足GDPR、ISO 27001等审计要求;涵盖OIDC临时凭证安全集成、Custom Task原子化封装、蓝绿部署零停机保障等典型应用场景

weixin_30732487的博客 353

TFS(Taobao File System)团队CODE协作工具

TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,TFS由nameserver(NS)、dataserver(DS)、client三个部分组成,详细设计原理参考[丢失link] TFS适用场景 TFS提供海量文件的可靠存储,尤其适合海量小文件的存储;TFS没有传统文件系统的目录树结构,所有文件处于一个扁平化的名字空间;TFS不支持posix接口,必须通过TFS提供的客户端API(read/write/delete)来读、写、删文件。 TFS最大集群

qq_43476358的博客 2073

VSTS的安装与配置

一、VSTS的逻辑结构 二、VSTS的安装过程 Microsoft Virtual PC 2007 Microsoft Server2003 安装SQL Server2005 企业版 安装IIS6.0 。。。 超级复杂的哦 当初我们安装了好几次呢 最后从虚拟机裸机开始装

vsts的分支与合并!

这是我自己总结的有关vsts如何进行分支与合并,试验了很多次呢!

【52ABP实战教程】0.1-- Devops如何用VSTS持续集成到Github仓库!

工欲善其事,必先利其器。在开始正式的教程之前我们先来聊聊准备工作。 管理工具会VSTS。 代码管理会用GITHUB。 服务器会用Azure。 所有的东西都是利用现有服务。不会说自己从虚拟机开始玩。我们就专注于写代码。 什么是VSTS? VSTS的全称是Visual Studio Team Services...

weixin_33836223的博客 348

基因家族的鉴定-基于Windows系统上的HMMER

基因家族的鉴定-基于Windows系统上的HMMER。

liangjinghui123的博客 3241

#VSTS 日志# VSTS 所有功能,看这个页面就够了!

随着Connect();//2015大会的结束,一大波的好消息随之而来。今天小编刚刚发现了Visual Studio Team Services / Team Foundation Server 的完整版功能列表。 短地址链接:http://aka.ms/vsts-tfs-index 这个列表包括了在Visual Studio Team Services (在线版本)和 Team Found...

weixin_30532837的博客 220

利用 Openocd 和 FT2232H 实现 ARMv8(Coretex-A53)高效调试方案

本文详细介绍了如何利用开源工具OpenOCD与高性能USB转接芯片FT2232H,构建一套针对ARMv8架构(如Cortex-A53)的高效、低成本调试方案。内容涵盖从环境搭建、驱动配置、核心调试架构解析到实战问题排查的全过程,帮助开发者实现对多核处理器的透明、可控调试,是嵌入式Linux及底层开发的实用指南。

weixin_29163581的博客 279

光线追踪渲染实战:蒙特卡洛路径追踪及其c++实现

光线追踪超越了传统的图形流水线,是一种现代的渲染。光线追踪是一种基于物理的渲染方法,通过模拟光在介质中的真实表现来输出足以逼近现实的图像。光线从光源出发,经过各种反射折射,进入摄像机。通过渲染方程描述一点的颜色,并且通过蒙特卡洛方法求解渲染方程来获取最终的像素颜色。

AKGWSB 's blog 1万+

【52ABP实战教程】0.3-- 从github推送代码回vsts实现双向同步

需求 在之前的文章中“[DevOps]如何用VSTS持续集成到Github仓库” 我们有讲述如何将vsts中的代码编译推送到github中,这一篇我们来完善,如果有人给你开源项目推送了代码,你审核后,如何自动将代码推送回vsts,从而实现双同步。 准备工作 首先你要生成一个key,登录到你的vsts中。进入“Security”菜单栏。 点击Add,添加一个密钥。 注意:此处生成的密钥,请自行...

weixin_30263277的博客 132

STM32F103C8T6+HX711:手把手教你打造高精度智能体重秤(附完整代码)

本文详细介绍了如何使用STM32F103C8T6微控制器和HX711称重模块构建高精度智能体重秤,涵盖硬件选型、电路设计、软件开发到无线数据传输的全过程。通过完整的代码示例和校准方法,帮助开发者快速实现毕业设计或商业项目,打造具备物联网功能的智能健康设备。

h6i7j8的博客 1025

深港澳大湾区第三次.NET技术交流会圆满成功

2017年12月10日,一场以云、devops、微服务、容器是现在这个发展阶段的软件形态, 本次活动我们围绕这些话题介绍.NET生态下的发展本地社区活动,这次活动还得到如鹏网杨中科老师的大力支持开通网上直播,网上有229位参与活动,现场场地有限,也有40多位,中间有些同学走了,坚持到最后一起拍照只有20多位,这次活动还是在大湾区标志的深圳深圳湾科技生态园。 本次活动有3位讲师给大家带来SQL...

weixin_33936401的博客 116

解密m3u8视频合并:从猫抓插件到本地文件修改全流程

本文详细解析了m3u8视频合并的全流程,特别针对加密视频片段提供了解决方案。从使用猫抓插件捕获m3u8文件地址,到利用N_m3u8DL-CLI工具自动下载、解密并合并ts片段,手把手教你处理AES-128加密等常见问题,最终生成完整的本地MP4文件,适合需要备份或处理流媒体资源的用户。

weixin_29290947的博客 1358

【Unity 反向运动学插件】Final IK 一套完整的IK解决方案

Final IK是Unity中一套完整的反向运动学解决方案,提供多种IK算法(CCD、FABRIK等)和功能模块,包括全身IK、VR驱动、武器瞄准、视线跟随等。其核心是通过数学方法计算关节旋转,使末端骨骼精确到达目标位置。系统支持多约束求解、旋转限制、动画烘焙及交互系统,采用模块化设计,兼顾性能与扩展性,适用于动作游戏、VR等需要高质量角色控制的场景,是Unity生态中最成熟的IK工具链之一。

2403_88403568的博客 1002

2024年测试用例管理工具选型指南:从开源到商业的9款方案深度解析

测试用例管理是软件质量保障体系的核心环节,它通过系统化、结构化的方式组织测试活动,确保软件发布前的质量可控。其核心原理在于将离散的测试点、执行状态和缺陷信息进行集中管理与关联,实现需求、用例、缺陷间的双向可追溯性。这一实践的技术价值在于显著提升测试效率、降低沟通成本,并形成可复用的测试资产库,尤其适用于敏捷迭代、DevOps持续交付等现代研发场景。随着AI技术与DevOps实践的深度融合,现代测试管理工具正朝着智能化用例生成、无缝CI/CD集成等方向发展。本文聚焦于**测试用例管理工具**的选型,结合**团

weixin_30437847的博客 364

Unreal Engine Profiler:动画系统性能分析教程_2024-07-23_03-05-38.Tex

Unreal Engine Profiler 是一个内置的性能分析工具,它可以帮助开发者识别和解决游戏中的性能瓶颈。Profiler 提供了详细的性能数据,包括 CPU 使用率、GPU 负载、内存使用情况等,特别针对动画系统,可以查看动画蓝图的执行时间、骨骼动画的计算成本、以及动画混合和重定向的效率。通过这些数据,开发者可以定位到具体的问题,比如哪些动画状态消耗了过多的 CPU 时间,或者哪些动画资源导致了内存泄漏。

823

Asp.NET Core2.0 项目实战入门视频课程_完整版

END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了。52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不开各位的帮助和加油。 课程概述 52ABP大学例子程序演示如何使用Entity Framework(EF) C...

weixin_34191734的博客 1569

ESP32 智能垃圾分类助手:从硬件搭建到代码实现的硬核指南

基于 ESP32 的智能垃圾分类设备,充分利用了 ESP32 的外设兼容性和处理能力,通过简单的模块组合和代码编写,就能实现垃圾分类的智能化。无论是作为学生的物联网课程设计,还是家庭的环保小工具,这个项目都兼具实用性和趣味性。如果你想进一步优化功能,还可以尝试加入更多传感器(如红外传感器检测垃圾满溢),让设备更加智能。

weixin_42300449的博客 928

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Asp NET Core2 0 项目实战入门视频课程 完整版

Asp NET Core2 0 项目实战入门视频课程 完整版

qq_43678418的博客 1073

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用VSTS的Git进行版本控制(七)——管理仓库

使用VSTS的Git进行版本控制(七)——管理仓库 在团队项目中创建Git repo管理项目的源代码。每个Git repo都有自己的权限和分支,可以与项目中的其他工作隔离开来。 任务1:从web门户创建新repo 1.登录Visual Studio Team Services账户 2.从账户概览页面,选择团队项目。通过检索也能够找到你的团队项目。 3.进入Code选项...

jiangyongtao的专栏 761

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用TFS CI/CD 完成 VSTS 插件自动化部署和发布

Visual Studio Team Service 经过了13年的版本演进和5年的在线运营,现在已经是最成熟的商用DevOps工具链,Marketplace作为VSTS...

dotNET跨平台 3635
上一篇: 一个都不能少: DevOps的3大核心基础架构
下一篇: #VSTS日志# Xamarin构建支持和一大波更新
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值