用例——云原生Java开发人员的持续交付
文摘:
Josh Long / Pivotal & Baruch Sadogursky /JFrog, 2016年5月:组织努力加快行动。他们正在转向更小批量的工作,微服务,他们可以更快地通过软件工厂。
微服务支持敏捷性,当且仅当开发周期的所有下游环节都是一台运转良好的自动化机器。在这次演讲中,加入JFrog开发者倡导者Baruch Sadogursky和Spring开发者倡导者Josh Long,一起看看如何快速编写微服务,并通过Artifactory和CloudFoundry提供的持续交付管道推动它。
讨论转录:
[Josh]所以我们要做的是,我认为首先,这次讨论的重点是,你知道,Baruch和我都对敏捷性和帮助开发人员快速获得结果非常非常感兴趣,所以我们今天要做的是建立一个非常非常简单的应用程序。一些非常非常简单的东西。我通常只关注应用程序开发所以我们从这个开始。但我们很快就会看到,这远远不够。所以我们的目标是转移到一个我们有能力快速前进的地方,对吧,我们将从代码开始。代码非常重要,所以我们将去我在互联网上第二喜欢的地方。
[Baruch]所以Josh现在要做的和他之前做过很多关于Spring Boot和微服务的演讲是一样的。
[乔什]只要10分钟。
[巴鲁克]他将在10秒内完成,而不是45分钟。
[乔什]会没事的。
[巴鲁克]10分钟后,因为你非常敏锐,也因为我把他带到这里来实际上是为了说一件事。你在这次演讲中所做的非常棒,但这还不够。
[乔什]还不够。
[巴鲁克]所以,这是我第一次对着麦克风告诉你们,而不是在人群中大喊大叫。
(杰克)是的。
[巴鲁克]那我们就这么做吧。做你的事,然后我们再进一步。
[Josh]我们将从start . spring . io开始我们的生产之旅。
[Josh]这是我在网上第二喜欢的地方。如果您还没有进入生产环境,那么您一定要进入生产环境。我喜欢制作。你应该热爱生产。生产的。每年这个时候的产量都很高。天气很好。如果你还没去,你应该去,带上孩子,带上家人。制作比迪士尼乐园好。
[Josh]我们将从start。spring。io开始我们的旅程。如果你想在清晨喝杯茶或咖啡之前获得灵感,那就从春天开始吧。如果你的孩子躁动不安,睡不着觉,就开始点春。如果你患有消化不良并寻求缓解,那就开始点弹簧。
[Josh]我们要做的是建立一个非常非常简单的服务。我们将其命名为cdlive,我们将利用一些支持快速构建应用程序的技术。我们将在这里使用Spring的web支持。当然,如果我们愿意,我们可以选择,到下面这里切换到完整版本然后我们会得到一个复选框列表。我们可以用不同的东西来支持不同的技术和用例。除了网络技术,我们不想选择其他任何东西。我们还可以选择语言,同样,任何在JVM上带有对象和注释的语言都可以很好地工作。Scala, Java, Groovy, Kotlin等等。然后这里,最后,我们有一个我称之为无选择的。这些都是选择,就像脱光衣服在车流中奔跑也是选择一样。 You could make those choices but — but don’t. Please don’t.
[Josh]举个例子,这里有我们想要使用的JVM版本。在2006年,除了1点8之外的任何选项都不是很好的选择。这里有一个问题,一个人们纠结的选择,非常频繁,非常频繁,我将尽我最大的冷静来解释何时何地选择哪个选项,就在这里,现在。
[Josh]如果你发现自己被困在非常非常遥远的过去,远远超出了现代的帮助,那么选择dot war。但如果你和我在一起,在2016年,请选择。jar。这是我个人指导哲学的重要组成部分,即“制造战争,而不是战争”。你有选择。你有选择。你应该做对你有用的事。
[巴鲁克]首先,没有结果。
[乔什]没有结果?没有结果是什么意思?
[巴鲁克]它说没有结果。我不知道。
(杰克)好。
[巴鲁克]其次,谁会真的想要选择战争呢?
[乔什]那些来自遥远过去的人。
[巴鲁克]什么,像,残忍和战争的混蛋会选择战争吗?
[乔什]不知道。我们要把这个打开。我们这里有一个小项目。我要做的就是在这里打开一个令牌稻草人REST API。如果IDE想玩。出来吧。你在这里用什么并不重要。我只想要一些我们可以迭代的东西。或者我们可以在上面迭代。
[乔什]打开这个。来吧。来吧。Cdlive应用程序。其他控制器。好吧。
[Josh]我们要在这里建立一个简单的端点。公共字符串嗨。路径变量字符串。实际上我们甚至不需要这个。我们在这里画一个端点。我要做的就是公开一个端点,它响应HTTP谓词GET,并以正斜杠hi进行响应。好了。
[乔什]当然,这需要检验。我在这里写一个简单的单元测试。我说私有web应用程序上下文。WAC。或者更好的是,只要WAC。我将告诉Spring将该对象作为协作对象提供,如下所示。然后我将创建一个mockMvc对象,我可以用它与我的REST API进行交互,而不必实际地建立整个服务。我之前会说public void。我会说this。mockMvc = mockMvcBuilder。with web application context bot build。然后我用at before来开头。 And we’ll create a simple test just to prove that when I evoke that endpoint, I’ll get a result.
所以这个。mockMvc。perform。MockMvc请求生成器。并期望mockMvc结果匹配器。content。或者更确切地说,状态是ok的并期望新的结果匹配器。基本上就是获取内容。获取字符串形式的响应。好吧。点等于嗨。好吧。
[Josh]这将是我们的简单测试,这样我们就有了一些东西——当我们改变它时,我们可以看到会发生什么。那么assert =。我们不需要这个。好吧。这是一个简单的测试。如果我们运行这个,我们应该看到我们可以修复它。把它弄干净一点。几乎像Groovy,但又不完全像。
[Baruch]我只是想说,如果你需要一个用Groovy编写的理由,看看这段代码就知道了。
(杰克)是的。好,谢谢。所以。
[巴鲁克]不是因为你。这是因为Java。
(杰克)好。它通过了吗?好吗?它跑了,但那不是我想要的。请运行测试。测试嗨。好了,它通过了,我们可以证明它是负的,我们可以通过把它变成负的来证明它是正的,就像这样。再运行一遍。
[巴鲁克]这是一种突变测试。这是。
[Josh]当然,失败了,这是错误的终点。我们也喜欢这个。
(巴)难以置信。
(杰克)好。现在我们得到了一个非常非常简单的应用。非常简单的测试。我们知道这是我们需要的。现在我需要做什么?[…]
(巴)是的。你想把它提交到Git?
[乔什]我觉得这是个好主意。这是个好主意。
(巴)GitHub吗?会是这样吗?
[乔什]我们旅程的开始。我做了什么?我不可挽回地把它弄坏了。
(巴)是的。这是所有。你刚把它弄坏了。
[乔什]我去哪了?
(巴鲁克)我们回家吧。
[乔什]等一下。断言。
(观众)
(巴)是的。你做了测试。重新运行它。是的。运行测试。
(杰克)哦。谢谢你!你一定要这么聪明才能搭上顺风车。
(巴)是的。这是[…]。他很聪明。
(杰克)好。很好。谢谢你!现在我有了代码。我把它写在这里。GitHub上的某个地方。
[Josh]所以,今天我们来看看Bintray, Artifactory, GitHub, Travis,呃
(巴)春天。
[Josh] Cloud Foundry和start . spring . io。所有这些都是在网络上托管的。都是活的。所以,希望这次演讲能很好但是这里有很多变数。所以新的储存库
[巴鲁克]会没事的。刚刚好。
[乔什]会没事的。还可能更糟。
[巴鲁克]这将是完美的。
(杰克)。我们会说,cdlive。好吧。好吧。我们会现场直播。
[巴鲁克]我们会现场直播。一个许可证。我们需要东西。
[乔什]差不多吧。好了。
(巴)是的。
(杰克)好。为什么我们不快乐?
我做什么了吗?
[巴鲁克]你没有找零,是吗?是的。现在你做出了改变。
[乔什]这很有帮助。谢谢你!我们复制这个URL。进入命令行。Cd桌面。Git克隆。来吧。得更快。
[巴鲁克]这是一项繁重的工程。
(杰克)是的。清楚。Cat . git config。PB。把它复制到这里。我们的代码在哪里?下载。Cdlive。Git init。从桌面复制的。 Cdlive dot git config to the downloads directory. Cdlive dot git config. Git. And we’re inside of the downloads directory. So Git status. Git add. Maven w. Git add source. Git add Pom dot xml. Git status. Do I need anything else?
(巴)。但Maven ?你想让我们,你想让这次谈话尽可能地痛苦。对吧?
(杰克)是的。绝对的。所以Maven。Maven。因为我总是做出糟糕的人生决定。
[巴鲁克]你不能在街上裸奔。您选择Java 8。你没那么糟。
[乔什]所以这应该足够了。对吧?我得找人拉我。因为这里有自述文件。好吧。太好了。Git推动。好了。我们做完了,对吧?肯定。
(巴)。好工作。是的,干得好。但现在,你要怎么处理这个?
[乔什]回家吧。喝葡萄酒。
[巴鲁克]然后呢?难道你不想,比如,运行一些持续集成来检查你不会偶尔破坏它吗?
[乔什]我从不犯错。巴鲁克。
[Baruch]你刚刚谈到了你的代码中存在的bug数量。你不想
[乔什]好吧。嗯好的。所以也许你是对的。也许一些反馈是好的。
巴录好了。今天这很简单。只需将Travis yaml文件放入其中,就完成了。
[乔什]崔维斯是什么?
[Baruch] Travis是一个云——它是云上的一个CI服务器。它只需要你的GitHub存储库。当你向它添加box时,它会运行构建并失败,这就是你知道你今天制造了多少错误的方式。
[Josh]所以这是持续的反馈。是什么?
[巴鲁克]这是不断的倒退。比如倒数。你又开始数了。
[乔什]但是,我从不犯错。不,它已经失去了做Git的能力。搞什么鬼?
[巴鲁克]第一个不是Git吗?
[Josh]启用ver - Git。
(巴)。好吧。没有Git给你。这是- - - - - -
[乔什]随便吧
[巴鲁克]我们来做个版本吧。
[Josh] Git状态。Git添加dot Travis yaml。Git提交。YOLO。意思好吧。
[巴鲁克]这是个好消息。
[乔什]推一下。好吧。
[巴鲁克]信息很重要。
[乔什]所以现在我们有了一个连续的——我们有了特拉维斯。我还需要什么?
[巴鲁克]现在你需要把它打开。
[Josh] Travis CI。Travis CI。org。
[巴鲁克]。org。
(杰克)好。我们从这里开始。
[巴鲁克]签到。你认识特拉维斯。这里有大量的存储库。
[乔什]有一些。
(巴)是的。
[Josh]那么我们的——我们在哪里加的?Cdlive吗?
巴鲁克Cdlive。
[乔什]已经开了。所以,以防万一,请关掉。好吧。
巴录好了。现在让我们看看它是否有任何新的构建。
(杰克)回家。
(巴鲁克)应该有一个新版本,对吧?我猜。
[乔希]我们没有改变什么,对吧?
[巴鲁克]不,我们没有。
(杰克)大三角帆。
(巴)大三角帆吗?你在业余时间造Spinnaker吗?你是罪犯?
(杰克)好。好了。Update,这是旧的。所以我们现在需要
(巴)是的。[…]。
(Josh) -确保它更新了。
(巴)是的。让我们来看看我们会现场直播的。
[乔什]什么?
[巴鲁克]一个动画gif,我们要现场表演。[…]。
(杰克)好。TBD。
巴录好了。
(杰克)O ' reilly
[巴鲁克]这就是增加形象的方法。只需添加图像的TBD。
(杰克)好。
(巴)好。
[Josh]我不明白的是为什么Git不再做这个了?从字面上看,Git插件是在走廊外面工作的。但考虑到我们现在的生活。
(巴)。我们没有subversion和ClearCase以及其他很酷的东西。但是。
[乔什]加-
[巴鲁克]你在Maven,你不能抱怨。
[乔什]是的,我知道。
[巴鲁克]颠覆应该是你的底线。
[乔什]推一下。所以现在。来吧。
巴鲁克Cdlive。Cdlive。Cdlive。不。没有cdlive。
[Josh]这个和旧的有某种联系。
(巴)是的。我想我们应该创建一个新的回购。怎么样?
[乔什]有道理。或者我们可以重新命名它?
(巴)。我认为你只需要创建一个新的回购。
[乔什]哦,这里。
巴鲁克克隆。副本。是的
(杰克)。
巴录好了。Cdlive。
[乔什]可能还好。现在回到这里。到这里,添加一个存储库。
(巴)[…]
[乔什]再来一次。这次是在Gusto之前。
(巴)刷新。
(杰克)重新同步。
(巴)是的。
(杰克)重新同步。
[巴鲁克]我们会做到的。
[乔什]我们还有多少时间?[…]
[巴鲁克]我们才刚刚开始。我不知道。就五分钟。上衣。
[乔什]什么时候——不,说真的——我们什么时候开始的?
(巴)35。
(杰克)好。我们还有时间。白色的步骤。再来一次。
(巴)。开始吧。
[乔什]恭喜。
[巴鲁克]好吧。现在我们需要一个图像。或者去掉TBD。现在移除TBD。
(杰克)好。在Reddit上获得额外的验证。
[巴鲁克]是的,这很重要。
(杰克)好。Git推动。
[巴鲁克]你的信息没有任何创意。
(杰克)快。
[巴鲁克]这是个好答案。
[乔什]这是终极。是耸耸肩。它在哪里?
[巴鲁克]是的
[乔什]再来一次。
(巴)。
(杰克)好。
[巴鲁克]现在它在建造。哈利路亚。第一个已经开始了。兴奋。
[乔什]那现在怎么办?这给了我什么?
[巴鲁克]所以现在你有了。即使它失败了,你知道,你像往常一样加回去。但是,有藏物吗?你会把它们扔掉吗?你没意见吧?
(杰克)没有。我想用-
[巴鲁克]-你想留住他们-
[乔什]-又来了,对吧?
(巴)。
[Josh]所以这是要制作的。目标是投入生产。我该如何改变我现在所拥有的反馈机制,并使我的持续整合成为直接进入生产的实际渠道?
[巴鲁克]第一步是把文物放在某个地方。不要把它们扔掉。
[乔什]所以
[Baruch]您知道在哪里——什么是保存二进制工件的好存储库吗?
(杰克)Artifactory吗?
[巴鲁克]听起来不错。你猜是因为名字,对吧?
[乔什]我是不是应该
(巴)工件。Artifactory。
(乔什)我应该改了。我应该添加插件吗?安装Maven发布插件?
[Baruch]那你为什么要发布插件呢?快照有什么问题?
[Josh]那么,如果我没有释放,我怎么释放呢?
[巴鲁克]哦,是的。然后是Maven版本。它会失败,它会做很多Git的事情,它会再次失败。就是这样。
[Josh]那么,现在我在做这个的时候,对版本控制的思考方式有什么不同吗?
[巴鲁克]你不想拍快照?
[乔什]我想要。我想要一些可以释放的东西。这就是这里的目标:拥有每个有效的构建[…]-
[巴鲁克]-放弃快照。使用发行版本。
(杰克)好。
[Baruch]你可以把构建号当作版本,怎么样?
(杰克)好。比如特拉维斯?我能释放一些我能用的东西吗?
[Baruch] Travis - Travis的版本号是一个完美的发布版本。
(杰克)好。让我们改变一下我们的构造。把这个移到属性中。比如build。version,我们在这里创建。
[巴鲁克]听起来不错。
[Josh]版本会是build dot版本甚至是一个dot快照。对吧?
[巴鲁克]嗯,我们不关心这个。那只是退路。如果没有找到变量。但它会被找到,因为我们将使用特拉维斯变量。
所以我们可以在命令行上重写这个?
(巴)。
[Josh]当我们创建Travis版本的时候。那么,在这里?
(巴)是的。
(杰克)脚本。Maven。W - d构建。我刚才说什么了?构建点版本。
[Baruch] Build dot version。
(杰克)好。平等的。我在这里做个作弊。缺乏信心时间或时间
[Baruch]这是Travis的build number。
[乔什]像这样?
(巴)是的。像这样。你打得很快。
(杰克)复制。我作弊。我们就作弊吧。
[巴鲁克]他们没有——没有人注意到。
(杰克)好。所以现在我有了一个更新的构建。要做的,
[Baruch]但是,你仍然没有部署你的工件。你打算如何部署他们?
(杰克)魔法吗?什么才是正确的想法?我可以使用Maven[…]插件吗?
[巴鲁克]你可以,你可以。你有两个选择。您可以使用标准的Maven部署插件来执行分发管理部分。
[乔什]为什么?
[巴鲁克]这很好,但也有两个缺点。首先,您需要在主目录的settings xml中配置您的用户名和密码。你在特拉维斯有家目录吗?
[乔什]哦,是的。好点。不,我——
[巴鲁克]不,你不需要。
[乔什]我怎么知道?
(巴)好。另一个地方。坏的。另一个地方。Maven。另一个缺点是,您只是将没有任何元数据的愚蠢文件部署到Artifactory。这就是解决办法。您可以使用Artifactory Maven插件。Artifactory Maven插件解决了这两个问题。它将提供一个建筑[…],但它也给你输入用户名和密码在xml明文的能力。 How that sounds?
[乔什]甜美的甘露。
(巴)。这主意听起来糟透了。
(杰克)没有。
[巴鲁克]但你能做的是使用环境变量,然后——你是说,你说的是甜蜜吗?
(杰克)甜。
巴鲁克甜。
(杰克)甜。
[巴鲁克]那太好了。
[Josh]你知道我——你知道我最喜欢Artifactory的Maven插件的哪一部分吗?
(巴)是的。
[Josh]它让我的代码量翻了一倍——在我的构建中,代码行数翻了一倍。
[巴鲁克]那是——
[乔什]还有我的项目。
[巴鲁克]这就是Maven的魔力。
[乔什]那是Maven。
[Baruch]任何Maven插件都可以生成500行xml。
(杰克)好。你准备好了吗?
(巴)是的。让我们。哦。那就是这里。正确的。好吧。那是——那是Maven。
(杰克)是的。
[巴鲁克]这是最好的。
(杰克)。
[巴鲁克]就像爆炸。你是今天GitHub的顶级提交者。
[Josh]我得到了我的[…]
[Baruch]你今天提交的代码行数最多。
[乔希]我的[…]。看起来它需要Artifactory用户名和Artifactory密码。
[Baruch]这就是我们将在Travis中使用的环境变量。
那我应该让他们闭嘴吗?
[巴鲁克]我们现在把他们加到特拉维斯身上。
[乔什]所以这招管用。这很好。
[巴鲁克]是的,但他们什么也没做。你把你所有的藏物都扔掉了。
[乔什]起飞
[巴鲁克]我现在不喜欢你了。当你扔掉你的藏物时。
[乔什]我还没登录。我是吗?
[巴鲁克]您已登录。
[乔什]但是,故事的背景在哪里?
[巴鲁克]然而,你没有选择。这是你的账。你是乔希。
(杰克)是的。嗯,希望如此。
[巴鲁克]至少我们希望如此。
(杰克)啊。设置。
[巴鲁克]我们开始吧。
[乔什]你看到了吗?
(巴)是的。魔法。
[乔什]好吧。Artifactory
(巴)用户名。
[Josh]用户名等于admin。
(巴)管理。不错的选择。
[Josh]和猫Josh emv握着人工密码
[巴鲁克]和API密钥。是的,我们有API之类的。
[Josh] Grip减去I. API。收到了吗?
(巴)副本。是的。我们看看它是否复制了什么。它做到了。
[乔什]狗娘养的。
(巴)是的。但不是我们真正想要的。
[乔什]没关系。我们可以用这个。
(巴)是的。不。好吧。是的。听起来不错。我们使用API键,我们会在之后调用它。
[乔什]稍后。即使它被截断了,我们仍然要撤销它。所以,我不知道。
[巴鲁克]现在安全了。
[Josh]你不能接触到我非常私密、非常重要的演示版本。
[Baruch]一般来说是一个Artifactory实例,但你现在需要将环境变量更改为Pom xml,因为我们使用了另一个。没有密码。但是,对,就是那个。走了。把它带到监狱去。
[乔什]这里。
(巴)。正确的。在这里。
[乔什]现在怎么办?
[巴鲁克]一流的。好吧。那么现在我们有什么现在让我们,让我们看看这里有什么。这就是简洁的Artifactory插件。正确的。以及它要做什么。它会进行发布。这需要Travis的承诺。例如,它将添加有关文件的元数据。[…]这将是特拉维斯提交。 It will go into cloud native Java Artifactory online dot com. That’s your Artifactory account from the cloud.
[Josh]这是JFrog的人非常慷慨地给我的。眨眼。
巴鲁克眨眼。用户名和密码。我们要把这些藏物放到本地的leap staging中。为什么是分期?
[乔什]我不确定。
(巴鲁克)因为我们想要上演它们。
(杰克)好。
[巴鲁克]这个怎么样?对吧?我爱这家伙。他太聪明了。
[Josh]这又回到了我犯错误的问题上。
(巴)。然后。完全正确。然后我们将添加一些关于构建的更多信息。比如谁建造了它。特拉维斯。我们要建造什么。版本号是多少?构建数字。什么URL - Travis的URL。 Who’s the user? The user in Travis. And what was the commit. We commit it so earlier. So that’s the metadata that’s going to come from Travis, to Artifactory where it’s going to sit.
[乔什]他们添加,他们建造。
(巴)是的。基本上我们已经准备好将一些文件放入Artifactory。
[Josh]我也想建立和解决我的依赖关系[…]
[巴鲁克]是的,是的。这是一个很好的观察。现在,Maven在默认情况下将在哪里解析依赖项?
[Josh]它不是去settings。xml吗?
[巴鲁克]还有,还有什么呢?默认设置。xml?
[乔希]我的[…]。
[巴鲁克]Maven设置。
(杰克)是的。
[巴鲁克]Maven中心?
(杰克)。
[巴鲁克]Maven Central很棒。但我们需要控制我们实际使用的藏物。这意味着我们需要从Artifactory中解析依赖项。
(杰克)。
[巴鲁克]你是怎么做到的?
我们能不能换个——哦,对了。
[巴鲁克]设置xml。设置xml在哪里?
[乔什]在我的主目录里。
[巴鲁克]你的主目录在哪里?
不存在。
[巴鲁克]不存在。
(杰克)好。
巴鲁克Maven。正确的。Maven的乐趣。我们现在能做的是。我们现在应该做的是使用另一个Maven安装,其中包含Artifactory而不是Maven Central。我们怎么能做到呢?
[乔什]好吧,就这么巧。现在我开始明白为什么这个有用了。start . spring . io初始化器生成一个构建,其中为您预先配置了一个Maven包装器。
[Baruch]什么是Maven包装器?
[Josh] Maven包装器受到Gradle包装器的启发,反过来,你知道,Gradle包装器保留了构建系统本身的一个版本。在这种情况下,应该是Gradle。有了代码,你就可以控制所有东西的版本了。这确保了您拥有可复制的构建,这在您转向持续交付时变得至关重要,因为每个构建都可能不同,并且可以被部署。
[Baruch]所以我们实际上没有使用Travis提供给我们的Maven,这是默认的Maven,我们使用的是包装器。包装器的属性之一是要使用哪个Maven。所以我们可以改变这个属性,说不要使用原来的Maven。而是使用带有指向我们的Artifactory而不是Maven中心的settings xml的Maven。对吧?
[乔什]像这样。
[巴鲁克]所以,我们要把它打得很快。然后把所有东西都打进去。
[Josh]这是怎么来的?
[Baruch]所以你在这里看到的Maven不是来自Apache服务器,而是来自你的在线Artifactory。Maven的区域分布和这个分布的区别。因为它带有指向Artifactory服务器的默认设置。
[Josh]所以我们下载了发行版,解压缩,修改了settings。xml,然后…
[巴鲁克][…]再来一次,把它放在Artifactory上。多亏了Maven包装器,现在我们可以完全控制使用哪个Maven了。我没说玛芬的好话。这是Gradle的主意。他们只是偷了它。
[Josh]但是他,我们打了个赌,我要让他在演讲结束前说一些关于Maven的好话。
[巴鲁克]这是一个葡萄酒赌注。我是安全的。即使我输了,这里也有酒。但短期内我不会对Maven说什么好话。
[乔什]你可以——我们走着瞧。所以。这就够了吗?我们需要的东西都带齐了吗?
[巴鲁克]看起来是这样。看起来——
[Josh]如果我按这个会发生什么?
[Baruch]所以文物会被上传到Artifactory。依赖项将从Artifactory下载。Artifactory将构建并将它们上传到Artifactory。放一个分段包装器,我们可以把它放到,我不知道,像一些云平台。
(杰克)好。
[巴鲁克]你想到了任何好的云平台。
[乔什]听起来不错。听起来不错。是的。所以。
[Baruch]让我们先提交,然后再讨论云平台。
[Josh] Git commit - A. Build it。
[巴鲁克]好吧。这是,这是新的。前一个是YOLO。所以我们,我们有一些严肃的承诺。
[乔什]好吧,推一下。
巴录好了。让我们看看它是否真的起作用了。还没有,那是YOLO。
[乔什]祈祷吧。
[巴鲁克]我们会做到的。仍然YOLO。意思
(杰克)是的。
[巴鲁克]我们开始吧。好吧。
[Baruch]现在让我们讨论一下,一旦神器进入《Artifactory》,我们将如何处理它们。我们马上就会验证一下当它们在那里的时候。那你知道我们该怎么处理他们吗?藏物?您如何验证它们已准备好投入生产?
[Josh]我想做的是,我希望能够给产品管理人员一个机会,让他们能够在应用程序完成后对其进行审查,他们给我分配了一个故事。对吧?
依赖项是从Artifactory实例中下载的。
[乔什]甜美的甘露。好吧。我们在进步。
[巴鲁克]好吧。很抱歉。是的,我打断你了。项目管理?你想做什么?
[Josh]嗯,如果我——如果我有一个故事,我做了一个改变,我承诺。提交一些能够传达故事的内容,我现在还不能将其交付到制作中。[…]。
[巴鲁克]这就是我们登台演出的原因。
[Josh]我们没有持续部署。我们不是在做持续部署,只是在做持续交付。我想给产品管理一个机会,让他们真正地审查工作,并验证它是否按预期完成了。然后接受它。
[巴鲁克]我们怎么能做到呢?
[乔什]嗯,我们可以把它送到一个暂存环境。云上的东西。所以我知道,我碰巧知道一个我们可以使用的云。比如——
[巴鲁克]哪一个?
[Josh] Cloud Foundry。
[Baruch] Cloud Foundry。
[Josh] Cloud Foundry是一个开源的服务平台。我不知道你是否听说过。它是一个开源平台。它是由VMware的人开发的,现在是Pivotal的一部分。它是一个基金会的一部分,其他小型夫妻店已经使用它作为他们云技术的基础。有多少人听说过IBM?I, B, m,谁都行。
(巴)。
(杰克)没人?
(巴)。没有手。
[乔希]惠普怎么样?H P。
(巴鲁克)没有手。
(杰克)没有人。
[巴鲁克]没有手。
[Josh]百度呢?百度。有人知道吗?
(巴)是的。开始吧。
[乔什]好了。
[巴鲁克]这是一个很受欢迎的平台。
[乔什]好了。
(巴)好。
[Josh]所以,这些都是试图取胜的小型夫妻店,他们已经将云铸造厂等标准化了。我在那里开了个账户。
(巴)[…]。等一下?让我们看看它是否被部署了。这里你有URL浏览到-在Artifactory下,不,下一个。下一个。
(杰克)尴尬。
(巴)是的。这一个。让我们看看实际部署的情况。给你。看看这个。你有身材。这是二号建筑。
[乔什]太美了。
[巴鲁克]你有一些模块。实际上是一个模块。模块里面有什么?让我们向下滚动一点,看看这里的信息。好吧。我们有多少依赖关系?这是一些依赖关系。那些藏物在上面。在这里。两个工件。 A jar and a jar not war.
(杰克)是的。
[巴鲁克]好决定。
(杰克)是的。
[巴鲁克]还有一个电脑档案。所以我们已经在Artifactory了。现在让我们谈谈我们如何把这个构建和Cloud Foundry。我们该怎么做呢?
[Josh]让我们补充一下。让我们快速地把它修改成一个小脚本,然后部署它。我们写入,新建文件。或者说是新的目录。箱子在这里添加一个新脚本。然后cf•sh。
[巴鲁克]哦,我的天哪。Bash脚本。
[乔什]我知道。
[巴鲁克]你是硬核。
[乔什]总得有人去做。我们把这个放哪了?我们有一个现成的。桌面。
[Baruch]这是shell脚本。从头开始写能有多复杂?
(杰克)Joshlong。不。Jbaruch。
(巴鲁克)那就是我。我有最好的脚本在我的GitHub?
[乔什]你知道。
[巴鲁克]不,我不知道。
[乔什]你知道。
[巴鲁克]这是个谎言。不。
[乔什]我们把它放在哪里了?
[巴鲁克]我不相信。
(杰克)SwampUP。在这里。Spring引导演示。
[巴鲁克]哦,我的天哪。
(杰克)副本。
你劫持了我的GitHub账户,在我的GitHub里放了bash脚本。
[Josh]在一天结束的时候,你是我代码的分发库。Cd箱。触摸cf点sh. Atom cf。
[巴鲁克]那不是我的准则。不。不是我写的。
(杰克)好。Git添加。Chmod ax cf dot sh. Git add. Git状态。Pwd。Git提交。加上cf,好的。
[Josh]所以现在我们要修改Travis来指向这个脚本。该脚本将从存储库下载cf命令行客户机的最新和最好的Linux版本。然后验证。它将登录,验证,然后瞄准。然后我们可以用cf来推罐子。这是由特拉维斯建造的云铸造厂。所以我们现在需要相应地修改特拉维斯。我们会说at bin dot bong,虽然这也很酷。Cf•sh,应该可以了。
[巴鲁克]文件名呢?应该推动什么?
[Josh]这不是已经指定了吗?[…]。
(巴)是的。它是。问题是:它指定正确吗?
(杰克)是的。
巴录好了。
[乔什]好了。[…]。
[巴鲁克]那太棒了。
[乔什]是的。
(巴)固体。
(杰克)。完成。我们能推迟吗?Git的地位。Git commit - A. Cloud Foundry。Git推动。如果一切按计划进行,它就会被部署
[Baruch]到Cloud Foundry,我们将能够验证并看到它确实有效。
[乔什]让我们从这里开始。现在。来吧。
[巴鲁克]好吧。开始吧。这是另一个版本。而这是建设。我想我们可以为下一阶段做准备了。假设Cloud Foundry中的建筑是坚固的。我们收到了我们的hi信息。这就是检查的意思。对吧?
(杰克)确定。
[巴鲁克]这很好。我们的下一步是什么?
[乔希]我想我们应该有一个绿色的大按钮,用来指示生产或云或其他东西。
巴录好了。听起来不错。我们的,我们的生产。我们该怎么办?首先,我们当然有云代工生产环境。但我还听说,您构建的那些讨厌的jar文件是可执行文件。
(杰克)。
[Baruch]所以我可以在我的机器上运行它们。
(杰克)绝对。
[Baruch]要在我的机器上运行它,我需要能够将它下载到我的机器上。
(杰克)。
[巴鲁克]你想为我建一个下载中心吗?
(杰克)没有。
(巴)。
[乔什]我还有事要做。
巴录好了。那我们该怎么做呢?
[乔什]所以这个Bintray。谈谈这个。
[巴鲁克]不错的选择。我们把Bintray里的这些分发出去。让我们看看在Bintray中是否有一个存储库。它应该是Bintray。com / swampUP云原生java。
(杰克)好。
[巴鲁克]那是一个组织。我们有很多存储库,对一个组织来说很好。其中之一是Maven。我们要用它。对吧?最快的方法是什么?现在这是一个对云——对人群的开放问题。从Artifactory到Bintray最快的方法是什么?我没有问IBM或[…]。来吧,伙计们。 Huh?
(观众)
[巴鲁克]魔法是个不错的选择。其他任何人。来吧。我们有很酷的t恤。非常感谢。分布存储库。给这位先生倒杯茶。两个。不错的选择。
[Josh]一本免费的《Spring》。
巴鲁克哇。你今天太慷慨了。
(杰克)是的。嗯,它是开源的。
(巴鲁克)看看你。好吧,还能造吗?
[乔什]那我们现在该怎么办?
[Baruch]现在让我们建立一个发行库。
(杰克)好。
[Baruch]让我们回到Artifactory,为它创建一个新的发行库。
(杰克)好。开始吧。
[巴鲁克]我们开始吧。是的。让我们在管理中创建一个新的存储库。没有回复。
(杰克)管理。
(巴)分布。点击新按钮。
(杰克)授权。
[巴鲁克]是的,我们应该授权Bintray。云原生Java。我想是这样的。
(杰克)好。把这个抄回来。
(巴)是的。我们有一个复制按钮。太棒了。
(杰克)关闭。粘贴。保存。
[巴鲁克]给它起个名字。
[乔什]再来一次。分布。
[Baruch]让我们在这里提供一个许可证和基于GitHub的参考。我们下去吧。开始吧。许可证。和。
[Josh] Apache 2。
[Baruch] Apache 2。我们喜欢Apache 2。CS应该是你的GitHub。这个家伙。太棒了。保存并完成。我们都做完了。
(杰克)好。现在怎么办呢?
[Baruch]现在,我们会——一旦你的云铸造厂构建被批准。我们可以,它失败了。
[Josh]失败是因为我忘了添加环境变量。
(巴)。你所做的。
[乔什]所以你可以唱一分钟,跳一分钟,我来
[巴鲁克]我会唱歌跳舞。你想做吗?
(杰克)设置。
[巴鲁克]我们善于把握时间吗?其实不然。
[乔什]没那么多。
[巴鲁克]两分钟。
(杰克)好。
巴录好了。
[乔什]我们试试。
[巴鲁克]你是想假装它有效,还是想做另一件事。
[乔什]你可以的。是的,我们可以假装。好吧,让我们假装一下。
巴录好了。所以我们——我们在Cloud Foundry看到了它,它很好。实际上,我们打开浏览器,输入URL。猜猜我们得到了什么?我们得到了什么?
(观众)
(巴)嗨。它工作。人们看到了现场直播。
(杰克)。
[巴鲁克]人们看到了。人们看到了。好。好吧。
(杰克)浏览器。
[巴鲁克]我们有证据。
(杰克)。
[巴鲁克]这是有效的。
[乔什]就在那儿,实际上是在[…]。
[巴鲁克]有。
[乔什]以防万一。
[巴鲁克]好吧。
(杰克)。现在怎么办呢?[…]。
(巴鲁克)我们分发吧。
[Josh]我忘了包括Cloud Foundry的用户名和密码,这很容易做到。现在。
巴录好了。现在进行分配。让我们回到我们的构建,现在可以开始了。在Artifactory中,我们现在有了构建。是的。这是建造的一个。
(乔什和巴鲁克)活着。
[巴鲁克]第一个。二号人物。哦。3号。下一个。我们有一个新的,我们已经测试过了。是3。
(杰克)三个?好吧。
(巴)。当它被称为云铸造厂,并取得了巨大的成功。
(杰克)。
[巴鲁克]我们都看到了。
(杰克)好。
[巴鲁克]现在,有一个巨大的按钮。而且可以是绿色的。分发。这不正是我们想要的吗?
[乔什]这就是我想要的。
(巴鲁克)绿色的大按钮。
[乔什]现在怎么办?
[巴鲁克]我们开始吧。选择发行版存储库。然后按下绿色的大按钮。
[乔什]现在我可以把它绑在钩子上了,对吧?
(巴)是的。
[乔什]我可以用它来触发,例如,把某种东西从一个环境推广到另一个环境。
[巴鲁克]当然。现在,一旦你把它在Artifactory中推广到Bintray,你也应该把它带到Cloud Foundry中推广。我们去宾特莱吧。
(杰克)好。我们到了。
[Baruch]让我们看看Maven存储库中是否有新的包。
(杰克)呀!。
[巴鲁克]你可以从这里走。组织。然后是Maven仓库。
(杰克)好。
[巴鲁克]现在你应该看看我们的新包装。Cdlive。在里面你会看到一个版本。给你。你应该在文件下面看到一些文件。
(杰克)好。
[巴鲁克]它为我们构建了一个快照。我们又搞砸了环境变量。
(杰克)啊。哦。
[巴鲁克]好吧。
[Josh]所以应该是build dot number。
(巴)是的。应该是——
[Josh]我应该在构建中指定什么?
(巴)是的。我们搞砸了。
[Josh] Build dot version。
(巴)是的。这就是为什么。
[乔什]没有母亲的山羊的儿子。
巴录好了。你没有看到。它成功了,这是第三版的cdlive。不管这是什么。我们稍后再补视频。
(杰克)是的。一切都会好的。所以。
[Baruch]现场演示。伙计。
(杰克)是的。我们学到了什么?今天我们学习了如何构建一个非常简单的服务。我们明白,如果我们想要得到反馈,帮助我们提高质量,我们就需要进行测试。通过将质量构建到其中,并提供严格的控制,我们可以将其转移到像Travis这样的持续集成服务器中,以验证我们所做的更改是否仍然符合已知的基线。
[Josh]然后我们研究了如何使用这个人工仓库作为中心枢纽,把东西从一个地方移动到另一个地方。在本例中,转到生产。在这个过程中,如果我们需要,我们可以让它非常非常自然地访问云环境。
[Baruch]然后,如果你打算分发或自存储从Bintray分发。如果你只想把它放在你的服务上,你可以把它从Artifactory拿出来放在你的服务器上。
[乔什]顺便问一下,Bintray和Artifactory有什么不同?
[巴鲁克]Bintray是用来分发的。工艺品是用来开发的。我们就是这么做的。
[Josh] Bintray,没有托管,没有私有的预置版本,对吧?
[巴录]会的。
[乔什]私下谈?
[巴鲁克]很快。
(杰克)真的吗?
(巴)是的。
(杰克)Bintray吗?我以为是CDN之类的。
[巴鲁克]是的,但是有一些大型组织想要在他们的组织内部进行分销,他们需要Bintray onPrem,我们会这样做。
(杰克)哇。酷。
[巴鲁克]为Bundle,或IBM,或[…]。
[乔什]好吧。
巴录好了。还有一件事。失败的现场演示拥抱。
(杰克)是的。是的。哦。悲伤。非常感谢。占用你的时间。
[巴鲁克]谢谢你们。