 Welcome. It's the 7th of July 2023. This is documentation office hours for the Jenkins project. Today's topics, Google summer of code. Open poll requests and a forewarning that I'm not going to be this meeting won't happen next week or the following week. Any other topics you want to put on the list. No. Okay, so let's put this here. Great. All right. So, on the Google summer of code topic. Congratulations, you did a great job on the presentation Ashutosh well done slides for the presentation are available here. And the recording from the webinar is available here. So thanks very, very much. It was a very enjoyable session. A lot of fun. Any any inputs or any comments you want to make on that experience. It was the first time presenting presenting in this style so it was a nice experience. I was nervous at first, but I did practice for today for last two days I was practicing and fixing errors on the slide so it was nice experience. Great. All right and if I remember right you were were you the second presenter the third presenter. Last okay so we should embed a link to your destination in the slides because that way we've got it here. Okay, so your slides are here doc. Okay, good. So what we'll do is we'll copy a video URL to that. Well done. Very good. All right. So, let's shall we spend some time focus then on on that Docker quick start work that you were doing. I had thought you were out so Bruno had done to pull requests that he mentioned, and I had done some experimenting you want to do you want to do have some any questions about my experiments or any things that you would like to do specifically. So, for the past two three days I was mostly focused on the midterm so I didn't read it all the issues in detail that do not open, but I did read your PR right now. So, for the updating plugins, we were thinking of updating them eventually with update dot CLI or something like that. So, the PR you shared does this script does all that places that a bit of CLI. So, no what that's that script is how I manage them personally so update CLI would also be fine. Update CLI for me is more complicated, because when I run that script. The script does the all the work of update CLI for me without without having to try to teach update CLI how to understand Jenkins versions. So I would I would guide you probably for plug in updates at least away from update CLI because update CLI never will never understand. How do I describe it, the Jenkins plug in installation manager understands Jenkins versions and dependencies, whereas update CLI does not. So that's one I can discuss it with Bruno separately to be sure he understands why I think update CLI is probably not a not a good choice in this case. I can also mentioned that implementing upgrade CLI will be a hassle. Good. Yes. Yeah, so so the technique I've used is is simpler than update CLI in the sense that all it does is. Let's see let's go look at that pull request shall we because the pull request gives us gives us an indication of it. So update the plug in list inside the description of the plug in list is that that little shell script I use to update and run this thing does it downloads the plug in installation manager creates the directory and then runs it using the plug in list. Now that's that's probably not the right thing for you to do, but for me it was it's a relatively easy thing to do. So let's go look now let's see where was it so that let me embed a link to that pull request. What I would suggest is you could take that pull request as is, and just merge it, because it won't do any harm to the to the environment, and then later you can decide what you want to do with in terms of plugin updates. All this is doing is updating the versions of the plug in a whoops now why okay sorry I made a mistake. I was current and obviously I've done damage to a file so this, this pull request needs to be corrected. Let's make a note on that request change okay needs to have unexpected changes removed. Sorry about that. And that was really a bit. Well and that shouldn't be changed in this pull request right this pull request was intended to only do a plugins update I'm obviously I made a mistake when I was creating the the commit. Do you mind if I take a minute and fix that now well since I made that mistake. Okay, so let's check out that pull request. Hi Meg. Hello. I don't know thanks for joining. It was quarter of and I just just chatting and slack on with somebody else over there and I looked at the clock and I was like oh god. Okay, so it's dash save. Oh, sorry I have to make some other fixes while I'm here Ashutosh it'll be just a moment. I don't, I haven't used it up so much. So I'm also learning. Okay, I always like it when Mark makes a mistake it makes me feel so much better. Right, right. That's what we need is we need to see more mistakes. Well, no I see so many of my own it's just refreshing when I see that you know what can happen to you to so. So here we go so let's see we were on this one and oh it's not called masters called main isn't it. Okay, interesting. So why, why did that. Okay, now I don't understand it Ashutosh. All right, so I look at this I want to merge into main from update plugins, but it shows two files changed but in my diff I only see one. Let's fix a few other things while we're here. Origin is correct. Update plugins is using origin. I made a mistake. Okay, now we should see my mistake has been repaired. Okay, and my mistake is repaired. Now I should touch one of the things when you merge this, you would do me a favor. Instead, if you're willing to merge it you do me a favor if you would squash merge it. So on your user interface what you'll see in this section here is an option to do. Let's see let's open up an example and show you one. Let's look at Jenkins.io. I can share my screen if you want I already have the same. Oh great so if you've got it up and running let's turn off screen sharing for me and we'll let you share your screen and we can work through it. Perfect. Okay, so scroll upwards. Is there a refresh? Okay, interest. Okay, so refresh your page. Because it should show only one file change not to it does good. Okay, one file change. And now if we look at this file, it should just be the plugins text file, which it is good. Very good. So now go back to the conversation. And there at the bottom in on the green merge pull request button there's a drop down list. Yeah, click that and quick squash and merge, because what that does is that hides my embarrassment. And it keeps your your commit history clean. Yeah, so what it does is it constructs a commit message that is the combination of all the commits that were in it but it creates only one commit. Okay, okay. So now if you just hit confirm squash and merge. Very good. All right now what I can do is I'll be able to switch to mine and pull in your change. Yes, if you'd like to stop the sharing again. Okay, and let's I can start sharing mine so that we can see what's happening there. So share. All right, so what you'll see here is let's make the text big enough to read. I just did a get pull. And it brought in your change. The change that was just merged by you from me. So now when we look at get log we see here is my log message. And now I'm going to clean up a little bit of my debris. Great. Now I had started the demonstrate I'd started running the demonstration that you've got and I actually was just using Bruno's no JS sample. And like we could test drive the, the one that we just made the change to instead, what do you, is there something particularly you'd like to do next. The one we just made changes to that that is the default one we can test that one. Okay. We need to stop that one and Docker compose minus F and the one we're going to stop is this one. No, no, I was using I was using Bruno's okay I'll have to do it the hard way, because I've changed branches and so I can no longer see Bruno's file. So I'm going to use Docker Docker PS. So if I say dot slash Jenkins underscore in it. And here, is it new. Yes. Okay. All right so now what this should do oh, oh it says I've already got a container in use. Yes, I have to prune that container. And now let's try that again. Interesting. Okay, so it did not. Okay, do you use the image that. So it didn't detect my change to plugins dot txt. Interesting. Okay now I've got to think about why it didn't detect that. So when I run it, when we look at this will see. I'm going to bring it up and we'll look at it on on a shared screen so here's that computer. And I'm going to open the Jenkins controller on it. Here it is so now I log in as the user admin with the password admin. And now we've got this simple demo job. And when I run it. We will see that it will run. It ran on the built in. Oh, so the one of the gaps here is the built in note has not been configured with zero executors. I'm not testing it ran with the agent. Oh, wait a sec. Okay, this is a pipeline job. Is that correct. Yes, yes. Yeah, okay, so I just misread it. Let's let's fix my we. It is correctly configured to not have any executors on the controller and let's prove that just a moment. Yeah, so it does have zero my mistake. What I saw there was the pipeline doing its checkout of the of the Jenkins file and that has to happen on the controller, but that's not actually execution of the job. So you're correct. This is this did run if we look at where it runs we'll see in the log file it will say running on Docker SSH Jenkins agent. Good. So we've got an agent now one of the complexities hiding here is that there is. There is a warning dialogue that appears you see this it appears your reverse proxy setup is broken. And we do have open issue with right now with this warning. Good. So, so when I fought with that issue myself on mine. I had to set this Jenkins URL. And the challenge for me was, I can't set that Jenkins URL from inside the Docker container because inside the container I don't know the host name of the computer that's hosting the container. So I'm not it's not obvious to me how to solve that. Now from Jenkins in it.sh I think you could solve it because there you know the host name. But the problem is we want to eventually get away from Jenkins that sh I think and shift towards just using Docker compose directly. So, I still don't know quite how to solve it but you say you've got an issue already tracking it. Great. Okay. And it looks like the job is configured to run periodically is that right. Yes. Thanks. So it runs every two minutes. Good. Okay. Now the in order to stop it. I can't just do a Docker compose down or I guess in this case I probably can do a Docker compose down. So long as I tell it what file name I want to use. Right. You can, you can use the here on script. It automatically detects and. Oh, okay, there is a tear down script. I didn't realize that nice. Very good. Okay. Oh, and I should have just read the instructions. Good. Thank you. Good. So it looks really promising Ashutosh anything else you'd like to explore together or things that we should work together on. I was wondering why that change didn't reflect when we then then it's good. Let's let's take a look and see. So, so let's see what we when I when I ran Jenkins in it. Let's read what it did and let's see if we can make some guesses. Okay, so it ran it runs a series of steps creates the SSH keys and then does start tutorial right and start tutorial says Docker compose of this. So let's look at those on the second second examples that it ran there with Docker command F with the option. Yeah, so let's look at that file and see if we can understand what happened. I think it'll be. I think I can explain it, but let's just be sure so this one now inside here there's a Docker compose.yaml that says, build. Docker files right. And so in Docker files. There will be a Docker file here. And because I had already built. That's interesting. I'm curious why you need to do this. Yeah, I was. And we didn't, they didn't have permissions to access the table jobs without it. Yeah, interesting. Okay, that may need some further further exploring because in general we shouldn't have to do that, because it should already be set that way. Interesting. Okay, so let's let's but the thing that's happening is right here but because of the way Docker thinks about changes. It only perceives a change. If the Docker file script changes, not if the one of the files that the script is tracking changes. So this copy of Jenkins plugins that TXT, did not cause the Docker cache to be invalidated because it hadn't changed. If I changed this so instead of 2.0 if I change it to 2.401.2. Even better, I'm going to change this because I like Java 17. Now, I want to change this to be a Java 17 version. So that is just a minute while I go find it. What's the, what's the Docker container name for Java 17. Let's make it 2.401.2 JDK 17. We'll try that. Okay, and you said what I can do now is I can do a Jenkins tear down. I thought I was still running. Oh, not. Okay, good. So now if I do a Jenkins in it. So what's changed what's changed here is, let's go even further. Branch. I'm going to put myself on a branch and we're going to make this use JDK 17. And now when I say Jenkins in it, we're expecting that what it will do is it has to download. So that means it chose something different. This one runs the default default job that is on the root directory. So we didn't change that one. Okay, so let's fix. Let's do that then. Okay, and it says. Well, wait a second. It didn't do it then either. Interesting. Why not? Oh, no, no, it did. It's now running a Java 17 agent. Oh, no, it was was this was this before that it was. Well, let's look. There's a reason we have a web browser. And the agent was Java 17 before to I think we changed the controller. Okay, so you were running Java 17 on the agent, but Java 11 on the controller. I'm confused now. Yeah, let's let's do some looking let's see. Okay, so. Meg excuse us just going at this but I think that's fine. I'm fine. Okay. All right, here we are. So we've got to that for a Wanda to and if we go to log in. We say manage. Oh, let's look at the system information and show all the values and we'll see we are definitely running Java. Oh, no, it's still running Java 11. Okay, so it definitely did not apply the change that I had put in that file. Not. Okay, so we said Jenkins in it SH new. And what it says is for new it's going to use bar three. Oh, two. Right. And that's the one that we used here where we made the change. Oh, two Docker files. Docker file. You can see the change this you can see the change I can see the change. Oh, we didn't delete the previous image. Well, but, but the Oh, and is this doing a and working with a named container. When it does the build. So, I don't know how Docker compose works. Does it use a. We use the dash dash build argument at the end of the dog. We do. Okay. Well, so Docker bill. Oh, that's right. It was Docker compose right. Oh, but here there's no minus minus build. Okay. Well, let's, let's see, let's see if that helps because this may tell us if that's a, if that's a useful thing. So let's do the Jenkins in it. And now it's building. Okay, so now we should and now it's using Java 17 in the controller. PS. Okay, so now let's try connecting and see what it tells us. Hey, my computer's a little bit slow, apparently. Just take time in my computer. It works faster on good for some reason. Yeah, get pod probably has much more than in two and a half gigahertz Intel i5 from who knows how many generations ago that computer is. And I've only got eight gig of memory. So yeah, old computers doing old work. All right, here we go. Log in. Oh, whoops, no, not that I want to be admin admin. Okay, and now we see here it's still 2.401.2 but if we go to manage Jenkins and we look at the system information, it should show us that it's running Java 17. And now the agent is should also show us that it's running Java 17, which it is good. Okay, so I think that's a useful change already. Because we want the controller and the agent to use the same version of JDK. So I'm going to go ahead and push this as another as another pull request. Okay, so without the minus minus build art changes to the container definition are not rebuilt. Okay, so Ashutosh you'll see a pull request arriving now. And I wanted to take a look to see if there were any other surprises here. Oh right, the one I wanted to do the quick fix here was this one system and fix that. The security folks are going to fret I suspect about us using default username and password but I assume that's something we may have to work on later to figure out how do we, how do we show the the login password to the user when we started it with Docker compose. That user, the, the generated password. If we didn't create the admin user would be in the Docker log. That's here. Good. Okay. Anything else you'd like to explore explore Ashutosh while we're here. No, I also wanted to ask about the documentation process how how it will you go after, after the tutorial set up. But what I hope we will do is actually have you, or I would prefer you be the one who submits the pull request that what you'll do is submit a pull request to Jenkins that I O proposing to simplify the documentation. And if, if that's a challenge for you or it gets in your way let us know and we'll help you here and be very happy to help you do it so what you do is you would go into first place we would go is to the Docker install guide. So let's let's look at the page this way. So let's go to the Jenkins documentation documentation installing Jenkins in Docker. And here at the bottom of this page is an improve this page link. And when you click the improve this page link it should take you to this file that gives the Docker installation instructions out. Unfortunately, it's using an include. So we'll have to go to another page that actually has the real instructions like this. But this is where that horrible horrible nightmarish thing is that says, look, here all these detailed instructions, and either you or my first preference is you but if not you then me or Meg or Kevin Martins or Bruno would replace all of this awful thing with Docker space compose up minus D minus or with first day how do you get the compose file, you know, I get pull of the repository something like that. Does that make sense. Yes. Now the where do we host that repository. Put it in your repository for now and ultimately I suspect we will want to have it in the Jenkins dash docs. I think that's where we have the repositories, because that's where we have the other examples. So, here's where we've got the simple maven app and we would just put one more here on the popular repositories list. And it would be, I don't know Docker compose or something like that, or Jenkins install. You will will have to negotiate what name we give the repository. Yeah, I got. Thank you. Okay, now in terms of plug in version management that it's it's I think plug in version management is less important than figuring out how to do the complete no JS tutorial. Maven tutorial. We had, you know, opened an issue. Like, two, three weeks ago about the plugins. So it was open for a long time. That's why. Good. Okay, so, so you're not you're not working on it you're not wasting time on it. Very good. Oh, good. Yes. Good ideas here. Very good. Okay. And I like that you're using get pod, although that seems like that would be really complicated. Has it been, has it been helping or hindering you using get pod for development. No, it's good for testing like the testing will possess. It's good because it provides this set up every time with new workspace. Okay, I like it. Nice. All right. Yeah, and this one it's not just that the get pod reverse proxy is set up is broken. It's really that because good part also uses custom. You are. Right. It's also broken on a local installation. Not just on get bad. Yeah, good. Any other topics you want to review while we're here. No, that's it. Okay, so Meg, the next topic I had was this one. I wanted to bring it up. Where is it? Oh, it's not on my list anymore. Okay, so I, I did repairs to this pull request so that it should now build. Let's confirm it does good first step. Yeah, and it builds successfully now so that's good, but I've also updated. And this is one where I wanted to review with you and I think if you and I review it here and we're okay with it. I may just go ahead and merge it. Wow. So the best practices page after Jeffrey Chan's work, I've done some further revisions. Let's look at it together and see what we think of it. Good. Okay, so here under the, I think it's under using Jenkins, which is not in the top level using Jenkins best practices. Okay. So the way it's laid out right now is first recommendation use organization folders. So that's a use pipeline with the maximum optimum maximum automation. So it will read GitHub, or it will read GitLab or Bitbucket or giddy, and generate multi branch jobs for every repository it finds that has a Jenkins file in it. Maximum automation. If you if you can't do that. And then it's got links, it's got embedded videos from Darren for four of the of those top level things right GitHub, Bitbucket, GitLab, Bitbucket and giddy. Now, if you can't do that, then I put in. Okay, fine. If you can't do use organization fault folders for whatever reason, then you should use multi branch pipelines. Okay. Now I didn't embed a video with from Darren on multi branch pipelines but maybe it's worth a search to see. Let's see how would we do that Darren hope multi branch pipelines. Video. Okay, there it is. So we probably should embed that one. Oh, let's see no way to sec way to sec. Maybe we've got something even better the GitHub one. Yeah. Okay now now there's a question for you and for me. Should we put. Here's one. Here's the other. Here's the third. And each of these is potentially a useful video to embed there as well so. Okay, so this one's for GitHub branch source. Yeah, I think this. Again is a good place for them to. What do you think Meg would you do you think it's it's okay for us to embed another round of videos in that page, just like we did organization folders, put it next for multi branch pipelines. I agree. Okay, all right. And this one I think is the same one as this one. They did the same graphics. Yeah. No, they're different. Okay, so now I don't know which one is the newer of the two. Oh, oh, this is cloud BCI. No, no, don't do that. Okay, that's why that's why the same thing but here we've got three videos one on GitHub branch source. One on GitLab multi branch and one on bit bucket cloud. Yep. Good. So, so you're okay if I embed each of those three into that best practices page. Very good. Yes. Okay, good. So that would give us more video content for use multi branch pipelines. Then the next level for me was hey, if, if you can't use multi branch pipelines, fine use pipeline. What we've got is a layered approach there and then the next one is a don't. Don't use the Maven job type. And this one is a I only realized this today while thinking about it that the Maven job type we've been recommending for a very long time since ever since 20. Well, let's go read it. I think the original blog post was from Stephen Connelly in 2013. So 10 years ago, he said that job type is evil. And that documentation is now embedded his description of the job type being evil is now included in the plugins own documentation. Right. To tell people really you should reconsider if you're using this job type. Yeah. So my thought was that's a good thing to include saying get off this don't don't be using that one. Right. So then the next best practice was, wait a minute, let's go back to those though. Okay, go ahead. Those are not for best practices. There's an arching. There's a theme there. Oh, right. Right. You're right. There are. If I glance at this, I say, okay, I should use organizational for holders and I should use Maldi branch and I should do pipeline. Right. For separate things. So I'd like, yeah, I kind of like to see those all go down a level and put into one section. What are we doing? We want the maximum automation and, you know, this sort of stuff. And you have these options and descending order of priority or whatever. Right. So what if I, you're, you're absolutely right. Very good. What if the top level here instead of use organization folders, this would go down a level but the top level was automate job maintenance. Or automate job. See, I hesitate to say crud or create, read, create, update, delete. Maybe it is automate job maintenance because that for me is, is, is a best practice. Right. It should be and let's, so let's do that. Let's, let's be sure. It's actually structure your project for maximum automatic. That, that I don't understand the awkward. Well, what I don't understand is the structure for me it's, it's just a use the verb is is is. Okay. But, but let's let's test it let's get it running and we'll look at it and see. Okay, so PR checkout. Okay. That one. All right, so now I'm sure there's a better way to do this, but I don't remember how. Okay, so here we go. So instead of use organization folders, we're going to put that in one level. We're going to put this one in one level and we're going to put this one in one level. And now that has the nice benefit that will also highlight the don't use maven job type. Okay, so automate job. Let's finish. No, how about testing ideas here, my case. Keep wanting to come back to structure and it's probably this. Okay, well, let's put your, let's put your idea. Automate job structure. No, it's the structure to me, the, the organizational folders or the pipelines or the multi branch are structural issues. Right. But it's something it's like structure your project for maximum automation but it's you can't dance to that Denise. What if the header is yours, automate job definition. Okay. And then you have an introductory paragraph that includes the word, you know, though, you, oh, right, right. Okay, the structure of whatever ever determines the level of automation you achieve and something to that I. Okay, so something like so and that we've got here where it says organization folders like this so it's something about. Jenkins can automatically create update and delete jobs based on the repositories. It detects in your source control software configuration management system just a minute. Use that automation. Structure your, okay, let's structure your job definitions to. Yeah, benefit to okay to get the most okay now I'm going to me writing live is really dangerous. Get the most benefit from Jenkins automation. Job from automatic job definitely from automatic job management by Jenkins. How about this. Yeah. Okay. And now if this were deleted, and it immediately goes right into use organization folders. So there, God, pure writing we need us you'd say you have these three options. Right. In descending, you know, oh right right exactly. And something you know and you could say this is the best way and. Right right exactly so it is, there are multiple alternatives. Yeah, for job for automatic job management right right. Including. And if I remember right the markup syntax is this. I manage create new folders. Create update and delete new delete multi branch pipelines and their jobs automatically. Something like this. Yeah. Create update and delete pipelines pipeline. Okay pipeline jobs folders and their job pipeline jobs. Let's make it like this. What do you think. Okay, yeah, good. All right. Unambiguous. And it just by using shorter line text each time. The reader may already get a hint. Oh, I should use the one that's got the longer line. It does more stuff for me. Right. And this is manually managed defined pipeline jobs. Okay, now in each section. Why would I not use the organizational folders. Because if you if you have too much stuff in your organization, and you're not willing to define subsets. Okay. But everybody should define subsets. I mean, it's easy to do. Right. I'm thinking about a word, a word or two, you know, as I look at this. So this. So now I've got these three options that you all say. Fulfill this. How do I choose between them or right. And exactly. Isn't it. That we just say preferred. Because here it says. If you use any of these things. Get have organizations, but bucket teams get lab groups or giddy organizations. Then you should use. Organization folders. Okay. Now, maybe you're a get lab user like me, who is a lone isolated person and you don't have any get lab groups to find. Then you can't use it. Right. Or maybe your giddy giddy system doesn't have an organization to find. It's just got one user. Right. Then then you can't use it. And so then your choice is multi branch pipelines. Okay. And where you say it's something prevents you from using. Okay. Yeah. So, so the idea is. If something prevents you from using organization folders. Use multi branch. Mm hmm. I think. It would be fun to say you should reconsider your life choices. But that's, that's not appropriate. Right. It's something prevents you from using organization folders. You need to ask why. Because really you want the automation, but that this is trying to be more polite than that. Right. And it's, well, and it's, it's also a size of scale too. Like, you know, you've got a very small project or something that you're right, right. Then. Yeah, exactly. So. Okay. So here's our automate job definition and our, we came. Yeah. Oops. Oops. Use pipeline use. Yes, that's good. We've got everything there. So I'm going to go ahead and push this. Except you don't have Maven is under that section. And you don't have that in the lead in. Oh, no, no. Maven is not under the section. Hang on. Just a minute. Let me get this. Oh, don't use Maven is separate. Okay. It's a top level. Okay. It's a level two head. Right. So. Okay. Automate. Job definition. Okay. So now. We'll see that I'm one ahead. I'm going to push that. And while that's doing that, I'm going to actually build it and we're going to take a look at it just to be sure that it. It renders the way we think it should. And we've almost run out of time. So we will just get this done. And then we'll call ourselves done for the day. Okay. I should touch. Thank you very much for joining us. We sure appreciate your, your work on the project. And I thank you guys. Nice work. Okay. So here is the page. And now if we jump into managing. Into using Jenkins best practices. So here's how it looks now automate job definition has three things under it. Don't use the Maven job type. So we start with a positive. Automate jobs. Then we give a negative. Don't use Maven. Don't use the Maven job type. It's okay to use Maven build with Maven all day long. It's great. And then more of the same. And it'd be nice. I'd like to see. There's an old, it's sort of an arbitrary thing, but there's a rule of seven that a list of stuff that's more than seven is hard to comprehend. Oh, good. Okay. So let's talk about. And that's what is where, you know, are there others of these that could be combined? Cause they're all good issues, but so that there's subheadings, you know, it makes it easier for the mind to grasp that this. It starts to look like a phone book. Well, and it's a good point. There are some of these, I think that could just be dropped to apply the rule of seven. So for instance, show failures to the right people. Might be a subset of report build results. Yeah. In fact, it is right. It makes sense. Or they might all go together. What else have you got? Well, okay. So what about, for instance, if we said in terms of job, well, see use simple project names doesn't matter at all. If you follow the advice of automate job definition, because it will do it automatically for you. So this one should probably just be dropped completely. Yeah, but there's some people who aren't going to do that. It's, it's good to, I mean, we still see it with these people. They've got a 260. Kubernetes gives for most names of most objects, a 263 character limit. Right. And we have a lot of people who are having trouble with that. Oh dear. Okay. And what it turns out is they're taking like file names that are being auto generated to have 20. Yeah. They're time and date or something like that, you know, they're packing a database into a 260 character string. Yeah. Right. But I think the, those of us who grew up with Unix and six character limits meeting Java people always say, think in terms of short names. Uh huh. Right. People do tend to confuse titles and novels. Yes, absolutely. Okay. So back to, so there are, for instance, this strive for reproducible builds. I think I'm actually just going to remove it because it's a, it's a, it's an aspirational thing, not a, I like it. Oh yeah. But, but the problem is it's not something you can do with just Jenkins. That one is so aspirational that you're saying, Oh, here, here's a great guideline and, but there are lots of those kinds of great guidelines. I'm taking it out. Yeah. Yeah. Get over it. I'm taking it out. Okay. Now. Okay. Let's see, but it was this one was show failures to the right people really belongs under report build results. It just makes sense. Right. That's, that's, and then. Now what are some others. Here in terms of things that we could. Okay. So we put this one underneath event. Okay. Prevent resource collision in parallel jobs for me is. Maybe this one is. Oh, what about this? What if we had a section that was dedicated to controller management. So let's put it this way. Controller management. Right. Or no, I've been phrasing them as verb start with manage. Your controller. Yeah. Or manage the controller. And now it's secure the controller. And backup the controller. Ah, yeah. Like this, right? Mm hmm. The Jenkins controller. And. Avoid scheduling overload is again a. A way to manage the controller so that you don't overload it. Okay. Prevent resource collisions in parallel jobs is also a management thing. So that's good. Okay. Now. So, okay, maybe this is me. Maybe this is a different thing. What if. We had a top level theme that was manager jobs. And then manage your controllers. Oh, nice. We no longer have one to not run your bills on the controller. Oh, no, we've got that. So build on agents. Oh, yes. Okay. So. So is it. Manage your. Jobs. Okay. So manage your jobs by building on agents. By using simple project names and by finger printing your dependencies. Okay. That one may not be as good a fit because that's, that's really manager artifacts. I could say my artifacts are part of my jobs. Yeah. Well, the, okay. So. Hmm. Well, I, I'm not sure I'm, I'm entirely sold yet, but I think, I think this is, this is getting better. And I really do have to stop. Okay. I think we got you thinking. Exactly. Well, and, and well enough that I think I can make more progress on it. Remember no meeting next week, no meeting the following week on for two weeks. So we'll see each other again in three weeks. And, and just have a good time, but just remember that when you leave the parents, you still need to live, live, live with those children. Thank you very much. My parents always told me when I went to my grandparents that it was okay. When I came home, I really remembered that home was not grandma's house. Right. And that's, that's very fair. Be, be kind to the parents of my grandchildren. Right. Not too kind, but be kind to the parents of my grandchildren. That's right. All right. The grownups is a difficult stage of life as the old song says. So. Excellent. Wonderful time. So we'll talk in three weeks, I guess. We'll talk in three weeks. Thanks very much. Thanks for joining. Thank you guys. Thank you. Have a good three weeks.