a full hour here. So I think I'll start. Hi everyone, welcome to the functional group update for build. I hope everyone can hear me. Yes, perfect. We had a functional group update only three weeks ago. So this, we usually have the five week cycle. But because of some changes in the schedule, it's only been three weeks. So in order to not have one minute group update where I would say, well, everything we said last time we were working on it. So bye. I decided to talk a bit more about something that is more related to the organization of the team than the actual work that is being done. But I hope it will be interesting for everyone to hear. And it might turn philosophical at some point. So bear with me. So let's start first. We're going to talk about work. And I'm not going to read the definition of work or anything. But I can say that effort to accomplish something and that's something, is something that defines the company. So that's the actual work that we want to do as a company. How do we achieve that? By scheduling tasks that will deliver certain results. So I asked myself in the past three weeks, since the last functional group update, why did the build team deliver only two scheduled tasks? If this is how we actually measure the result of success, like if this is successful or not, why did we only deliver two things in three weeks? Is it because we have very complex features? Probably. We do have features that have multiple layers and really difficult to find the start and finish. But we have been delivering things before and they've been similarly complex. So I thought maybe because our development cycle is not matching GitLab milestones. So everyone works from seven to seven. But build team kind of needs to scramble around the release date. So maybe that was it. And I know that we did work on something. So we worked our butts off in the past three weeks. And I was wondering maybe we can monitor work as well. So before the previous functional group update, I created a work issue board that has only four lanes. These lanes are used to explain how tasks come into the build team. So we have one lane that is for scheduled tasks. These tasks are the work that we agreed on before the milestone started. So this is the measure of our results. If we achieve all of the things that we scheduled, we are successful. But we also have unscheduled work. Unscheduled work is the work that also needs to happen in the milestone. But it is not something that we agreed upon before start of the milestone. So unscheduled work varies. It can be some task that came from another team. Or it could be a bug that we need to fix right now because it would break the release. But in any case, it is marking all of the work that we didn't anticipate. We also have internal work. Internal tasks are usually tasks that are not visible to anyone outside of the build team, even to our customers. Think of it as issues with technical debt or the infrastructure. So for example, if we need to create a server that will be used to build our packages, the end result is only visible to everyone else. The work that goes into debt is visible only to the build team. And finally, we have the maintenance tasks. Maintenance tasks are very tricky because they are very simple to do in theory. That means, for example, only upgraded inversion of the software that we ship. But that work is a silent killer because it takes a lot of time of you. For example, if you upgrade a version of software that we are shipping, you also need to test that change and test it in two cases. For example, installation and operate from the previous version to make sure that it didn't break something. And the screenshot I included is just the top layer of the issue board. And the numbers in there do not show the actual number of tasks that we had. Our issue boards only show open issues. I already created a request that we change our issue board to allow both open, closed, and all work that we have. So I collected some stats in the past three weeks. And the numbers are very telling. So we had scheduled nine tasks and we delivered two of them, like I mentioned. But we have had 20 unscheduled tasks that came in and we delivered 19 of them. We also had to do six internal tasks and we delivered all six of them. And finally, we had two maintenance tasks that we both delivered. Keep in mind that this is during one cycle. This is during one milestone that we had to do. So if you are simply looking at these numbers, and if you keep in mind that the schedule work is how you measure results, we failed as a team quite simply. However, luckily life is not that black and white. So I would say we are very successful. But we need to do something about the work we do. Can someone mute themselves? I hear someone is unmuted. Thank you. So how do we resolve this issue? So simplest resolution would be throw more money at it, hire someone. Sadly, our positions for the build engineer has been closed. We no longer can hire anyone and that is going to stay like that for the foreseeable future. You might want to say, well, just deliver what's agreed, right? But again, life does not work like that. So if we do that, everyone else will suffer, including our users and customers. We cannot say, okay, this is unscheduled. We agreed on this move on. One thing that we are doing, if something became a priority, we need to prioritize something else. So talk to the product manager of the team or the build lead. But that also is not okay because we just end up deprioritizing everything because everything else is more important. So one suggestion is to have some more capacity to handle unscheduled work. And this is actually valid, but that would mean that you have to have someone from the team who is able to handle all of the work that comes in. And what happens to the tasks which come from other teams that are completely unannounced, unforeseeable at all? Let me give you an example. One of the other teams last week asked two of the engineers in the build team to join a meeting. Both of them spent 30 minutes of their time in the meeting and they ended up agreeing to work. That is going to come by the end of next month without any consultation with everyone else. So you might ask, why did they even accept that unscheduled work? Well, first of all, because we at build team are super helpful. So we needed to do that. But ultimately it comes down to efficiency. Those two engineers are probably the only ones in the company that can handle the task that was asked from them in an efficient manner. Anyone else could have handled that task probably, but not in the same amount of time. They would probably spend days helping out the other team. And this is where I started thinking, wait, if I cannot give any task to anyone from the team, or if anyone from another team cannot handle the task that is in the build team, that sounded very familiar. And then it hit me, silos. We already created silos even in a very small team like the build team.  They're in my neighborhood. They're trying to figure out what to do with them. It's actually a really cool story, but more on that some other time. Anyway, how do we make sure that everyone within the team can actually do everything that the build team stands for, but also how do we help out everyone outside of the build team, so everyone in the company to help us out? So we came up with beginnings of something that should be very simple, I think. First of all, we decided we are going to have training sessions. If you deliver a feature as a build team member, your final task is going to be train everyone else in the team. The merge request I linked there gives you more detail, but the training is going to be a summary of the challenges that you encountered, the technical details that you had to implement, and it's going to also be a summary of the documentation you've written. So it's not only, it's not going to be replacing any of the tasks that you currently have. It's just going to add a bit more extra that is going to help everyone else in the team. What that also means is once you deliver the training, you are no longer the owner of the feature. You are the tutor for everyone else in the team, and it is completely expected from everyone else after the training to be able to handle the task. Maybe at the beginning with your help, but afterwards, you are no longer the owner of it. How about the rest of the company? Well, first of all, we added how to work with the build team in our build handbook. So if you take a look at that merge request, you'll see when you need to contact us. This is not a comprehensive list, but we try to be as descriptive as possible. If you're working in engineering, go there. And if you notice that any of the tasks that you are doing are covered in the handbook, talk to us. And finally, we started working on delivering packages and images on demand. What that actually means is everyone who works on community edition or enterprise edition project will have a button in their CEI that they will press and it will trigger a build of a package and the Dock Room image of the branch they just made. So this is the work in progress, and I really do expect us to finish this within the next two weeks. So in two weeks, I really do expect to have everyone come back to us and say, hey, this is awesome, or this is really bad, I need more. But ultimately, once you're working on your feature, you will have a ready production package that you can test out and that you can ultimately find out whether there is additional work that needs to be done by the build team. And ultimately, you can help us by proposing a solution while you are working on it. So with these three simple tasks that we did in the past three weeks, or are doing at the moment, we expect to break all the silos completely. Thanks for listening.


