logo

NJP

Orlando CI/CD Automation P4 - Live Coding Happy Hour for 2020-03-06

Import · Mar 07, 2020 · video

hello and welcome to live code happy hour on this glorious Friday March 6 2020 I'm Andrew Barnes I'm here along with my co-host Fred Tilton and we'll get started right with the intros Brad give us your intro sure my name is Brad Tilton I'm the newest developer advocate at ServiceNow with the developer program I've been developing on ServiceNow in some form or fashion for about the last 11 years as customer partner and employee and I'm excited to be on this live coding happy hour wonderful thank you I'm Andrew Barnes developer advocate at ServiceNow been here for a little over a year and a half in this role I've been doing enterprise applications for a long time ServiceNow development specifically for a little over five years specialize in integrations custom applications and managing development teams and their artifacts so all of the development work that development teams do and I'm super excited to be here today so we had our first kind of first stream last week we had some hotel Wi-Fi difficulties so some people got to see it and some people didn't so this is Brad's for real first show and I'm super excited into week one so as always on live code happy hour will introduce our beers first and then talk about what we're gonna do today so Brett all right I have a bombastic brewing it's a murder stout that that sounds exciting I hope it is exciting it has some spice to it apparently yes so I've got in Edmunds oast Edmunds oast brewing and it is a order of magnitude which is a great name for something I'm about to drink and it's an imperial sour ale which I don't think I've ever had anything called an imperial sour arrabal before so kinda excited to figure out what that means even cuz you know I know what imperial stouts are but an imperial sour you know that's new so today we're gonna we're gonna look at so we've got three previous shows on si sed as relates to Orlando and today we're going to dive in and put some finishing touches on the application that we've been building in that space when I hunt sure exactly what we're gonna do but you know we're gonna we're going to dive in and do some things but what we did previously on the previous shows was we showed how you can leverage the integration hub spokes and API is that correspond to those folks to do several different things as of Orlando with relation to your development work and so as I said in the intro you know managing developers work is something that's near and dear to my heart so this is of interest to me one thing to note is most of this stuff is dependent on it being scoped application in Orlando we hope to change that in the future before Orlando it's it's scoped application so some of the things that you can do are run a test suite get the results of a test suite run you can deploy an application you can deploy a plug-in you can upgrade a version of an application from the repository and you can pull down a new version from source control of an existing application I think that's all of the the key API steps that you can do and course spokes and and we used all of those different spokes those actions in our flows in flow designer to perform those actions so today we want to look at putting some of these things together in a cohesive whole and in order to do that we have to make some decisions on what we want our cohesive whole to look like so we don't have the typical dev chain that most customers are gonna have so we don't have lots of multi stage environments for our work on our team we've got a dev instance and we've got some prod instances and so we don't have a long pipeline to go here so as I'm thinking about that Brad what would you like our pipeline to look like and we'll we'll figure this out really quick and then we'll dive into the share and actually start building this so if I want to deploy a new version of one of our apps do you think we should do a peer review I think we probably should do a peer review just in two just to make sure that it's it's okay somebody else should look at it and I think that that's a good practice for any development team of any size of more than one which we are we are we're a dev team of two and so assuming that I want my peer reviews done when I'm ready for deployment I think we could have a fairly tight process of submit for peer review and then that when that is approved it's ready to deploy so I'm not gonna ask you to peer-review something until I'm ready to deploy it otherwise I will I will ask you for a peer review like separately if I want you to look at something but if I'm go through our formal process of this is ready for deployment another developers got to look at it that means when they approve it if they approve it go let's do that let's build that pipeline right good I'll drop into a screen share and you are doing the button pushing for the first time in the show so we'll see how that goes oh I'm sharing the wrong screen good job first step first step fail all right let's share the right screen there we go sharing the Crick's excellent so you're looking at one of my instances I've got studio open in my existing C ICD app that we've worked on previously so you can go look in the history and see those and I will yeah everything's fine so let's think about what that should look like we don't actually typically usually so normally most dead places I use stories to manage our development work we don't really use those too much here like for some projects we'll use stories but for most things we don't have a long pipeline and a story process because the app that we're working on is our app for us and we are the you know we're the product manager of the developer the QA the tester the approving Authority and so when you're in there working out it is uh it's usually straightforward so we don't have to write it down I advise people to write down things their requirements and the acceptance criteria because that helps you know when you're done and if you've ever watched this show before you know I like to know when I'm victorious and when I'm not because I think that's important for a developer to know when they've reached victory and if you don't if you don't know what it is before you reach there you know if you haven't set what that bar is you know it could just be anything so thinking about that is if I do a commit is that what we want to say is our trigger is is actually committing to a production branch so we're saying that you have written written some code you have done some things that you are ready and think are ready to be deployed and that's where we're trying to figure out how we're gonna trigger our flow from yep and so I have to decide what I want the trigger to be do I want it to be a record I put it in a table somewhere which will probably be you know something related to either releasing or stories or something in that space or do we want to it to be committing to a branch a particular branch for for a particular repository hmm I'm trying to think of how I would like it to be done so that I can signal I want this process to start so it's flexible you could decide this and each team needs to decide what best fits for their practices our team is so small and flexible that we could basically do anything which is the bane of creativity is is we have very little constraints and in most environments you're gonna have some constraints that make sense like you have a release process and you have a peer-review process and a testing process that's probably linked to stories and releases and therefore you could tie your your work to those so let's just do that because that'll be closest to what most people will experience yeah I like the idea of a record and a table because it gives a little bit more visibility to more people so anybody that can see the instance and you know it kind of makes it easier to track for people just looking at the instance here so I think I would leverage something in our case like ready for testing so that was certain 'el to me that it's ready for a peer review and then testing so let let us create a flow on the story table that goes off of ready for testing um but the thing that I'm missing here is an attachment to the work effort so I'm gonna need somewhere on story or some record related to a story that actually ties development work to a story and I've done this like 50 different ways more like six or seven but so we could tie this to mostly we're dealing with update sets so we could tie this to an update set that sounds pretty reasonable so what we can do and we do have so fairly straightforward in our case and this isn't going to be super generis eyes'll to everyone because you won't have some of the things that we have in place to synchronize data between our instances so typically your stories are gonna live in your production instance and your update sets will be in a so prod instance right and so linking a story to an update set is now a reference field typically right yeah we so in that case I suggest that folks use something like a URL field but we are going to have our story synchronized to all of our instances so our story can relate to an update set directly because the stories are be synced between instances and then therefore is that not a field I can select there it is now and so if you did use a URL field that would be the URL of the update set and the other instance right yes so in the production instance I'd have a URL field and that would point to the development instance URL for that update set let me go and just go to the table because I didn't seem to be able to pick the update set table as a reference field from the the form layout so let's try it here reference we've got a few people that have said hi in the chat we Travis there and americo and Marcel and jr. hey everyone so update set reference to updates it very very sneaky so now that I had that we should probably put that on the forum somewhere and it put it on the default form but not on to the scrum view forums I was wondering why it wasn't there so we need to throw it you know somewhere like there go in save um so doing this in in default it's fine and so let's pick a up date set for this record you can't actually see the update set picker on the stream so we don't have to tell people that that oh see I'd throw myself under the bus there yeah let's pretend we're in an update so I didn't have to all right this will be the one we work on let's say fix the thing full of bread and the condition is bread is happy with the changes that is a terrible acceptance criteria don't ever do that but I was trying to be a little funny no I think emotions emotions are great things to measure I'm really enjoying this drink by the way I don't know I still don't know what Imperial sour means but but I'm happy with whatever these people decided that it meant so we've got our link torn our update set so now we need to add a flow that does something based off of moving and ready for testing so let's go do that so we'll create a application file it shall be a flow in flow designer and I always think that's a little weird that if I go it this way it pops out entirely versus a new tab but whatever is fine will new flow we will say our CI CD well our app name is CSE day so we don't we don't need that in the name you peer review and diplopia so if your application name is named CI CD you don't need CI CD in the name of your flow just just just name and suggestions out there so we're gonna do created or updated on our story table story we're gonna add a filter for our state changes to ready for testing and so even if you're the only folks in your company using the story table you will not be the only folks ever using this story table most likely so add some more conditions in our case we're gonna say the assignment group is do I have which groups do we have I'm a DB Atlanta it's my favorite demo so we are going to be the career apple ooh yeah so does that mean we are app development team we're developing a career app either make it a product centric or assignment group centric or something you know as you expand usage you don't have to come back and and worry about these things to be a little forward-looking don't spend too much time being forward-looking but just a little bit for looking so the first thing I want to do is not continuous integration and continuous delivery right I don't want to deploy this to prod immediately do I that's right we need some sort of check in between this company needs to look at it oh and my muta head oh no I see you Brad but I can't hear you Brad so the first thing that I want to do actually is I think in our case we'll do a peer review is an approval so we'll ask for approval nope that won't be our first step our first step actually will be a CI CDs but it'll be running test cases so we are going to tart start an ATF test suite with IB and we actually had a sub flow that we created for that I believe sub flow which was oh my goodness there was some sub flows out of the box for these Wow I'm I feel real bad that I didn't look here before on the previous shows hey Brad can you hear me I can hear you like something if you can hear me Brad alright I still can't hear you can you hear me hopefully everyone out there can hear me and he'll figure out how I can hear him soon ooh I can hear you can you hear me now yes oh I don't know what happened so either yeah we're back um he's in it these would have been really useful for me to have looked at before I had no idea that they created some some sub flows for these at none no idea these existed Peters I created some of these like I created some sub flows that replicated these sub flows we spent a whole at least one whole video doing that well now people know how they're made so over smear over here we had some and so these these also exist which is we can start a test suite with the sweet name but this one still needs us to give it a sweet name so we're still gonna have to do a lookup and I did we not publish it it's possible we didn't publish it did you do a lookup through a flow in a previous week I look up for an ATF test we did updated publish to repo exports up flow no um where's that guy this is not it we did one though maybe it was up use low and not a sub flow was there just a step inside of a flow test gene test suite but it did it did I can't read those words nope alright well we had a sub flow let's do another one let's do another one we'll make a new sub flow which is lookup tests we're going to throw this in our spoke our scope that spoke and our input is going to be the application so do we want to run all test Suites associated with our application yes that sounds right so I'm gonna input in application and since this will be hmm this would be running on I'm not gonna worry about the edge case where the application doesn't actually exist I'm gonna use a reference that would never happen right we can just made absolutely happen but we can we can stub out the scope in global first if we have to so the reference is to the where am i pointing to the application table so please be in here please please it's app right yeah but that doesn't mean it once let me type this app all right well I guess we'll just go with the string boo I'm sad now I'm I don't like that at all so are we expecting a this idea in that strength we're expecting the scope name and so we'll just make that really clear scope name good call now it was honestly confused then we're gonna just doing it for the video we're gonna do a look up on the test suite [Music] application to know what I named that freaking table nice wheats two scopes mapping I'm looking for mapping sweets two scopes is this a table that you created or it is okay it's right now familiar with this yeah it's right there on the left of this oh yeah a screen this one this is the one I want I want this guy that named team's little long two scopes why why can't I have done a lookup to that table before I don't know what's mmm let's coach I mean I'm in this scope so it shouldn't be an issue but all application scopes can read it and it's in your scope so and I'm in that scope so that journeyed across scope that's uh that's not making me delighted I'm not delighted it's definitely not in here there hmm why not here I'll save it just just cuz lookup records pretty straightforward request I'm going for it is looking up this table that I can see definitely exists yes it is there it's the only table in your scope it is weird because it's got the label of label all right all right what's going on there but that'll make it not show up when you're looking for mapping label again yeah so I think someone came and so I was having some trouble and I had someone come help me and I think they broke my table mmm sound like help so we're gonna make a new table because it was a simple reference table mapping East to scope to apps we say okay and I don't know what's going on there I was your helper and this is also not a writable field someone has someone has done things that they shouldn't be doing are they helping with the repo maybe seems like a repo thing clcd mapping to perhaps okay well whatever we're gonna where to submit that and see if it actually saves it wasn't me that broke the table people are asking brad joins up before they first first week is over he's breaking tables i will definitely break something but i don't like like that alright so we need the application which is a reference field to the this app table no you don't like me today how about application cisco pwould not be horrible probably works this scope was good enough it's good enough test suite reference is sweet and go alright good it's done and we're definitely gonna save and I completely relaunch flow designer because we'll just save this guy because the loading of table names is not it's not a thing that flow designer likes to do oh that's a good does it does it load them at the beginning do we get new loads when you try to select one what was the name of that sub flow we called the one that you just will just launch flow designer because yes that we don't need the studio for I don't need studio for that where we're going we don't need studio looking up tests and now hopefully we shouldn't have any trouble here now selecting tables want to select tables I'll be patient I really will I think it's gonna happen that's a have a drink wait for a table it sounds good nope okay come on man make me look bad look up records this story does have a spicy backbone oh yeah you said it was a little spicy against they are correct it has a spicy back so now we're mapping test two apps and we're going to look up that the application is open up the application name name well that's right so we're passing a scope name and yeah don't do that by the way but that's what we're doing today because that's what we've got it's not gonna hard lis at all is the application name is at the scope name or is that the friendly name that's the friendly name is your is over here application so when you click this guy open this record the display name there that's the name I would expect that scope field to be what you're passing in well if you I mean if that's what we want to pass in that's we say Smith's name that's a so complicated we can definitely get that right so the scoop how about you just say scope applications yeah just scope cuz I think I like that better because it has to be unique the scope yes and then our application scope is input look at some flow design it worked it is so now for each of so we're looking up our tests and then for each of those tests records that come back each of the records in that table that comes back will be a test suite to an application okay so for each record that comes back I want to execute a new sub flow which is run a test suite with name sub flow and the test suite name is gonna come from here dudududu yeah and I just pointed out something that I don't like to do which is if you hit the down arrow too many times you should be using this instead so we go to our record and then we go to the test suite and then we go and we say this is the test suite name is what this thing is expecting so there are two different sub flows and one is execute by name and ones by ID and we chose name we had both things available to us so it didn't matter the instance URL we're gonna get that from I think a property yeah let's do a property and in this case we're going to get the development instance that it's on so I want this to run I want the flow to run in production but I wanted the the test Suites run in the dev instance so we need a dev in 30 property that we reference yeah we don't we don't have that anywhere just by default right right so we're gonna go make one so we're gonna switch our scope actually to be in the correct scope you can do this through studio right I could have done it in studio let's do it in Stu you and so we're I call this the CIC d dot our properties separated by dots or dashes I think they're dots that you can use you can use underscores as well but the dots yeah I was just going with them yeah the typical one that we use and I hope you'll already have realists it'll already it'll give you the your application scope as the first part of your property so you're actually doing the suffix right now so you probably don't very good instance yeah we'll just do dev in this case it looks good and as you see it's populating in there and we want our value to be div program dev service and we'll be polite and do all of that in there and so we need to get this thing so over here we're gonna do a get property and I know it's not Auto completing that so now I doubt and so I'm gonna go look up the API cuz well if autocomplete doesn't do it and I do not rely on my memory cuz my memory I think that's right it's not a good thing so yeah are we on scope though oh we are in scope it's it's the same yeah I think it is all right it is yay and since I am zip zip I shall be copying and pasting all the things so we are going to return return that very good don't however do like I do sometimes and click that FX button like it clicking this to collapse it actually turns it off so don't do that click click click the collapse button not the activate deactivate you want you want green or green is for go so and and a handy-dandy even says hey this is scripted expand to edit but then when you turn that off it doesn't so look for that and we are not required to send these others so I'm not going to and so that will start a test suite and we wanted to I hate to have recreate the things that we did last time which was we did so that returns us yes sub flow output gives us a where's the thing I need in fact I'll show it with the inputs for sub flow which is here for wait until tracker completes and so I'll need the progress ID do I need to look up the tracker first I think I might have to look up the tracker first so the tracker is tracking the progress of the ATF suite yeah and that is not a set flow so that is an action not a sub flow hmm good execution tracker progress can we give it one of the things it's supposed to give me is so one of the outputs of this sub flow is supposed to be a tracker the ID yeah the ID of the tracker but I don't see that that's a thing that I have here maybe it wait maybe in the sub flow it actually waits ah hopefully they built the sub flow to wait until the trackers died that's that's what I'm hoping for maybe they already did this part let's go look so I built this by hand last time because I didn't know the sub flow existed let's go look to see what's in the sub thing so in our sub flow let's collapse these guys we get awesome logs and we wait until tracker completes excellent good so it's handling all that for me nice so I don't have to so I just execute all of those sweets I don't have to do get this execution tracker or wait into a completes because it's already doing that but what I do want to do is collect I want to make some decisions based off of the if I get a failure I want to abort or reduce yeah I don't want to peer review your development if it didn't pass the IETF to us yeah same so we want we want to change the state so let's just send back mmm so this is a sub flow and I'm thinking I'm thinking I don't want this whole thing as a sub flow anymore now that I don't have to build the rest of that yessiree logic I don't know that I want because what I want to do with a reject or a pass at this stage is write directly back to the record yeah so with that I want these things yeah so if that sub flow is already gonna do most of what you wanted to do in your sub flow we could just put that in the main flow so I either have to do that or get the record from the the trigger record and pass it down hmm let's so I only have access to so to is only going to be inside of this for each so like I can't reference these things outside of this for each yeah so I need to do some logic here so how about I have an output that is test success and that is true/false sounds good true/false and then we'll handle me I default it to false where's that default value is that did you just default it to true I don't know how there we go oh it did it's it's obviously new yeah I was toggling for yes I would like a default value yes please yes please where's my box to put the default value in default values false and down here my in my for each I would like to have a flow logic is if the I get any errors so like errors is ooh I want like math here buddy can I get some numerical oh it's a strange ooh no it isn't Oh transform functions this is one of my favorite I don't have anybody caught that in my reaction but so no it is it I want to I want to turn a string into a number where's the string to a number simple math no no no I want it to be a number can I can I you wanna do a what do you want to do to the answer if it's nonzero I want to do something so if it's greater than zero so I kind of want a number test error count can we make it is there I wouldn't call that a parsefloat I that right yeah but I but that's not a I want to use this and I was promised that there would be a switch from string to integer I was told I was foretold that there was one of those and I want it now maybe if I don't put it here but I I use it somewhere else let's check that let's put it like it doesn't even matter what this is I'm gonna put a string over here and see if I have different options based off of the field type that I'm in well it that disappeared it so that that's not figured the filter yeah how about yeah table okay oh can you what if you did oh like a log okay let's test success that that thing's angry with me we're gonna make it go away and we'll do a what like it said we'll do a log yeah and we'll say the message is this but you are now a number I got feel like I had made a couple more of those string I mean I could do a sum and I get a number I don't need this but maybe that's what I do it'll be an integer let's see failure kill transform into a song sure I know I said do it let's collapse this slide transforms so you have applied this some transform already do you want to keep going I think is what I guess no oh it didn't it's not smart enough to detect that I have a condition different conditions now well is not zero I guess it's fine I could have done that without the transform so if it's not zero that's success and that's fine or if it is zero that's zero it's bad so action if it is zero yeah I want the opposite yeah zero means no failures right is zero then I want you to do something action is we're setting of value the actions I want to we want to go the other way right we we should probably make it true by default and then we're looping through tests and if any of them fail we want to set it to false I was doing failure is the default yeah but this way so if you don't have any test Suites you fail that's true but we would like it if you look through 3:23 test Suites and two of them pass but one of them fails that's a fail oh yes that's true so I do want the check to be I want the the action is - yeah you're right so the actions should be set it to false never to set it to true from here yeah start true yeah ah boo was too much fun to set it to false okay we get a default value so I want to edit that output how do I adit that data pill oh I want to set the output how do I do that that is a great question how's this get set don't we subfloor outputs is there an action for setting an output how does the output yeah how do I set that I know how to do actions yeah is it an option under here now that's sub flows logic logic assigned sub flow output ah yes there we go I knew I could figure it out and had to exist you just have to have faith it has to exist therefore you can find it so we are gonna set that false if we're gonna have to change the logic but so if it's not zero we set the output to false yes and then then we're done yeah with so if there's no test Suites then we automatically pass yeah which is which is bad but whatever it's fine it's good as a developer I'm just never gonna create a new test check no it always passes so now our output so we take in a scope and we output it yes or no save so over here floo peer review and deploy we're going to invoke that sub flow which is not visible because that became a pop out where's the this one that may not show draft sub flows so here we go so flow doo-doo-doo show me my sub flow come on I hit publish be nice to me the publish button was there again musta aired then if the publish button is still there you can do it needs to hurry up so we can have success I know I want to put this sub flow in a you know flow and then that'll be success won't be victory but it'll be you know step one on the road oh it's angry you're about to get it reload it looks like it's published it's published all right now we open up our flow we pull in our sub flow there we go look up tests we have to give it a scope and we're gonna pretend like this ooh we have that ha ha ha ha we have this scope I don't care that it's not a reference field I'm gonna I'm going to get it from a reference field is the the update set application Oh go BAM yes you can't you can't fool me that's like oh that's a legit dot walk there that was a legit six levels deep and that's what you don't want to do over here and there in the side that's it that's a lot of lot of dog walking so now we want to based off of that we're going to flow logic it right so the output of our lookup test is we're going to say if tests fail send back to developer and we're going to get this test success and if it's C I need to test success true is right so we want faults is go back to the developer is we're going to set a record set update record day update record and we're going to update our story record and we're gonna say date goes back to work in progress or ready in fact and we're gonna say need some sort of nasty message yeah yeah we're absolutely gonna write your tests failed next the intensity of the message should match how hard it was to build the flow and then assuming that it didn't we we will update the record and move it to the next stage and then that'll be it for the day so our story record succeeded in testing and now it's ready for peer review so we're going to set the state into test which will be our peer review and we'll even put in a nice message automated testing as passed cuz caps means more powerful that's right you but Lord doesn't exist see disease to peer save it we're shipping it when I am gonna test it we're shipping it let's go race alright so I will stop the screen share and we'll pop back to video it got significantly darker oh what am I I am darker the sun's going down yeah it is uh it's not quite too dark in here cuz I'm in my Sun Room and it's pointed right at me but I still turn on my lights cuz soon like two weeks ago it was like dark in here at this time so that was good though we we got one we learned that the CI CD folks the Davis kale team actually built us some sub flows that are all we recreated at least one of those sub flows I would have been sure would have been nice if I had looked at that beforehand but whatever it's fine we learned useful things about the building sub flows on that previous show but it's nice to know that they're there and they're already doing the wait for my execution to complete and I was like man this is tedious to build this which is why I was doing it in a sub flow cuz I was like I'm gonna need this repeatedly this you know check look up my tracker and then wait for my tracker to be ready Andrea you know re-execute it over and over until it's ready so that's great that that's there fine thank you Thank You Davis gale team I just wish I had looked I didn't see in that in the documentation at all it might be but I didn't see it so how was your oh well I'm not quite ready to wrap up let's uh coming up I'll be in Madison Wisconsin for a hackathon in two years um so I was just in Austin last week we met with some customers Brad and I did and we went to a developer meet up at the brute aureum in Austin and that was a lot of fun so it was really great to see any of you that came out for that thank you for glad fast for also co-hosting that event with us there's some great folks in Austin who visited and chatted with us for several hours Thursday night last week if you have a developer meetup in your area go ahead and join it and get engaged if you're not visit the developer site developer service now Tom if you're interested in starting up a meet-up but also you know there is a health scare out there right now so I'm advising our meetup organizers to you know take that into account for their local area and and be be safe but in general meetups are awesome engage with other ServiceNow developers either through the community site the slack site here in video or in person because they are working on similar problems to you that you are you you frequently engage with developers in your local area right Brett I do yeah I'm kind of in between some developer meetups so I try to hit up a few of them but yeah it's a good it's a great place to you know meet developers answer questions see what people are doing and in its developer focused rather than you know seeing a lot of a lot of sales and marketing stuff so it's nice and in coming up in May barring any changes we'll have our big conference knowledge so knowledge service now calm Brad and I will certainly be there we'll be right in the center of the Creator Kahn space on the expo hall running the competition working on the developer theater so you'll definitely be able to find us there let's raid our beers it was successful successful day so this is up to you but on a successful day my beer gets a point to five extra oh nice Lauretta success bomb so what's your beer today so my show up there we go my murder static nice bombastic murder stuff I mean it gets a little bit of points for the name I mean style points are valuable points and then it was good I like some spice in a drink and it was successful so I'm gonna have to go for point five that's that's pretty impressive I don't have a lot of beers at the four point five level but I'm about to add 1 so this Edmonds host brewing I don't know where they're at where they at Charleston South Carolina noise OH order of magnitude Imperial sour ale it's doing it for me and it's it's quite good I think it's a 4/5 nice that's a it's join in like 10 or less beers in my four five category so that's a rare rare area so thank you everyone for joining us today Thank You Brad coming on to the team doing our first show that's actually gonna be saved on YouTube uh Brad will be leading the show next week he will be showing off some new things completely new things that no one else has seen and we're gonna we're gonna be showing that live next Friday and as well as hopefully we'll be able to show off some other new things next week so look for some changes next week in the developer ecosystem and with that thank you everyone for joining us and Brad can press the buttons

View original source

https://www.youtube.com/watch?v=CfVF_s8l9Zo