 So the problems I encountered was, I thought I could just follow the pattern of redirects that were in the repository. And then I attempted to make run and confirmed that the redirects were working and couldn't test them. So the first question is, what's the format for a redirect? And then the second question is, how do I test to be sure the redirect worked before I submit the pull request? Okay, let's do that. I'll just share my screen. Okay. Okay. So, yeah. Let's look how our redirects implemented. Actually, if you go to the repository in content, this is the way to find redirects. There is just a redirect folder. Okay, and all redirects are in that folder no matter where they are in the structure of the repository or no matter where they are. No, they are not. Okay. They are not. So that's the thing because redirects basically the same as everything else. It just has a special layout type, which is called redirect. And when the website is generated, when this layout is passed, the page basically injects information. So either redirect or localized redirect depending on your browser. So basically you get redirected proper URL if you navigate to link like redirect API token. So let's see how it works. So you're redirect API token. Okay, no trailing slash. Okay, now it doesn't work. So it's because redirect. So if we put redirect, it should be working and it shouldn't really matter whether there is trailing slash or not. Okay, all right. Okay. It matters if you configure redirects by VC host. So if you use old ways way to define redirects here, then it really matters. Okay, just VC host. Yeah, it's actually, I think you mean vhost.conf. Oh, vhost, right. Yeah, vhost.conf and this one we need for confluence, let's see. So you can see a bunch of redirects here. Yes, it does matter whether you put slash or not. Same, it matters for engines config. If you have redirects configured in engines config, which is a case for some locations within the website. But the modern way is to actually do it like that. And let me show you demo how to basically develop it locally. So we go back to Jenkins IO repository and yeah, we know that yesterday Herrera submitted a bug for redirect, which is here. So redirect Jenkins X project to Jenkins IO. So basically what happened today, at some point we deleted the page, but yeah, due to the bug now on limitation, it doesn't mean that the page actually gets delivered, deleted from the production instance. Because we just basically are sync files and we do the demo files which are not available. At least it's my understanding of the bug. Right, that's mine as well. The R sync doesn't do a minus minus delete or if it does, something goes wrong. Yeah. Okay, so in our case what it means, we have a link which is projects to Jenkins X. So here, let's, sorry. So here we go to content and not the content. So projects and then projects. So there is no Jenkins X at all because at some point it was moved to a separate project and then basically we just deleted the entire content, just a single page from here. So we can actually see some examples. So for example, for Glow ocean roadmap, we also use redirect because at some point when Glow ocean project development was stalled, we put redirect here. So what it's just to do, do exactly the same for Jenkins X because we need to reattain your real structure. And now on the way is to actually put a link right inside. Still what you need to be keep in mind that for example, this page projects listing is auto-generated. Well, no, it's not actually auto-generated, it's just fancy syntax. So it should be okay if you just had additional projects there. But we do have some sub-directories, I think that have exactly the condition you were describing where they are auto-generated and I might have to do some exception in the auto-generation if I'm inserting redirect. Yeah, or just type for type, check for type of the page. So for example, I do it in other locations. So let me, yeah, I believe that adopters she's implemented like that. For adopters, you can see that there is Hamel. This Hamel basically takes information from data adopters. And yeah, no, there is no longer type check, I believe. But yeah, so here you can actually see the remainder of this check before we move to the data. So it just checks whether the page is read me. You can also check for the type of a patient, for example, ignore redirects. Okay, so for instance here, the fact that I removed T-Mobile as an adopter, it was handled very nicely because there isn't a T-Mobile page that's created, the adopters page is generated from data that's the assembly of a series of ADOC files. All right, and at the same time, there is no, so these data pages, they are not mapped to the website. So they are not published as pages. Got it, right. For you, it was enough. Otherwise you could have hit the same bug. So what we will do here is go back to our redirects. So we have our products, I'll take redirect from our bloatian and I just put it on the top level here. Here it's named Jenkins X, right? So you're not creating a new folder named Jenkins X and an index.ADOC inside it. You're just creating Jenkins X.ADOC. Well, it doesn't matter, you can do it either way. Okay, all right. Yeah, and in this task, we will ask to actually redirect to this Jenkins page. So this is exactly what we will do. We will put a redirect URL here. Obviously they don't have relocalization URLs, et cetera. Yeah, we can just keep it as is. So in redirects, you basically have two ways. One way is to put absolute link. Another way is to actually put a relative link. So I'm not 100% sure whether we actually use it anywhere these days. But yeah, relative redirect links should also work. Oh, okay. So if it had been a redirect to another page inside and can I embed IDs inside the redirect URL? So XYZ's hash mark one, two, three. Hash mark what? So could I put a redirect, could I put a hash mark inside the redirect URL? Oh, I may have to quote it. Okay. Yeah, you can quote and put basically any content, but this YAML doesn't support variable resolution. So it should be absolute value without any additional macros or whatever. Okay. Okay. And yeah, I'm just checking. So relative URLs should be also used for a sex installer. Yeah, when you replace it for a sex installer, yeah, I used the relative redirects and they work. Great. Okay. So here what we added, we added the Jenkins sex page in projects which points somewhere. Now I will just launch it aside. So it may take a while, but there should be no magic, it should work. What you need to keep in mind that since we modify metadata, the change won't be reliably applied until you reload. The same time after recent updates of our struct, it's actually sometimes works. So if you want to, we will verify it once it loads. So I'm not sure I understand what you mean by reload. What do you mean there is that? When you develop, let's say common content, like pages like that, you can just write text that will load the page in your browser and you will see new content. It will not be a case for this page if I recall correctly, but yeah, let's try. Okay, yeah. So what you said triggered matches for me with the experience that sometimes I have to stop and do make run again. I think that's, okay. Yeah, this experience actually gradually improves because we also update dependencies. So for example, now images will get updated if they change, but they still need to be indexed. So if you add new images, same as if you need new pages, you have to restart. Otherwise, these pages will not be discovered. The same for example, for data files, so if you modify anything there, like that or unfortunately change log, then you need to be able to see the effective result. Okay, now I've had while we're waiting for that to generate and as soon as it's done, we can certainly go back to it, but I've had one more challenge with generation that I'm not quite sure how to resolve and that's with the change log. The new downloads page includes a computation that uses the SHA-256 hash in the page. And if I reference a build that does not yet exist, as far as I can tell, page generation fails, is there a way for me to conditional that so that instead of failing, it will just leave the SHA-256 blank or some such thing? In the downloads, right? Yes, yeah. So I usually navigate to the change log page by going through downloads. And if I'm referencing a build that does not yet exist, the downloads page doesn't work because I think because it can't find the SHA-256 for that build or it's trying to get some other data about the build. Have you reported it back for that? No, I have not because I've been busy. No, not at all, I have not reported it. Okay, so here you can see the code while we wait. So you can see that it actually goes to Jenkins, maybe in the repository and reads the entire SHA file. So yeah, it will fail if open operation fails. So here the tricky thing is to understand what happens because so this part is basically a part of Ruby code inserted into the jelly file in the Hamel file, sorry. So it's not enough. So if they don't have a conditional open operation or whatever, then you don't have much option here because it's basically this operation which fails. So it fails to download the data and likely throws exception. Got it, okay. So that's the place I need to investigate and I certainly can investigate to see if I can find a conditional operation in Ruby or okay, great. So if you want a solution which is guaranteed to work, you can replace this code by Ruby. You can put it somewhere, just a second. For example, when we do that, what do we stop Ruby code in this repository? So there's a way to actually put Ruby functions or Ruby methods. Oh, nice, okay. Not these ones, just a second. I'm trying to remember where we put it. But yeah, you can put some Ruby code right inside the repository. And it can be the conditional open then. Yeah, so just a second. And also you can put it in other components. For example, this is how we provisioned macros. Macros are written in Ruby. But again, you shouldn't really need it. Second, yeah, I forgot where it's located. So yeah, that's the easiest way to get it is like that. So here you can see that, for example, there is already some content text which puts a great guide and it does some magic in Ruby. So basically you can just try catch and whatever other stuff needed there. And hence, remember there. Great, okay, so those, all right, is it excellent, thank you, thanks very much. Okay, so while we're talking, our site has started. For me, yeah, this recording takes extremely long time on this laptop. Okay, so here's our site, here's our subprojects and subprojects, we don't see Jenkins X, which is good. At the same time, let's go to the projects, just to make sure. Maybe, okay, there is Jenkins X here, but let me guess, there is Jenkins X here because nobody really deleted it from here. Yeah, interesting, okay, so that may be another one we need to get rid of, but okay. So yeah, you can take it as a home task, right, but yeah, whatever. So what we need to check, so here it's replaced to redirect. So it's not redirect, it's just hard-coded in the definition, we can check it if you want, but it's definitely hard-coded, okay. I shouldn't have been opening so many tabs. So projects, Jenkins, yeah, it's in index, so here you can just scroll to Jenkins X and you can see this content. There it is, right, okay. Now let's try our redirect projects, Jenkins X. Yeah, so now redirect works. Victory, okay. So if you put a custom link, yeah, you get not found, but it's fine because this page had no sub pages. If you take something like that, it works. Excellent. Okay, not exactly like that, sorry. Yeah, so Jenkins X, yeah, custom page, it won't redirect you, but if it's a link, it will redirect you if I recall correctly, yep. Okay. So we can also test whether Life Reload works here now, but yeah, I'm not sure. Yep, Life Reload works here now. Oh good, okay. So it, even though that's a data thing, it somehow re-read the data? Yeah, so again, we keep updating our upstream dependencies. We use Elf struct, which is framework not maintained by us. So at some point they improve the behavior of all metadata. And Oleg, you don't need to actually do this. I can take it from here if you'd like. It's a great experience for me to redo and be sure that I know how to do it. Well, you will have an opportunity to do that because I'm looking for one link and you still have it. Oh, that's true. I've got to do the T-Mobile one and yeah, good. Okay. Yeah, we'll just put it since I have it anyway. So do we just remove it from projects? I think we should. I don't see any reason to have it listed there in projects. I think we should also remove Evergreen from projects. Okay. Well, Evergreen, yeah, we have an action item to actually a park it. It's a bit more than that. And for Evergreen, it's a little bit strange because it's listed as a project. It's not listed here. Right. Because we dropped it at some point. Okay, so we then remove Jenkins X entirely and we also need to update the role here to... Left. So we need to reliant the image for Jenkins. Now we reload it. Oh, because the images are intentionally alternating. Got it. Well, at some point it looks cool. It does look good. I like that. Okay. It's not the most active page. Okay. So we did this fix, I push it to my remote. Yeah. So basically, do you know what happens next? I need to pull the code. So VS code does not have an interface to the hub command? You might explore that because I love the hub command because it will let me do this from the inside my IDE as well. Well, most likely it has not actively using that. Oh, okay. Yeah, I believe that it's something. Okay, hub, hub, yeah. So there is... Yeah, it looks like there are several. Good, okay. Well, basically this console is, yeah, you can add hub to just your pass if you want. So it depends on what is your preferences. Right. In my case, yeah. So we'll see the different number. Let's click a bug, doesn't really matter. Okay, so here's our public request. Excellent, and GitHub did the connection between that, did the linking because you referenced it in the text. It linked it in the bottom right. Excellent, very good. Okay. Thank you. So yeah, basically that's it. Thank you, Oleg. Thanks very much.