So, so mark I was trying to run the benchmarks on multiple platforms to so I saw one of your project, which is a multi configuration project where you use a matrix to label to run the whatever build in multiple agents. So I was, I was thinking of doing the same thing, but so I have three branches, three benchmarks I want to run. So it's a multi branch project. I'm not sure if if in a multi branch project I can add that configuration matrix. So, is there a combination, is there a project type of a project which I can use which mixes both of them or would I have to use a configuration multi configuration project with a simple pipeline and add my branches and then write some shell steps to run the benchmark Java command to run the benchmarks. How should I do it. So the, the, I think what you would want to do is use a declarative declare or use a pipeline. And we probably want to put it in as a, as a declarative pipeline, and let's use the matrix operator to do it. So that way you don't have to, you don't have to wrestle with the old school thing that I'm using I have those multi config projects because I want to be sure that I don't break compatibility. So not the best way to do it now the best way to do it now is declarative pipeline with matrix. So, so there's a there's a much better way to do it thanks to declarative pipeline. And you can find, you can find documentation about it on Jenkins.io. And I'll do that. Okay. So the second thing I think which we should discuss is the estimator class I've, I've raised your PR for that Fran and Omkar have reviewed it. They've given an initial review to it. So, so would you guys like me to discuss the design of the class or is it something you would, you would first want to review the PR and discover it yourself. And help you guys if I discuss what I've done and what I've thought about it, the experience for the class. So I'd like to hear the brief design design description for me at your insights or your comments can be quite helpful for me as I try to understand it. So, so I tried this the UML diagram. Hang on in Terry J. I'm not sure if this is going to be very helpful, but so the class, the repo estimator class size estimator class is it X it can work in two ways. The first is it has two constructors. The first requires a gate SCM SCM source object, which will be used to analyze if it has a cash dot get directory or not if it does it would calculate the size if it doesn't, it would switch it would, it would try to find an extension which has, which has implemented the extension point we've provided. The second constructor I've added is, so the first constructor limits us to multi branch projects. That is, that is the only place where we use a cash dot get directory we can find a cash directory so the second constructor would just ask for a repo you for the repository URL and would try to find the implementation of the extension point we've created and if it does exist, we would provide the recommendation on what get implementation the plugin should use for that project. So the input can be two things it can be the update SCM source object or repo URL, the output will always be a string which would either be which would either be yet j get or I've chosen none. If I don't want to recommend anything and want to use the default. Get to resolve by the plugin, how that is working I'm going to explain it more detail but this is the basic input and output of the class expectations. So, so I think I should directly show the code a little bit. And then one of the major problems right now we have which Fran has pointed out clearly, and that is something I need to work upon. After this discussion so so the first constructor it asks for the get SCM source so once it was its initialize the class it will. So how it calculates the size is that it I'll show you the method the method word try so we're not locking the cash we're just getting the entry then we're. Then we check if the cash directory if it exists, if we check that if it if it has a dot get directory or not if it does, we would calculate the size by size of directory API and store it in a class member and. And if it if this doesn't happen if we don't have a cache. The second option we have is to use an API. So for that I have created the extension point. The extension point I would like to show to you guys is. Where is the extension point. Yeah, here. The extension point right now is so when I was looking at the documentation of how to create an extension point I saw two ways of making it. One is through the singleton pattern and the second is the descriptor describable pattern. So to be very honest, I am not 100% sure on how the descriptor describable pattern is working singleton pattern I could understand what it was. How I could design I could how I could design the extension point through it. And I'm not sure if the decision of using it was and not using that that pattern is wrong here but what this is this extension point is expecting is is that I provide you the URL of the repository I assume that the implementer has the credentials for the user. And how did I reach to this assumption or to this analysis is that I looked at the github plugin brand source plugin. And I was looking at how I could initialize a client a github client. How are they how have they how they have wrapped the github APIs Java APIs. So I was looking that they either they need the user ID password or they can use a token. So initially I was thinking of passing the credentials from here as well but then I realized that the client there would. They would have the user credentials for the particular if they if the if the project is using that plugin they would also have the credentials. So for me, I think the only information I need to send to them is the repository URL and they would just need to. They would just need to send a get request on the repository URL to get the size through a JSON response from the API. So this is the only method the second method is is where I have the issues right now. So as I was looking at extension points what I could see was extension points in any plugin are made to extend the plugins functionality to other plugins as well. So we basically like I so my reference point was the listener extension point we have in in the get plugin within the get if if I want to be precise it's within get status. We have we have an extension point an extension point called listener. So I kind of model the extension point in a similar way and I can see that this this extension point is meant to provide the capability of listening to some updates. Now my extension point is very is different is actually opposite to this thing what we want is that we are not extending what we want is that we want other plugins output in our class. We don't want we're not sending them we're not extending any capability to them we're actually using their capability to get something for our need. So the issue with this this need is which Fran has pointed out that what I am doing right now is that I am using the extension list. And so I I expect that whatever plugin has implemented the repository size API. I would call the method for the repo URL I have and get the size of the repo. Now the issue with this is that this is a list I was while I was designing. It's actually very it's a huge mistake. While I was designing the extension point I I was only thinking about the GitHub brand source plugin and I never I actually it's a very the mistake is that I didn't think about other plugins which might also implement it and we would have a list of implementations and I don't have any method right now to distinguish which implementation I want to use. So Fran was suggesting suggested he in the PR that there we might want to find a way where we can use the URL to find out what kind of extension class we would want to use. So what I understood from his comment and he may he may clear me right now Fran you can clear me right here. I was what I what I got to know was that if I have a GitHub URL I would I would extract maybe the word GitHub from it and look for the class if through the list I would look for the class. Actually as I'm discussing this I this might not be possible so the part where I'm confused right now is how do I how do I clearly get to know which plugin classes are implementing this API. What I could find a find from yeah yes ma. Actually Fran Fran has much deeper experiences of Fran if you were going to say anything I will defer to you. You know what I what I wanted to say is a rich up a thing in a station extension just like in a class that is annotated in a special in a specific way. And in the moment that the plugin is installed or in the moment that the Jenkins instance is is being started is loaded and is available for any other component that's a component in the Jenkins instance. So a you are calculating the size of the rebel into ways the first one is just using the ticket catcher. Okay but the other one but the other one is just using the API that API is going to be totally dependent on the key system that you have behind you. It's not the same API for github that for kid lap down for the packet or whatever else. So a what I would like you to think about is the way that you say okay. Who's going to provide that API and the way to. A to calculate a site using the API. Each plugin is plugin that is depending on good plugin. So what we have to do is just to a as you have said a provide an abstract class that will be extended by. The other plugins. Those classes in those plugins can be annotated with extension class so we can. At any point in Jenkins we can always read from them in our case because we are going to to say okay give me the full list of reported repository size API classes. And we need. Mechanics to decide a of the full list because if in our Jenkins instance we have the key have plug in the kid lab to beat back it and so on and all of them. Are just sending and giving up and providing us the mechanics to. To discover the the size of the repository using the API. That list will contain all those extensions. So we need the mechanics to say.  I'm going to filter that list so I can get or or or I discuss the rest of the of the extension point. And I'm getting only the one that is going to give me the API for this a kick a kid have API the same for kid lab and so on. So what do you have doing here is just to creating a point something where the rest of the where the providers and we can also can have just some. Generic way to calculate that I don't know if it's possible or not maybe it's just doing a clone in a temporary file. Just as a default implementation. But what I mean is that you know what is the. The URL where you want to connect and I say the URL because it's probably the easiest. In field that we have just to determine to determine which is our kid system okay but if we have another another way. It's totally fine. So we have to determine we have to specify to discover which is the. System that we have behind our API just to filter in that list of in that extension list, which is the extension which will provide us the correct method. To calculate that site. I don't know if my my safe from the suit. It's clear to me. Yeah, I guess. Yes. Yes. One other thing I'd say to is that you also have to remember that people can locally install like a get lab or get hub enterprise. So you'll have arbitrary rules as well. So those plugins may need to provide what are registered URLs potentially or somehow you need to understand like for this repo, which plugin is configured to. To handle this, which I'm not sure if that second thing is possible, but perhaps the other plugins going to need to tell you. What URLs. Are configured for that plugin. Okay. Yes. Yes, what are you saying. Could we delegate the responsibility to decide if a particular URL can be handled or not to the extension implementer and make part of the contract be that if they can't implement it they return a negative one. Or they return a nonsense value like zero.  You need to exit quickly. If you can't handle this thing. And you need to accept that you may get you will receive things that you cannot handle. So I solemnly promise to send the get GitHub URL to the bitbuck and bit bucket endpoint to the bit bucket extension and to the giddy extension and to the get lab extension they're all going to get it and they must all return a negative one if they don't intend to process it. Would that work so that you don't have to put any logic at this layer to to decide should should the callers handle this, should I call them. Yeah, it's almost a matter of pattern. Yes, and that's only just to add to add a new or a yes, a new method in your after class that has to be implemented by the bind implementers. So I think that Marcus has pointed the the easiest ways to to fill that mechanism so deciding which is the implementer of the of the API which you know. So if we implement. So if we add that method in our contract that means that I would only get from the list I would only get the valid implementation and nothing else. So I would know. So would still would I have to keep a check to to see if any other implementation has not. No, so that wouldn't happen right so if so my so that even if we have that contract and they return a minus one let's say. What issue we might have is that so we use the extension list to get the extensions which are instantiated in the Jenkins environment. So if any, if any provider, let's say five providers have implemented the extension point.  Okay, but I would have since I have a method which which might be a Boolean or might be let's say it returns a Boolean false. If the URL is not if the URL is GitHub but it's it's been implemented by bid bucket that says I cannot implement this. So let's just return false or minus one zero whatever we're returning for the size. So I would just keep it I would just before calling for the size for the method which is trying to find out the size I can just keep a check. Okay, if it's if this if if the let's say whatever the contract the method is, if it's false or if it's minus one, I will not call for the size for that particular instance taken from the list. Is that what we would do that that feels more complicated than how I was envisioning was you call every implementation, ask their get size of repository with the repo URL. If they return you a minus one you know to ignore them. If they're not responsible to decide in their get size of repository URL, or get size of repository method. Should they actually ask the remote system or do they look at the URL or they look at some other, some other thing they know and say this is nothing I can process. Okay. I may be off. It just seems like it's, it's a place where we can ask the question and rely on and tell the tell them as part of the contract. You're going to get asked questions for things that aren't yours. Your responsibility is to return minus one as quickly as you reasonably can. Yeah, that's that's, I think that that can that's easier for him to implement for us. And maybe minus one may be a poor choice does, I don't think that Java has a concept of an unsigned long so I guess minus one is fine but a repository size of either zero or less than zero.  Yes. Okay. Okay, so I love, I like that to our contract and I love update. Okay. So that's how we're going to do it. The last thing I think for this class is once so how do we decide what implementation we have to use. I just have a simple constant, which right now I have. So I assume that every size I'm going to get is in kbs. That is also something I am, I might need to specify. Not sure how do I specify that in the extension point. Except writing a Java doc. I am not sure. Yes. Why, why kbs you've got a long it's a 64 bit quantity. There, there isn't a file that I know of that's ever going to overrun. I hope nobody tries to do a terabyte size get repository. The reason for kbs mark is that first that the file, the API I used to estimate the cache it returns the size in kbs. Oh, okay. Good, good choice. Yeah. And the second is the, the API is a GitHub or Git lab. So I've tested it with GitHub. They also provided in kbs. Perfect. That is I yeah. So it's five mb right now the switches five mb right now to be more precise on what the switch might be. I might, I might run a lot of tests for this particular reason to to get closer to the point where the nature of J gates performance is that point which we found out in phase one through the results. So right now I've taken it as five mb. So what happens is if it's greater than five mb, we recommend get. And if it's not, we recommend J get. Another thing which was which I considered was that even if I recommend get, I don't know if get is installed in the system or not in the particular node I'm running to. So I used I borrowed the resolve get to implement the logic, which is in get you tell. So what I do is once I decide from my side, what implementation I should use, I run it through the get you tell dot resolve. And I've done it here determined get to. So, so it basically uses that resolve the tool method and if it has get it will recommend get if it doesn't, it would. So if it doesn't, it would go for the default installation. So one question I had here was while I wrote a unit test for this particular for just the cash. So if I have a cash, would I get the right tool or not. So while I was doing that, the, so the, the recommendation from my class should have been J get. Before resolving the get tool before checking if the system has it or not. It was J get but once I, I passed it through this method. It returned get tool to me so I actually was not get get to me sorry, and I was not sure why is it doing that so as I was trying to debug it. It looks for the descriptor implementation for the particular tool, which, which we are trying to as the parameter we have passed here. So it could not find J get and hence it went for the default installation is why would that happen I'm not sure because J is something which is pre is always installed in our would be installed because it comes within the plugin. So that's something maybe once you look at the PR and So I was running the test and I was getting that so I was not sure why that was happening so I thought should tell you Yeah, good question. I don't know the answer. There's some oddity in the constructor of the get of the get SCM that have surprised me in the past so you may be exploring areas that that will have to learn more. Okay, so. And this, this does check the system get like it doesn't only rely on Jenkins installing it. Justin, I'm actually not sure about it I as far as I know it checks. The agent of the node wherever it is it checks if they get installation is present or not. So there's a there's a there's a way to install tools in Jenkins.  But I've also seen a lot of people not use that. So if it's like actually doing a check on the system, then that would work but if it's not and it's relying on people using the get tool or the installation of tools via Jenkins, that's only going to cover partial cases. So just something to look at. Okay, I will look into that. The reason why I did not was that I assume that since this is being already used with the existing functionality it is used to resolve to get implementation I assume that this would look out for every case. So I did not bend deep into how this is resolving or how it's actually finding the executable. I look into it. Yeah, I'm not sure. Maybe these guys know. Sorry. I think, Rishabh, your, your assumption is a good assumption and if, if this method is flawed. I think we handle that separately. You're, I think you made a very good assumption to think that if this method is not doing the right thing. We should solve that as a separate separate solution. Yeah, yeah. Because this thing has the node. It has a string name for the proposed get tool. It has the environment variables. So it's got all the things it could, it could potentially use to answer the questions Justin Justin noted. If it fails to do that. That seems like a bug that we need to solve separately. Yeah, because I mentioned, you're using this in other places to, to invoke the right get. Yeah. Okay. Cool. No, that's fair. So, so I think this is what is happening with the class and the biggest problem right now we what we discuss is the biggest problem and that is something I'm going to handle right now. Apart from this. So my next concern with the class was that how do I actually so I wanted to test it in a real case. I wanted to build a real case scenario with this class and to do that. So I know that I can rely on the cash, not 100% rely on it, but I know that the cash it's I've written unit tests for for cases where if I if I don't have a cash repository or if I have a cash repository, how the class would work. I don't have cases that I've actually never tested the class with the extension. So, so with respect to testing the extension function and the second heuristic before. So I've seen that we have an annotation called test execution test extension, which actually allows us to implement an extension just for the test. So the concern, the concern with that approach is I have is that I would have to so if I'm working the way get branch source plugin would want to work they would. So they create a GitHub client. So I would have to add a lot of depend the dependencies they are using the libraries that I would have to shift all of that for the test only or I could just use an HTTP client which would just perform a get request with credentials or without credentials that would not have a GitHub client. It would just be an HTTP client performing a get request on the particular repository URL that is how I could test it within get plugin. I was actually thinking to try to go to get branch source plugin and implemented just for my local system and then try to work that out, install the plugin, create a project and then see if my system is able to my implementation is able to use the extension and the implementation provided by the extension and get the size. So which so for so my the purpose of the whole thing is that for the demo I was thinking that I if I could do this, I could show the this class working for a cat for a cash repository how we're going to estimate the size and maybe when we go to get SCM for a single pipeline when we're just checking out the project. There also I can use this class how I, if we have an implemented API, we would not have to call the get SCM source constructor we could call we could just use the repository URL to estimate the size and give a recommendation at that level as well. So, so to do that I need to either I need to go to get Transource plugin and create an implementation. So should I work on that and actually see if this implementation would work or not extension points. So I, I, I like very much the idea of doing a concrete implementation in another plugin. I think that's a that's a very healthy thing to do. However, you did describe that the extension point test inside may help you diagnose more quickly than using a second plugin. Back to your so so yes I think it's great to use the separate plugin as a as a that's that's where the real implementation has to be anyway. So that makes makes a lot of sense, but in your suggestion on how to test inside this plug in the test doesn't have to actually make a call to anything. Like the extension points you implemented in the test could just do something like, given a particular URL, always return this size or given this other URL, because it's inside your test you can, you can do all sorts of things that avoid any calls to the outside that keep things very, very simple and say, if I see it, if I see a repository that ends with the number five I'll always return five. If I see those kinds of tricks, because it's a test. Yes, Mark, sorry. I was just saying that Fran suggested that I can mock the HTTP response, whatever response I need from the API, and I can test it. So, so yeah, that will be the quickest ways I'm going to do that first to after I improve update the contract, the implementation and the extension pointer. And for the demo, I'm thinking that I can, I can make a quick implementation there. I actually, I started a discussion thread on the Jenkins dev group to just know from where I can start where what would be the best place to implement the extension point I'm providing because that would be easier for me to figure out where I could do that. So if I, if I get the response there, then it's good. If I don't, then should I, is this, is it okay if I contact the repository maintainers? I saw that I'm actually not sure of the name. I have seen the GitHub handle it a bit wise man. Yes, Liam, Liam Newman. You can certainly, you can certainly ask Liam questions. He's very, very willing. He'll respond as time allows. So, so I'll ask him where I could do this. And so that will be quicker for me to actually implement it and then use it for our demo purposes, and actually, for our further analysis. So, so I think this is it for the class. I actually have a lot more things to share but I think the time has ended, either we could do it on Friday. On Friday, I would have, so I have some new benchmark results Omkar was very helpful with creating different repositories with different kind of parameters we needed. And we have some results from those analysis. I also wanted a result from different platforms. I was looking at your instance and I was thinking to run that, but I could not, I could not do it. So I don't have that right now. So if you guys are comfortable, we could share the results, I could share the results right now, whatever I have. So, did you check why it was failing on Windows? Yes, Omkar, I actually, if you could see when you raise the concern, the next commit I committed. So it was failing because I was, I was expecting something wrong from the assertion. I was not the windows returns get dot exe exe and I was expecting get. So I changed that. That is why it was happening. I'm sorry I did not directly answer your question there. I'm sorry. Okay. Okay. So if you guys want I can share the results right now. If you'd like I could share them on Friday. What would you guys prefer? Let me double check my calendar. Good question. I think, I think I may actually have other things that are colliding on my calendar. Yeah, I'm, I'm supposed to be in another meeting right now. So it's probably best if it's okay with you if we were to defer it until Friday. It is okay with me. I actually think the results we I have they don't not sure if we could use them right now to get something actionable, but nevertheless we need to discuss them so we can discuss them on Friday. Okay. Okay. The last thing with Fran and so we were discussing that we we could. So we could in whatever the implementation we have discussed the update on the extension. So Fran, would you like me to do it first and then you would review it. So I inferred I'm not sure if I inferred correctly what you were saying in the get get a channel was that we could do it together. I mean, what I mean is that, for example, tomorrow morning, because I'm in Central European times. We can overlap several hours. So at anything that you can try, we can be reviewing reviewing almost live because I can jump into the into a kid have and see, okay, this is what I mean. I was thinking more about this other thing. However, I put a couple of comments during this meeting, just to try to make clear what Mark Justin and I was saying about having the how to filter about how to filter the extension list, using a method in the contract that the other implementers have to develop. Okay, so have a look at that. And if you have any question regarding the data approach. Let us know in guitar and as I say, tomorrow morning is we can overlap more time so we can just doing almost life. Sure, that'll be great. I'll be available throughout the morning and so we could do that. Yeah. And I'll try to do whatever we've discussed today. So that'll be better for us. First, I try to have a look at that thing how to how to do it and tomorrow we can discuss that with more a when you have spent more time thinking about how to do it with more context. Okay. Okay, that'd be great. Okay. I think that's it for the meeting. Thank you. Thank you everyone. Bye. Thanks.


I'd like to talk more about your idea of liberation of the heart, differentiating it from sexual liberation. Well, feeling is my inferior function, so I have a certain trouble to articulate that. But the feeling function is something which is completely neglected nowadays. Now, generally we identify feeling with affect and emotion, but that is only inferior feelings. For instance, in the happenings of young people, musical happenings, they liberate their feelings. But it mostly comes out in strong emotions, and it comes out as a feeling of loving everybody, destroying everything in a kind of all-over-the-place way, not individually pointed, while differentiated feeling is to love that unique person for its uniqueness, which presupposes that you are capable of seeing the uniqueness of the other, of getting rid of all schematic psychological judgments, of being able to... It is ultimately something irrational and has to do with one's own development. The more one becomes a unique individual oneself, the more one individuates in the Jungian sense of the word. The more one becomes only able to also see the other person as a unique person, and not have some cliche judgment about them. If you listen to how people gossip about each other, you can notice that 80% of what they say about the other person is a cliche slogan and does not hit the uniqueness of that person. It doesn't define the uniqueness. So liberation of the heart would mean to become slowly capable of feeling and sensing the uniqueness of the other's personality, and to love that uniqueness. And that doesn't mean this Christian, all-pardoning, sweetie pie, strawberry sauce, love of just all-loving and pardoning everything. It means, on the contrary, a very great precision of feeling, namely to... I notice that people with differentiated feeling, if one talks to them in a not quite genuine tone, or makes even a not quite genuine gesture of the hand, they are already shocked. They feel the uniqueness and they want you to be yourself. I think that's the most important thing for a psychologist, for instance, to love the genuine person of the patient, and to be quite openly disliking all what is not genuine in the patient. Then it brings out the other. It brings out in the other what he or she really is, or is really meant to be by nature. And that is real love, to love a love which heals or makes the other person whole, which makes the other person more him or herself. And that has nothing to do with sentimentality or being just sweet or polite. Exactly the opposite. Exactly the opposite. It's very tiring. It's having constantly a quick precise reaction to how the other really is, is not or should be. You have sometimes in the anecdotes of Zen masters you find such things that an obvious comes with an ungenuine answer with a tricky intellectual question and the Zen master just hits him in the core of his real being.


Get out What's up money geeks? Mr. V here. Welcome to another video guys. So in this video I want us to talk about your trade exit strategy So when you get into a trade you want to be able to get out of that trade You want a strategy on a plan that allows you to exit that trade as you feel like So that's what we're now to cover into this video But before we get started guys if you are new to the channel We took about how to earn money how to save money how to invest and build wealth So that's something that interests you go ahead and hit that subscribe button and the notification bell So you don't miss out on new content. So guys for those of you that are getting into trading You have to have a trading plan. So when you're going into any particular stock You want to buy you want to make profit? You want to get out? Sometimes you buy the profit doesn't come means you're gonna lose some money by the same time You need to be smart enough to know when to get out of that trade So that's why I want to share this one with you because this is a strategy that will help you get out Especially if you're just starting out again, you have our tools on the platform that I use like I use webo They have different tools that as a beginner or just starting out You can leverage these tools that will allow you to take the emotion out of the equation Because what normally gets a lot of people is that emotional aspect when it's the stock is going up Your emotional body thing is gonna keep going up when you start going down your emotional body because you wanted to come back So you can break even even though it's going down.  So I know other platforms have the same thing. You just need to figure them out I use webo. So I understand we will better. So we'll talk about bracket orders is one that going into the trade You can determine what you want to do so I can show you guys a good example here So let's say I was looking at this stock and I wanted to trade it. I can just create an order right now Let's say I have an order for a hundred. This is a 50 shares And then I want the price to be I don't want to trade the stock right now Just say $10 and then I see here we say stop loss and take profit So I want to have my stop loss and take profit so I can say my stop loss here would be Somewhere around $9 or let's say 950. That means I only lose 50 cents per share And then my take profit could be I'd say 14 or $15 just based on how this thing is gapping And at that point you can place the order. So notice that when I place this order right here You can see where everything is that on the screen here So it's telling me that I want to buy 50 shares at $10 as well as if it goes down to 10 950 sell everything it goes to $15. I'll take profit. So that's what this is telling me Right here. So we can take a quick a look here. And so again, this is this is the beauty about this is that this is all What you call graphic a user interface so you can move this thing up and down So see you can drag this up and down and change it likewise I can move my stop loss up and down and so I can secure my profit to secure profit So you can definitely go in into a trade and and take profit and get out and secure Profit as well if or stop loss as well if the trade doesn't go your way So that's something that you should be aware of again, like I said, if you're studying out This is one of the best things that will save you because right now I can take the emotions out of it I can say buy this at $11 and then if it drops down to let's say 10 10 50 get me out. I only want to lose 50 says 50 cents per share So get me out at 10 50 and you can set it right there And it would do the work for you at that point There's no emotions involved the only the only time they have to worry about is if this thing goes up Let's say you got in here and it went up you take some profit You know, you can secure that profit you can pull your your stop loss and follow the trade as As the trade is going up. So that's something that you can definitely benefit from so Yeah, we both gives you these tools the other tool that you can use this will be after you are in the trade already It's what we call trailing stop and I'll do a separate video on that one. But just to kind of Help you get started as a beginner. This is a good place to start use bracket orders take the emotions out In this case, you don't have to wait until it gets to 50 less differences If I was trading the stock right now and I see that this kind of resistance at 13.1 And let's say I got in at $10 or $11 and I see resistance at 13.1 at that point I can look at my indicators right here. I see volume is dropping I see right here. We look at my stochastic as crossing or it's attempting to cross So I I'm starting to think like, okay, maybe I should take my profit here and get out So you can pull this down as well to the point where you want to say if let's say I want it at 13 Then I can bring this down to 13 and it would kick me out and secure that profit So that's something that you definitely want to use the beauty about this again guys Is that it takes all the emotions out of the trade? So right now if I'm sitting here and I if I'm in this trade like I said, it goes up I'm just going to move my stop loss and follow it and secure profit. But again Disadvantage of this bracket order is that if we hit you on the downside Um, you're not going to make a ton of money because it's hitting you on the downside So that's why you can move your your target price down a little bit. So it hits you on the upside So let's say if I'm in this trade right now And then this thing starts to pull back a little bit. I'll move my stop My take profit down a little bit. So it hits me on the upside I don't want it to hit me on the downside Let's say my stop loss is at 12 dollars and my take profit is at let's say 14 and then I see some sort of resistance around 13.1 what I'm going to do is I'm going to move my take profit down to 13.1 and secure the profit right there On the upside and not let it pull down to 12 dollars and hit my stop loss that way even though I'm not losing money in the trade But I didn't make the max money that I was supposed to make so that just some of the little nuances that you have to learn And understand and incorporate into your strategy as you continue to build your skills in Day trading. So I hope this one was useful. Again, I didn't place the order here Just because I'm not ready to I'm done trading for the day But that's something that you want to start with bracket Or this we both does makes that a lot easier for you to do Like I said, I'm going to do a separate video on trailing stops And then the order aspect that once you become used to this and understand Again using the the gap and go strategy or the momentum trading strategy Then you're going to have to graduate to start using hotkeys Because when the stock is gapping you don't have time to be clicking and creating an order You can just have hotkeys that would allow you to buy and sell Right on the fly. So definitely Again, this is going to be the baby steps that you would follow. So start with As a beginner start with using bracket orders And then if you as you start to mature You can start incorporating hotkeys into your trading and that's going to mean that you have to be really really Fast with your trade. You have to be responsive With your trade. So that's what we're going to cover in this video again Let me know in the comment section what you think about this Is this something that it's going to help you? Videos like this good Do they guide you a little bit with your trading as you as you get into the space of day trading? Let me know again in the comment section If you're new to the channel guys would you cover how to earn money how to save money how to invest and build Worth it's about something that interests you go ahead and hit that subscribe button and the notification bell So you don't miss out on new content Also, if you are if you are getting started with investing guys Definitely Check out webo That's the platform that I use for trading and so that way you can actually get to free stocks when you deposit A hundred dollars with a new account and as always guys do your due diligence.


Hi, please introduce yourself, okay. Hello, everyone. This is summer from phone max We are a professional manufacturer for rugged smartphone and rugged Tablets, so what is this one? Yeah here? This one is our latest model. It's a 5g model The model number is p10 and it's equipped with MediaTek Dimensity 700 CPU. It's a 5g and the internal memory We can do 12 gigabytes RAM and 256 gigabytes ROM So and you see it's quite a little bit the size is a little bit big because it has a 12,000 mAh battery So it's a very very big battery and the display size is 6.7 inch 4HD So you can ask on a very long hike for several days. Yes. Yes, and You see it's a 4HD display and it's with a gorilla glass So it's like really strong and tough and you see the camera. It has four different four cameras So the biggest main camera is 48 megapixel and with NFC and all the stuff and The Android version is the latest Android 12 What is a chipset solution? The chipset is MediaTek Dimensity 700. So 5g? 5g. Yes Very good connection. Yes, we don't connect to the satellites yet. No no Starlink. Yeah. Yes. Yes Right now it's only a 5g 4g and 3g. Yes Dual SIM? Dual SIM. Yeah, here is the SIM card So it's a dual SIM and unlocked and you can also Extend memory by micro SD card and it's waterproof even with all the ports and everything. Yes Yes, it's waterproof and shockproof You see this is covered with type C charging So on this kind of phone you never need a screen protector. Yes. Yes, no need and no need the protective case or anything You will never get scratched? Yes, never get scratched. You can see. All right Cool. Do you have customers in many countries for this? Yeah, our main customers are in Europe in USA and Also, Southern America. Yes You're looking for distributors in different countries here at the show? Yes. Yes We are looking for distributors all over the world and we don't have a big MOQ requirement So you can start small with our brand and we will support with very good service Do you work with India, Indonesia? Not for now, but we can we also welcome them to be our distributors Yeah. All right, and here at the show you have actually many other products, right? Yes. Yes I have another entry-level model So this one is our latest entry-level model. You see it's a 5.5 inch HD display also with gorilla glass and batteries 5000 battery Yeah, it's also IP68 fingerprint scanner in the back. Yes, it's fingerprint and NFC also Yes, yes, and We can this one the memory built-in memory is 4 GB plus 64 GB So it's our RAM is 4 GB and Storage is 64 GB also with our octa-core CPU when you talk entry-level is actually quite affordable Yes, so actually you see the performance is not that entry level by the price It's 79 US dollar Is that for how many pieces that's for like normally a hundred or 200 Yeah, yeah small bulk. Yeah. All right. You've been doing phones for many years. No. Yes. Yes, and You are your famous brand We actually in the past years we focus more on the OEM and ODM business to provide Customers brand but like last year from last year we want to start our own brand So that's why we're here to introduce what happened the last three years because it's strange time, right?  So that's why we stopped a little bit on the on the brand marketing. No, Hong Kong fair No, Hong Kong fair all fairs are closed for three years. No, Hong Kong fair. Yes. It's nice to see people again Yes, you meet the customers again for after so long Yes, yes, actually we feel very glad that we can we are able to attend the shows again to meet all the Customers right now. Yeah. All right, and people are coming back to Shenzhen now. No, the buyers can travel. No problem Yeah, no problem right now all opened up. So Corona is really a history now. It's finished. It's finished Yeah, you don't need to have a corona test inside the phone. No need. Okay, and we don't need this functionality Yes, and okay, so that's cool. And actually your company also makes regular phones, right? For now, no for now. We only focus on the ruggedized design ruggedized Yeah, ruggedized waterproof and also a huge tablet here. Yeah, this one is a Windows tablet So it's running a Intel CPU. Yeah, it's running Intel CPU This one is out of power, sorry Some tablets This one is a 12.6 inch. Is this a standard for this kind of Yeah, for the charging dock Special standard for this Compatible with other dots. It's just for your dog. Okay. Okay. Cool. Thanks a lot


What's up everyone? It's your girl, Kenzie here from Layton Sports Cards and I'm ripping a personal for Riley F. We've got three orders of the 2022 Panini Father's Day packs. Again Riley, these come in lots of five. We've got one, two, three, four, five. One, two, three, four, five. One, two, three, four, five. Thanks for hopping in. Good luck. If I can guarantee you a Ray Mysterio, I wish I could. All right, we've got Julio Rodriguez, Rookie, and a Jeff Gordon. Nolan Ryan Base and Rookie, Julio Rodriguez. Bye Sean, have a good night. Got David Beckham and Red to 99. Little messy. 58 of 99 on that Red. Nice hit there Riley. Always take some numbered messy. Charles Barkley Bates and Rookie of Josh Giddy. Justin Herbert Bates and Joey Logano. And Purple Rookie, 11 of 25. Kate Cunningham. Wow, nice low numbered one there for you Riley. 11 of 25. That was a nice first lot of five there for you. Heck yeah. Very nice. Order number two. We've got George Brett and Rookie of Malik Willis. What's up Vladimir? That's Stefan Mulberry and a Russell Wilson. See how he's gonna play here pretty soon. Time is about another hour. One more hour. Tealaw and Evan Mobley Rookie. Last pack of bundle number two. Kauai Leonard and a Freddie Freeman. This is his birthday today and be free. All right, last a lot of five here. There we go. C.D. Lamb, Scotty Barnes Rookie. Need to touch some cars. We've got K.D. and Jean Morant. A little Jean. Bobby Whit Jr. Rookie and a Carson Strong. B. Ronald Acunha Jr. and a Jalen Durant. Mike Trout Base and a Rookie of Kade Cunningham. All righty Riley, solid three orders there for you. Thanks again for hopping in. Congrats and we'll get these right out to you.


Hello everyone, welcome to the Jenkins Infrastructure Weekly Team Meeting. Today we are February 2024, and around the virtual table we have myself Damian DuPortal, Hervé Le Meur, Marc White, Stéphane Merle, Anne Bruno, Verarten, announcement before the weekly release. Let's speak about next week meeting, meeting consults. As three of us will be on holidays, so the poor Hervé will be alone managing the production, so better to stay, so that mean we will have to schedule for a two weeks milestone like we did during past holidays. Any objection or question on this one? Next team meeting will be nature bout the calendar, so it won't be 27. It mean we will see each other 5 March. Ok for everyone? Yes. I will miss that meeting as well. Ok, good to know. Thanks Marc. Weekly release, 2.446, so release process successful. I haven't checked the package. Was it the package step? I don't know if it was successful or not. Easy to check, usually we go to genkins.io, download and it's successful. The container image is not there yet as far as I can tell. Yes, which is not part of the package, absolutely. I will let's see the windows, which is the worst one. Let's see if it's oh, it's not there, because it's not stable. Hey, of course they mean. Ok, we have at least we have 3 mirrors. Ok, package successful. Docker image, so there was an issue. I don't know if it's me or someone else. Most probably it's me. I might have tagged last week on the wrong commits. I must probably forgot to update to pull the upstream master when I created the tag. So that tag was recreated. Thanks Marc for catching that and sharing it that allowed us to quickly recreate the tag, which triggered rebuild. That is expected because from genkins point of view, the git ref changed and jhre is republished. And so the idea was to let that build finish before triggering a build of 4.4.6. Hopfully, that the initial build created by the tag you created earlier today, Marc, failed on trusted CI. I've added a message on elements. First build failed, waiting for 2.445 to be finished because of the latest, because we want 4.4.5 to be finished and the latest to point to it first and then the second build. Does it make sense? Because I haven't finished my sentence. Sorry. It does make sense. That's very reasonable. So 2.445 is still in progress or may still be in progress and there's no harm in us waiting till we're confident in that. I was impressed that you recreated 2.445. It wasn't that far out of date, but that's great. Thank you very much for doing it. I have added the steps just to be sure it's not stuck in my head in the thread. So another good trigger for us to see if we can find some time to work on automating that tag creation that will help partially at least because that would avoid the mistake I made because removing the human from the process would help. That wouldn't solve the 2.446 build failing, which requires us monitoring build status on trusted CI, which is an upcoming topic, but right now, we don't have the capacity to work on it yet. About the change log, since Kevin is not there, I assume it will be finished later. Is that correct? Finished already? Oh, no, the 2.446 change log. Yes, finished later. To be finished later today. Is there something else on that weekly release to share to discuss? Is there any question? Do you have other announcements? Oh, yes, I have an announcement. Did you want it here or do you want it somewhere else, Damien? No, that's perfect here. Okay, so Ampere Computing has donated 2 arm64 servers to the Jenkins Project. 2? Oh, no, and that's the wrong, has lent. Donated is the wrong word because they're not our property. They lent them to us, but a loan is good. That's great. And so they will be hosted at my house and we'll figure out how to use them most effectively. These are server class machines that are used. They're similar to the machines used at many cloud providers already. So we're looking forward to getting good benefit from these things. We'll figure out all the details about how we get access, what's what are the security measures we need to do, etc. But we won't do any of that until early March when I return. To wait early March and March's return from holidays to get started. Right. So I'm just really pleased. It's very, very kind of Ampere to donate the computers. We've been working with arm64 server class systems since 2021 when we got involved with Oracle in their deployment of arm64, even before they announced publicly. So the Jenkins Project has been doing arm for a long time. And this is great that they're willing to lend us computers to let us do arm without having to pay a cloud provider to host them. Absolutely. I had a discussion with Bruno earlier this week. Since Bruno had that kind of discussion about the risk V or any potential server, I wonder, and that's only an hypothesis, if we could find and ask sponsoring from I don't know the English word. In French, we say white room, Oster. So a company that provides the racks, the electricity and the hosting, and you provide your own server that you have to manage remotely. And they provide you services that usually you pay for instead of Markweight. The idea in that case will be we could benefit from this to server running somewhere that doesn't make your electricity bill explode, especially when we will start running bomb builds on it or something like that. That will help on the automation and avoid, depending on your ISP, because same thing, I don't know if your ISP has a quota on downloading or uploading. We never know. Maybe an ACP local server might help though. But yeah, that was just an idea that doesn't restrain us from using those machines on your basements. But on the medium term, that could be interesting if we have a few in the US, that could be a way, because it's not the first time we have company ready to lend or give us servers. Right. Well, and I think I think it's a very good, it's an interesting idea. I actually asked my ISP if they did white box hosting like that. It didn't get a response, but there are places like that. And oddly enough, not far from where I live is a large Hewlett Packard company facility where we might persuade them to donate a large Hewlett Packard Enterprise facility where we might persuade them to donate some physical equipment as well or lend us physical equipment. And in either case, having it hosted somewhere is a good idea. I think we should explore it. Absolutely. Because getting it, it's, it's, it's nice to get it out of one place and into a place where people care even more about hardware. Right. But I believe we can, March will be a way of Mark White rebooting the server a few times. Of course. Yeah. Well, and, and there are still some things that, yeah, it's, I haven't even turned the power on on the servers. So there's, there's much more to be done. But I have taken a photograph of them. That's nice. But yeah, let's wait for you being back from early days. And I want a validation from your wife that we can keep it working once we will have started the bootstrap process because I run XServe, Apple XServe and the Dell ProLiant on my student basements for one year and a half. And I remember the sound, not mentioning the electricity bill and stuff. And the vibration. Right. Yeah. But it's on the basement. So I assume it's okay for that part. But yes. They're already, they're already noisy machines near it. So this is, this is just adding to noise, not somehow noise where there wasn't noise before. Okay. But yeah, please don't break your electricity. And again, that's, that's, that's not, yeah. I have to, in the winter time, I have to heat the house anyway, whether I heat it with electricity or with, or with natural gas, I have to heat the house. In the summertime, it's a different thing. Fair, but many thanks for, many thanks for the work you did Bruno and Mark on that sound, the work you most probably will work on that area. From knowledge, from showing off our usages, from managing the relationship with Ampere, from that, that's really huge win. Thanks. Thank you. Is there any question? Is there any other announcement you want to make folks? Nope. Okay. So we can just have a look at the upcoming calendar. So 2.447 is expected to happen next week, February. Mm. Nothing else to add on the next weekly. We have an LTS tomorrow. Is that correct? Yes, that is correct. 2.440.1. 2. So sorry, I miss her. 2.440.1. Tomorrow will be 21 February. Do you remember with the release lead? Just Alexander Brandis. Okay. So that will be early morning for us in the, in the Europe. Perfect. Alexander Brandis is released lead. Hervé, I believe you will still be busy tomorrow. My question is related on, okay. That means by default, we will have to design Stefan and Hi as a release lead on the infra part. Is that okay? Stefan, do you want to be primary or backup? It's in what time in the morning? Given Alex night schedule, I would say early morning for us to be confirmed and ask within by the primary. Okay. So I can be the primary. Yeah. Okay. You know, I'm here tomorrow morning. So yeah. And I got your number. You don't know where I live yet, but still. Stefan is lead, primary lead on infra. Okay. Is there any question about that LTS release? No. Remember, we should have fixed the issues as the weekly showed the issues related to the file storage that someone in that room deleted a few weeks ago. And then let his colleagues have to deal with the consequences. That should be fixed. That's right. You tell it with that you came back. Yeah. In the end, everyone, everyone find the culprit again. Sorry for that. But yeah, tomorrow, if we have issues, that most probably will be consequences of this. But the weekly happened carefully. It's just, yeah, we'll see. But that should be okay. Do we have announced security advisory? Haven't checked 24 January? We don't. And next major event. As far as I remember, we have a scale X. It's in March. I don't remember the dates. Yeah. And dates, dates are not the scale scale in Los Angeles. And it's mid-March, sometimes 17th through the 19th or something. Okay. Yeah. Alyssa and Alyssa and I and Basel will be there. And Maroc will be there. Cool. Any other major event question about the calendar LTS weekly stuff? Okay. Let's, so let's proceed on the work that we were able to finish on the past milestone. Okay. Let me, okay. I'm going to go with what we have on the screen. It might be a different order than the notes and I will update the notes accordingly. We have two closed issue. The first one was to decouple incremental publishers from CI Jenkins. So two or three weeks ago, I don't remember. We had an outage on CI Jenkins. The outage was all the build were marked as the first January of 1917, you know, the epoch. Or somewhere in, so they were the dates and build time were corrupted leading Jenkins printing the epoch time by default. Caused by something on the plugins that has been solved since then. But one of the funny consequences is that that breakage broke the incremental publisher when a request for publishing an incremental artefact was sent. The service was sending an HTTP 400 as a code and reported by early. What happened is that incremental publisher was trying to reach a JSON file where there is a source of true of the permissions. Was username was able to read or write which Jenkins CI GitHub organization projects. That was required to check if the user triggering or the builds was allowed to publish an incremental artefact. And it was failing because on the back end, so the error was 400, which is first the problem, because that mean the incremental publisher application is not good. It should have said 500 because that was a server-side error from incremental publisher. But that's something I don't want to put my hand on. That's just the fact. And we realized that in fact that JSON file came from by default CI Jenkins IO, repository permission updater job on its master branch was archiving artefact. So with that job with no archive artefact due to the date time correction, it wasn't able to work. That mean if we put CI Jenkins IO down, incremental publisher is not able to work as expected. Most of the time it wasn't a problem because usually CI Jenkins IO is the place where we request for incremental publication. So if it's down, you don't care. However, it's way better to rely on a file generated by trusted CI Jenkins IO and deploy on an highly available system instead of something on a public system that could be easily taken over. If you see what I try to say is that it's not safe to rely for a permission source of truth on something that we consider not safe. So that's why we have changed incremental publisher to use report Jenkins IO published report from trusted. So we control the supply chain here. Is there any question on this one? Second one, we had a discussion. So we had a request to mirror Atlassian public maven repository on repo Jenkins IO.org. So first it was already the case. And second, that was a realization that Blue Ocean plugin was using ancient dependencies that weren't provided and published by Atlassian themselves. So it was somewhere hidden. So thanks to that discovery, to the dismay of the Blue Ocean maintainer, but thanks for them to the extra effort, they were able to bump that dependency to a more decent version that should be now there. So no action expected, but a good reminder to update your dependencies sometime to time because they can't disappear from the public internet. Any question on this one? Okay, and for the rest. Sorry, so the Blue Ocean maintainer was okay with the solution we chose that we're not going to publish those outdated non public or incorrectly licensed packages. The dependency has been updated to a current version of the Jira plugin. Yep, great. That's what I, that's my understanding. Yeah, it's a pump to pump parent, as I understood. Cool. Ah, okay, so that has the effect. Okay, so we can thanks then the Blue Ocean maintainer and Bazel for doing the huge triage work then, cool. We had a few user facing issue closed for no effort because yeah, not related directly to the Jenkins infra, but they were more general question on their own Jenkins installation, which is out of scope for us. Any question on these issues? Okay, so let's roll with now the issues we are working on with a hard work. Following them, what I see on screen, which is sorted by priorities. I didn't have time to sort priorities on the notes. So first one is replace BlobExphere by az copy. Hervé, can you give us summary on the part you worked on on this one? And I will show my part after. Is that okay? Yeah, so I've got the SS token generation from a service principal working. I implemented some best to come on to do that in contributors touching kins.io pipeline to synchronize its file share. And I then created a function in your shared pipeline library with file share service principal allowing us to just pass the as a credential ID, the file share ID and the storage account ID to retrieve a signed URL including the SS token with a shortlist expiry date set to 10 minutes by default. And this duration can be adapted if needed. It can be passed in the parameters of the shared pipeline library. I started to look at implementing that function in Jenkins.io. During that, I noticed that we're using storage version 1 file share for Jenkins.io and that it's and also that it's a standard file share. Looking at Azure portal billing, we notice that most of the cost is ready to transaction. So we'll use this Jenkins.io opportunity to upgrade this file share to premium and version to storage. This will reduce the cost of this storage account currently it's $70 per month. We think that most of the other file share use like that will be in the same situation and we might be able to replace them and reduce our costs. Nice work. Just something to add just to let Mark know, we have an opportunity here around the as a s token generation to create a new plugin. So because the work we are doing here is that we need a few shell commands that get a credential, a service principle credential from the controller. And right now we don't have other solution than to spin up an agent. The credentials are serialized on that agent. That agent run a few shell commands, a script in that case. So that's why they have put it on a pipeline library so we trust and control that shell script and this code. And this code generate a short live token with the customizable parameters that they have mentioned and then we have to retrieve that value back to the controller in a groovy variable. So we can use on the subsequent shell calls. Eventually we could use, we could improve the pipeline library to say hey, we stay inside boundaries on the same agent. But still, that's still limit because we are using an environment variable which is not known from the controller. So we don't benefit from the masking sensitive values. And that could be a great opportunity to say hey, we don't want the agent to be responsible as a identity to generate that token. But instead, we want the controller to have that responsibility. So user could only allow the controller to generate that short live token. And then the short live token could be passed to the agent just for the duration of the build. Not requiring a concept of localization or local identity stuff. It's the same as the idea on what we can do with GitHub apps. You can specify the GitHub app ID and key. And when Jenkins run a Git operation against GitHub, it generates a short live token name installation IAT token which is one hour token. And that token is specified inside the agent environment then as a credential. So that's why I think there is an opportunity here to create a credential plugin that will be Azure SIS token or something that could help user of Azure and Jenkins on that guy. Does it make sense or is it clear and does it make sense? It does make sense. So it's something that matches with that concept from the GitHub app token. Yeah, I think that's interesting. Okay, back to the walk. So Herve described the next step for him on that area. So then we have Jenkins AO that means for each of the usual file storage we will create a brand. So in that case, if it's worse, the migration create a brand new on Terraform. Once we have the brand new storage that means we also need to migrate data and service to that new one and then update the system so it can fill the content or move the content already and then change. But we will have migration operation to do here. So yeah, that one might slow down the whole process. So let's see step by step, depending on the time, because that might also create outages on the services when we will migrate because we will need to recreate the CSI, PVC, Incubanitas for instance, for most of these services. Is that okay for your Herve? Did I forget something on your port? Okay, and in parallel we have so az copy installation az copy is installed and version tracked on the VMs which include pkg.origin and the agent.trusted. These two virtual machines are managed by Poupet and they are running Blobixfair command to copy to file storage that cannot use the pipeline library either because these are shell script running as Chrome tabs or being run remotely by something else or because it's using freestyle jobs not able to use a pipeline library. So now we have added az copy next to Blobixfair and the work in progress here will be install the SAS token shell script from Herve pipeline library in the VMs pkg.origin and agent. That's the next step for me which means adding update CLI system that will take care of getting the latest scripts from the pipeline library on the master branch and update a copy for these machines that will taken over by Poupet. So if we do a change on the pipeline library on that script then updately we detect the change and propose a change on Poupet that we will have a pull request to audit and decide when we want to release it or not. Does it make sense for everyone? Yeah, I was... I didn't understood that when we spoke about it earlier in my... I was about to speak it when we arrived at UC helpdesk issue but my first intention was to get the script in the UC repository and get an updately manifest to update it too but I didn't understood that the script would have been present in the VM. So I haven't talked about the update center and that's a good point to mention it because that could benefit from this that's a good thing. Absolutely, yeah. For which use case At least crawler there is another one and for agent trusted at least. The crawler needed so update center will benefit from it and pkg origin for this one because we run every core release and every three minutes we run something that copied that was your file storage from the mirror brain user on that virtual machine. Yeah. I'd like to discuss it later if you would like to say it because it will... For the agent it's okay for pkg there is no other solution. I really want to underline that there is nothing you can do for this one. So it's mandatory so we have to do it. That's what I said. Okay for pkg yeah. Okay because because if we don't do that on pkg origin we cannot remove BlobixFair from here. That's really mandatory and there is no pipeline or Jenkins involved here. That's a Chrome tab shell script every five minutes on the machine. Yeah but it's in crawler I don't want to take too much time in there but I think the reference directly in the repository using the scripts seems easier to me to make something that's depending on the assumptions that there is a script imported from elsewhere than the script using it. No otherwise you will create an issue again on pkg. On agents that could be doable like you said it's not possible with pkg because that mean if trusted goes down or if GitHub goes down we cannot have the update center being updated. We need the most minimalistic system to work and that's why the update CLI with Poupet will create a copy of the script but will keep track of the changes. I think it's important if you disagree that we have that discussion because that's the core of the whole infrastructure here we are speaking about so we need to solve that problem right now. You said that if GitHub isn't available isn't there I'm not sure but isn't the crawler is requesting GitHub to Yes I'm speaking about I'm speaking about the 7th script running on pkg the crawler is a detail on agent trust it I'm speaking about something that synchronize data between pkg machine which will be a set of plugins cores and elements that will be streamed to OSUSL to archives and to the file storage for getgenkin.io That's the process which is run on each core release and every three minutes As we want pkg to be the source of truth we need it to be a vulnerable We can discuss if you want more details on this one I mean we have to discuss this as a team No I think I think if you disagree with what I said you have to to bring it I don't disagree again I need to have more time to discuss this with you but I don't think this is the right time to do this because we are in meeting which is already quite some time long and I don't know I don't know sure we want to discuss this in two hours this detail on a detail I know I know it's important but yeah I mean it's important as in the top level priority of our task yes that's why I wanted to discuss it right now I have to look at something and yeah okay you need this later okay but that mean we it's at most important so we need to focus on this one as soon as possible okay next step is Kubernetes 1.27 Stefan yes I did the digital ocean part we did the digital ocean part that was not as smooth as we thought but the good news is that for now we will be able to do the grade the next one as code directly we were able to get rid of a little hack that was taking us back for this because we upgraded we bumped the Terraform Cli version to 1.7 I think if I remember correctly and that allow us to have a full as code version for digital ocean now and the problem we bumped in for not being able to have the full a great process was that we are having minor updates by automatically done by digital ocean every Sunday and the last minor one didn't went through because of a problem with the cert manager m shorts with a webhook time out that were set to 30 and needed to be between 1 and 30 so 25 is good so we had to fine-tune the values for that m shorts and then the the minor patch went through on digital ocean UI which allowed us to have the as code bumped to 1.27 working after that so we had we had one issue and we took advantage of that upgrade to kind of clean up the code as not needed anymore for the hack that's all I think that's all so next step no you also upgraded you also worked to have kubectl updated yeah the kubectl cli is now on the on the all-in-one agent so all-in-one image which is used by all the and by some agents and that kubectl is no the source of truth is the is the image that we are using on the production and all the project using the kubectl can now have a match on that version with the update cli cool so as a reminder it's used to run the kubectl exec mirror bits can on the new update center work that are needed and not only if I remember correctly there is another one you forgot no it's that's the only one yep sorry um avant heard from some news oh sorry sorry sorry my mind is rushing uh do you think we will be able to start the upgrades of eks this week I don't think so next step upgrading in the case delayed 2 marches est-ce que c'est ok oui je pense que c'est ok avec les délais ok yep absolument donc rien d'autre pour rassembler en cuban et s1.27 any objection question things unclear nope ok no no news on giro update from linux foundation as far as I can tell let's just check ok so no news so nothing to say on this one um so updates Jenkins are you to another cloud are they I don't remember if we had if we were able to run action or if we have to run some on this one I tried yeah I started to I've I've used the same script content uh and I put it in the in the pool request where we are testing the data center resume work I am generation for this one yes we continue I've made a I've copied the script file from the search pipeline library and I intended to update it with update cli with the diamond mine ok I have to update to create the other point service principle potential on trusted last time I tried I I've got an error I have to try again ok when this test will be done I'll update the main pool request so we'll be able to ask chenkin security to take a look at it extend then merge it and deploy it on production test it try it on production ok cool nice work um I have something to add on the next step migrate to premium storage sorry but we we must for this one it's it will be the case clearly because transaction will be terrible every three minutes that same pattern as get chenkin sayo yep transaction cost I'm adding it I don't know if you will have time of course but I know that support that you absolutely can do without any risk for the production don't hesitate if you need a prior task next week you can spend some time on this one as well any question objection ok next top priority task was infrascii on rm 64 stéphane that's on me I am still on I think the last docker image that we use as a as an agent which is not the only one this is the builder one that image is used on both infrascii and cij and chenkin sayo my problem with that one for now is that it's using the builder is using a version of ruby which is not the one we have in the only one and we need on the only one an old version of ruby to work on the puppet build we are using so I had to manage a way to install both version and to have kind of switch to use it yes 3.2.x for now and then I will work on an update cli to track the new version and to match with the windows version and we we already had a ruby 3. something on the arm version because we use vagran that install the 3.0 version so yes work in progress cool then the next step will be not sure that all the all the tools I'm doing that step by step in fact I'm running the builds where is using which is using builder and try to run the build with the new all in one and check all the tools that may need or not to be installed or changed so step by step just a note since we did an effort in the bath months on merging the pipeline between ci and infrasci so some project have to pipeline some have been already been merged so this will create a temporary discrepancy between ci and genkins that io builds and infrasci we won't have exactly the same environment between both doing a short period of time is that okay for both of you yes is that clear yes are we okay cool so there will be different roads to fix that I don't have a strong opinion because that will me most of the time it will be case by case one of the solution will be to start defining the all in one IRM64 templates because we but that mean eventually having to check how can we run IRM64 workload on ci genkins understood that yes I don't think we will have that will be something to think for march so we take note and we will resume that process in march is that okay yes I will not think about that during my holidays but yes and until you go to your holidays do you think you will be able to continue working on this I plan this that's why I I put that in priority okay the new private Kubernetes cluster in the new sponsor that your subscription I propose that we delay that one for March the idea is to have these IRM64 agents run on a cluster only for infrasci on the new subscription I propose that we delay in March because we don't have a credits problem this month with Azure is that okay for everyone okay award on go long parts Stephen yes I think this one you can you can move it because I think it's merged can Eric can I ask you to double check since we it has been merged is there something else to run for that issue or can we call it closed because I remember that wasn't there and both of you discussed that before the issue was created by Stefan and you were the question was already up to date okay so does it looks like that the pull request from Stefan would have avoided the problem now I have to look at it okay so I propose that we close it until it's done or unless you think you will have time to to review it before close your survey what do you think okay so you are responsible for closing it is that okay yes okay close the above to be verified by her way so I add it to you and it will be kept on the current milestone then use separated pipeline and organization scanning for updates cli on janvier sinfra so we had an un forcing issue is that the github check are mixed between updates cli distinct jobs and the main jobs that could lead to problems we have the discussion as a team privately Monday one of the ideas here that we discussed is that we might want to use our job DSL templating to create a custom github check a bit like the update cli infrascii the name will be static will be infrascii j'ai qu'en saillot if I remember correctly and the goal will be then to change the branch checks so the required check to allow a pull request to be merged wouldn't be continuous integration be a merge that can be mistaken to the deadly but with the new one uh yeah that one must be done this week because we had additional issues with stefan yesterday and today her way is that okay if we take care of at least that part for the existing jobs and then you see if you have a subsequent action or continued separating jobs next week what do you think what don't you think I'm actually following you I don't follow what you ask me are you okay for if we take care of dealing for the the new definition for the the checks I've understood that part I don't understand what you are waiting for me to do after that do you want to do you work on that task then so first do you agree on if we run this since you are busy this week yes the fixed only the fixing that issue part is that okay yes because we initially discussed and you said you will take care of that but you have a lot on your on your thing and you will be alone next week so the question is is that okay and the secondary question since you answered yes right now is that do you think we can continue you can continue working on this separating next week separating the jobs for the next one as your net or as a project or do you think we delay that too much I can't say we can't delay it's for me it's not it's a long-term issue on the flow when we have some time so I I don't know if we should keep it on the of our milestone will you have time to work on on this on the one I can't respond yet I think my other task will be done for our first day but I'm not sure so I can't say really if I will have time to work on this long-term issue okay so we delay to march it's not because it's it's because we need to plan ahead for one week if you are not able to plan ahead you say no and you take less tasks that's the goal of that meeting and even if it's in the backlog you can bring it back if you see that you got time that's all that's that's why my question so your answer is no that there is no I hope you were working on it this week so I don't know oh okay okay okay you said first I will take do you are you okay if we look at it then you ask me do you have time to look at it not splitting so it wasn't clear for me it's not the same job okay so we delay to march and we do the fix tomorrow and we'll discuss this privately because it's it's start to be a lot of too much misunderstanding on all we work as a team so uh update CLI what is it it looks like the rest are things we need to close the meeting soon looks like it's too long to be concentrated so uh let's run the fix run the fix ASAP and then delay to march okay so since it's taking some time do you see other issues in that thing that we shouldn't move to march because we don't have time do you see something that we should take care of at all costs I don't think so a plank maybe but not sure oh yeah true is it I don't think it's uh yeah so we are in issue this morning with a plank that's why yeah we have an outage so that's a team thing that outage must knowledge must be done because if it goes down you you must have a bit of knowledge on next week so outage today due to database being re-indexed fixed by setting replicas to only one to avoid concurrent database operations so the problem on that application there is no shared logs so sometimes during restart it can try to apply migration jobs and that create logs we have to add a start probe so that part can be done to the end chart so that that's something that could be done either by us this week or by you next week survey but that one should be taken care to avoid other outages yeah at least we need to to create an issue take care to it takes time to run the other thing is still walking on cleaning up corrupted records that one so the reason why it was corrupted is that all postgresql documentation it's related to hardware issue so there might have been something in December that happened that Microsoft didn't communicate it to us early this morning we thought that it could have been because of the replicas but in the end that that should not corrupt the data worst case we would have lost data with a server-side error but not corrupted data on the database itself yes that would just push too much pressure but no corruption exactly the operation I'm doing shows that we can go further and further on the data that the data set that we want to retrieve it's not top priority so no need to continue that part but not top priority as Daniel does not need this data anymore so if we have other priority we don't work on it I believe that's what that's the part you wanted to mention survey because we were all at the first yep thanks for reminding us of this one it's just that the outage part was important to bring here today for another another one the DLA building small plugins that should be solved by the the fact that digitalism is now in terraform 1.27 we have to check that we have to re-enable digitalism 21 is okay on the O also enabling the agent on CI Jenkins IO to check if still if it is still slow you will decide if you have time to deal with this one or not I will add it on the backlog by default is that okay by default okay the others are minor tasks so I will remove them DLA, DLA, DLA DOCS Jenkins IO is that okay for you are they to yeah this one I delayed since I have more important thing to do I might take some time to ensure that when we are clearing the get the Jenkins IO and there are no mirror returns it doesn't update the reports yes this one I thought we will find another page to get the information that will not depend on the it's I can do the for right now I think that both are needed but you think it's true I just don't update the report if they are just one result yeah but if there is only one for the sake of clarity we should use get the Jenkins that IO as a source of proof see sure if that is we don't have a way to automatically query the last war that's why we are using update to Jenkins that IO to redirect to the last war absolutely but you should not query the last war if you have to spend time on that the goal is to find a source of proof yeah I think I I think it's my fault because I'm the one who chose the wrong source of proof you know it's no no it was there already I don't no maybe but we Damien is right we shouldn't request the last war yeah because latest is a pain is there is a problem for the for the weekly so every every Tuesday that will be a problem and you need to patch which is silly if we if we find a page listing the the nodes of the mirrors it's it's it's done it's just correct it will be simpler it will be better it's it's good go for it that's the idea I believe we all agree or do is there something else to discuss on this one then okay but the rest is okay for me delaying the others to march just wanted to check if we had new issue because I remember we had news at least we have to answer to the person on aryan I believe already you did the last one but you are overworked so is that okay if we take care of this one or do you want to continue on that area node care you should take it okay do you do you see new issues eks cluster that one will be moved to to march so I don't include it today the goal is to start consuming credit from the current subscription there is nothing with true age yep something else no okay so then I'm gonna stop sharing my screen so we'll work on the milestone so see you in two weeks for people attending the meeting I'm stopping recording bye bye


Jack has a Hall of Fame vote has for a while. He has sent in his ballot. We're gonna put the ballot up right now By the way, Jack, it looks much better than the mimeographed copy you have in front of you Well, what do you have a 1920s copy machine at home? I know Brandon Shapiro of the yes network is making the ballot look a lot prettier than normally does But let's focus on what's important about that ballot and go right up to the top right hand corner Maradena Rivera was the first name that I selected on this ballot. I did that symbolically That was the easiest decision I made you see the other players I chose Halliday Kent Martinez Musina Chilling Wagner and Walker so you can let me talk or you guys can hit me with what you think about my ballot Remember, it's my ballot. I always love when someone says well, I can't believe you did that with your ballot Well, it's my ballot. This is the way I felt about those players I do want to throw a lot of love in Rivera's direction I don't think there has been a player who has been better at his position than Mariano Rivera has been as a Closer so that's why that was as easy as any Hall of Fame vote that I've ever made