 Welcome to Jenkins documentation office hours. It's the 21st of April 2022. This is the European edition crowd and enterprises are primary topic news on the news front LTS 2.332.3 release candidate is available. I'm prepping to deploy it myself so and still needs from the docs perspective. Needs the changelog and upgrade guides upgrade guide will be empty just saying nothing to nothing to do. And the other changelog items I hope will be ready for review in tonight's docs office hours Asia. Any questions there Alex. No, sounds fine to me. All right, the next topic is crowd in enterprise. So let's start the tour huh. Okay, so we've, it looks like you've at you've got design library plugin added, and it has files to translate. Yeah, I've carried over the design library plugin yesterday and set up a few example languages on our no official seconds instance. All right. Okay. And so now to submit and the danger here is now I'm actually into submitting to a plugin that's not mine and therefore the Italian translation and its flaws will be terrible but I could certainly do it. What do what do you recommend as our next steps. Our next step is, at least I'm trying to reach out for the infoteam at the help us to set up a CNAME record for this instance, having available on Jenkins.io. Okay, so a CNAME record. Yeah, we're basically crowd in Jenkins.io. Yeah, that was my recommended. Okay, then we will probably need a blog post or a tutorial or no we said already we need a Jenkins online meetup to show people how to use it. Yeah, that's what we wanted to do. Right, and then we can also blog and document on Jenkins.io but the more crucial thing is that online meetup and before that the CNAME record okay. All right, well so then that so, but even without the CNAME record I assume we have to put other projects into it that it's right now we've got one project and if we want more. Eventually we add Jenkins core is it that we do plugins, a series of plugins first get comfortable and confident with it and then we go with Jenkins core or how would that work. I would go with the way how you described it. I would carry over the few plugins we had on my instance. So we have them here and then we settle it with more complex plugins or plugins with a plugins which invoke more translation strings. If we carry over core, I would possibly do that after the online meetup when we have a little introduction how to do it, because just an hour ago someone submitted a translation PR to core so people and the community would need to adapt this change first. And we may want actually to invite that person to be part of the part of the online meetup because because that's someone who is doing Brazilian Portuguese translation and Brazilian Portuguese puts them roughly between your time zone and mine. It might be a great excuse to say hey please come join us and we're going to show you how to do this and maybe invite them to be part of the yeah part of this the exercise okay good. Yeah, I think code one would be one of the last steps to integrate when we have actually settled things and people get more comfortable with it. And possibly refueling strings and core would be preferably not done only by me and possible core if yours. Right. So yeah would be nice to make sure people are actually aware how to use it how to use it properly before faulty or bad strings get into core. That makes sense. Okay, so after the meetup. I would consider adding core. But that one really does needs needs more time needs to assure that we don't break something. And we don't harm existing translation somehow making them worse or getting junk pull requests from people. Okay. So to make sure that people actually use crowd and and possibly guide them there if they continue to submit pull request and get up and possibly make sure that our core reviews are aware how to review strings and crowd and. Oh, oh right. Alright, so to submit through crowd in. And that's a that's a very good one because while it ultimately ends up as a pull request the pull request actually does not happen until it's been reviewed in crowd in right so so it will be gated on crowd in first. So guide reviewers pull request reviewers to first review and crowd in because they'll have they will still see a pull request, and that pull request will include the changes, but it's a lot easier and more comfortable and more efficient if they review and crowd in and the pull request won't even happen until after the review and crowd in is that correct did I understand the cycle. Yes. Okay. And possibly can label these kind of PRs with a special a specific label on course of people are actually ever that we don't review this kind of PRs and core anymore button crowded, for example. All right, me want to use a label in core PR that notes the PR does not need this has the PR has already been reviewed in crowd in. Yeah, because point at this point if a PR is up in core likely just one maintainer needs to pull it in because they can be sure that it has been reviewed already. Okay. Good. Now, in terms of so you migrated design library plug in. What would I need to do to migrate platform labeler, for instance, or what would we need to need to do to add a new plug in relatively untranslated like the get plug in. If you would want to add a new plugin that has no prior integration yet, we would basically redo the steps to set up a fresh project on crowd and there's no specific procedure how to integrate Jenkins plugins or something. Okay, so it's just we we we create a new project, and that's done with their whoops with their project interface. If you click on go to console. All right, there we go. Thank you. Okay. And then here I just create a project and go through the steps. Yeah. I've still got to try a smaller one first really I'm scared of doing the big ones immediately so okay so let's do elastic. Are you okay if we do that now would be better if we not do it. Okay, so if I say elastic access, and it's got zero languages selected now. I can pre fill with. Let's see you pre filled with six do I remember correctly you had. Yeah. Okay and those six were. I assume one of them is English has spoken in the US. English, the source language and then German French Italian Spanish Chinese traditional simplified and Brazilian. Okay, Chinese simplified Chinese traditional Brazilian Portuguese has spoken in Brazil, or French Portuguese as spoken in German. Okay, you can you can actually remove English from the translation. Oh, it's not needed. Okay, got it. All right. Okay, Italian we said, and I'm missing one which one was it. Spanish, Spanish, okay. And I think I know we've got a strong community in Japan so I'm going to actually add Japanese. I don't know if there's any active translator right now there but we've had. Well, with coastal case history he's he is Japanese born. Okay, there. So, I've selected seven and if I say remember the selection future projects I create will offer me those seven as as choices. Okay, after the late workflow. All right, delay crowdsourcing. No, no, no, the late workflows not selected. Oh, I need to enable. Yeah. Oh, right. Okay. So and go ahead crowdsourcing is already selected because we have deleted the previous workflows. And now we can create the project. Okay. All right, so elastic access. And now the fact that I did not name it with the identifier of the of the project is not a problem I can do an integration now. Now you can basically decide whether you want to do the GitHub integration through your personal through the or or or use GitHub actions with the personal access token. And which do you recommend on the design library I'm using the personal access token one to have a neutral user and not my user as computer. I like that. That sounds like a perfectly good reason. Okay, so let's let's do that I've, I've done the GitHub integration before so by by us doing the other form we get a record of both forms so are you willing to take me through the process. Yeah, for sure. Let's head to the elastic access plugin on GitHub first. Okay, so here we are. The elastic access plugin on GitHub. For better comparison we can open the design library plugin in a secondary tab, because we can most likely copy and paste the existing workflow over. Okay, all right so design library plugin. All right. Yeah. If he if he if we go to the GitHub folder. Oh, I can just look in the dot GitHub folder I don't even have to look at the actions. Okay. No workflows. And there we have our crowd and that wine L. Okay, and so this. Yeah, I think we can basically copy paste that over because that is the default configuration I'm using for the design library plugin which has surprisingly work well for me, but there are also more options to customize it. Okay, and so I need to do this in. Now you were probably going to take me through how to add that file with GitHub or can I just do it from my from my usual way of committing changes on my command line. You can do your user way of committing changes. Okay, directly applied to the master branch no need for a poll request. We have to modify two files so you can directly within the master branch if you're fine with it. I am this particular plugin is very low risk. If I break it completely the total pool of users are not likely to be that angry with me so. So this is safe. All right, so, and the one we need is dot GitHub slash workflows slash crowd in dot yml. Out end up yml. Okay. And there we just paste that in. Yeah, and now we have to change the get the crowd and project ID. Crowd is that too far at the moment because that is the idea of the design library plugin. We have to grab the ID of our elastic access plugin first. Okay, now and you you said Oh for there it is I see second line from the bottom that number and what we want to do is. Yeah, we want to find with this six. How did you know you knew six because it's here in the URL there six. Okay. All right. So, it's also on the project overview on crowded but we always have it in your URL so it's quicker to grab it right from here. Excellent. Okay, and I bear double check that I got the indentation. Yeah, that looks about right. Okay, good. I set up this workflow to one cron based every 12 hours. I think that is fine for our need here. Great. So I add that file and you said there's a second file I need to add. Yeah, in the root directory we're going to create a crowd and dot yml. Okay. And this one I want to grab. Again, I can use design library plugin as my model. I just need to accept the folder paths. All right. So the folder pass of the design library plugin. Ah, okay, and this one right so this one it will take a little more thought. I'll need to do some actual. So if I do a, for instance a get LS files properties to see if I've got any which this this may not have any at all. Okay, I've got one. I have one but that is not a source file that is already translate and already translated file. How can that be so so someone translated this. And okay so so no properties files in source so I've got to before I can even do this I need to add properties to this. Yeah, that would be the preferable way. I'm not sure how did that happen. But yeah, that's definitely possible. It's it's easy to find out I probably did something crazy myself. Get log. That file. It was first added almost 10 years ago. So a long time ago. So it's it's a dead file. So what we really need is something that we need a different project maybe that is still relatively lower risk, but has adopt prop has dot properties files already. Okay, like for example, schedule build plugin. Yeah, that was files and translated file that work out. Right so well let's see so get LS files. Error dot properties error underscore de dot properties and Columbus properties. Oh, I'm sorry what was the one you said oh and yes yes so it has multiple and config dot property so it has several properties files here, and it's got a messages that properties. Yeah, that is the one for Java localization. Ah, right. Okay, so this one has examples of of both jelly based localization and Java based localization. Yeah, looks like it from the. Okay, good. So, so I could finish my creation of the of the elastic access another time and we just switch and create a project for for schedule build plugin. Okay, for example, we could also rename the elastic access to schedule plugin because we have no integration here yet. Right, right. So that good point so so there's nothing keeping me from giving this a different name. And I suspect there's just like project settings in the lower left corner. Okay project settings. Something else schedule build plugin. The ID renames the same six. Okay now that and that ID is the ID on the crowd inside. Okay, so yeah, so that is what you use for the workflow. Okay, and so I need to go here. And let's get a description from schedule build plugin. Okay, schedule a build at a later time. Yes, I realize that's a pretty simple thing. Okay. All right, so save that. So now in my workspace I have schedule build plugin. Yeah. Now we can just copy and paste the files into the schedule I built. Ah, right. Okay, so so and I've got those. I can even move them. I'm not particularly ready for elastic access yet. Yeah, I think elastic access needs initial translation to source files yet. Right, and that's a good one for me to use as part of an instructional exercise for people. This is what it means to internationalize your Jenkins plugins, because a number of them, a number of the ones I work on anyway are not adequately internationalized. Yeah, I don't, is there currently to do we have a tutorial how to do that, or is it more like trial and error. Right. At least the last time I did it was complete trial and error, mostly error short trials long errors. I mean there, there is the stapler localization plugin that could be used, but this does generate quite a weird strings. Exactly. And that's why I think we owe it we would benefit from using the technique you recommended to me of don't use that tool that generates those awful proper the awful awful key values, use key values that look like Java keys. Yeah, I think the state, I think the stapler plugin bus use inverted slash and space bus as the limiters of the words, instead of camel, instead of camel casing or something saying Well, because it's, it's trying to put the string in as the left hand side as a Java identifier and that's nonsense right but at least your technique was much much better for me. Oh, yes, this is just a Java identifier I don't have to act like this needs to be the English string and when the English string changes. I don't have to worry about that because I'm using an identifier in the source code. Yeah, I liked your technique very very much. That's basically what I've done with the design library to localize it, because the stapler strings were quite not to my liking. Excellent well and and do are doing this on this kind of thing with schedule build and with. So I've got another plugin that I maintain with a colleague who he and I do videos. And so I may ask him to do a session with me on localizing a Jenkins plugin or internationalizing a Jenkins plugin. Okay, so back to this this one the crowd in yml file, it has the correct project ID six because that was the project ID I grabbed from this URL. Yeah. Okay. The next file. Oh, these are the sources okay and this is where I have to. Okay so get LS files, a little bit of work. Okay so message dot properties yes but not the deep not the files with underscores in them. So something like, Oh, whoops. That was a little too bold. Okay. I, the folder structure I'm using here is basically the root folder structure working with asterisk to include everything below to not specify specific directories. Wait a sec so I'm not sure I understood followed that okay so what what I was all I've done is gathered the list of the files that are in this thing that are source localization files I think anyway. Now your guidance on which how I how should I put these in. So basically we have source main resources I owe Jenkins plugins design library, and I would basically keep the source main resources part, and just exchange I owe Jenkins plugins with or Jenkins CI plugins that schedule a build. I see okay so you're using the wildcard there the wildcard has the benefit that I don't have to extend it if a new message is added. Yeah, so adding like that, I think is what you're saying. slash behind schedule a build. Oh yeah. Okay, I put it there good. All right so. So what it is is source. Yeah, so I should see this. If I were just to paste it like that, because it's the same thing and then I instead of messages I do. So I'll to wildcard two stars to say any directory depth like that. So that I think is the concept you were guiding me to. Yeah, and now and ignore the same on the same. Okay, I will do the same on the ignore string to make sure that we that already translated files do not end up as new translation in current and again. So the problem does that on itself if we do it through the get through the web integration, but since we're not doing it now we have to specify in our repository. Okay. Now, how do I need to check that my that the file names that are in my system match with this pattern. That is the crowd and pattern that's used by the action. Okay, so, so, but I have existing translations already in this in this in this repository will they be safe there. Yeah, this would be ignored them because this is our class where we exclude already translated files. I see. Okay, and then the ignore clause gets copied into this translation value. Okay, and for our uses basically a copy paste tasks, because we do not want to re upload already translated strings to crowd in, but export already translated strings exactly in this source direction at translation direction. Okay, the lower part we can actually delete, because that is for the samples part of the design library, which we do not have here. Right, so the, the things that I have. I've, I've the first wildcard matched all the files I have here. Okay, yeah, like that right. So as many as that seems correct to me up. Okay, all right, good. And the two bottom keys are used by crowd and they need to stay as well. Okay, so then. So, I've got two files. You'll be sure I'm up to date with my upstream master branch, and I'm ready to commit those. Yeah, crowd in enterprise integration. So this is the GitHub action integration. Is that correct way to phrase it. That's fine. Initially this workflow fails now because we did not set up your person access token yet but that, but that is no issue. You can always do that afterwards. Okay. And now by by doing it as a GitHub action it will submit pull requests as this as a bot user not as me. No, it uses the, I think it's GitHub dash bot or something. It's a GitHub account for that. All right. Okay, so that's committed and if I look at it I see my master is ahead of whoops is ahead of origin master so or upstream. So, am I ready to push. Yeah. This was named schedule at build plugin. Yeah, that seems fine. Now we need to add the personal access token we specified in our workflow. Okay. Yeah, we go to our, our settings tab. Settings here. All right. Click on. Call security and and secrets secrets. Secrets right okay and actions. Okay. Now we click on a new. Repository secret. Okay. The name of the secret equals the name we are using in the workflow. Which should be visible in that. Yes, in the workflows directory. Okay, so it's this crowd on a personal token. Okay, good. So, like that and take off the secrets dot so like that. For value we need to create your personal access token first. Okay, and for this I need to stop sharing. The initial setup doesn't reveal the token that is done in the next step I can warn you about that. Oh, okay, so so I can create the do and so I can create the personal access token without disclosing it. So just go here to go ahead. And just close them in a after you after you have told it to create a token doesn't do that right away. I see. Okay, so I go here to settings. No, no, no, not on GitHub on crowded. Oh, oh, the access token is on crowded not on I see my mistake. Okay. So here, head to your account up our right corner. The M account settings. And there you have access tokens. Okay, tokens we created a new token. Okay, so I just click this button. Yeah, and now we give the token and names we can. So we know later what that is used for. Okay, so this and it's this is specific to this repository to this plugin or so we'll do one of these for each or is this more more general. Let's just up how do we how we set it up now. At this point this has no scopes. But if you scroll a bit below we can grant it access to a specific parts of our account and our projects. Basically how you set up secrets and tokens on GitHub. Okay, obviously, the token doesn't need access to everything just to projects. Right, so here, I want grant access to projects. We don't need tasks we don't need reports but we need translation status and source files and strings. Okay. And now if you scroll down we can restrict the token to a specific project. Okay, and here I can say I want to allow it for only. And is this a good common practice then to prefer single sing a token per project so that there's, or will we need to use a token that is used across multiple projects. I mean, in the long run, we could basically use something similar to the CD token that is not as close to the user, but as universal at every repository that opts in into CD. Basically, like one administrative token that is not as close to the user but use in the background to authenticate between Jenkins GitHub and our crowd instance. I see. Okay, but that would need negotiation then with the, the administrators and be sure that it's a content it's following the same concepts that that CD token uses. Yeah, of course. And now if you if you click on create the token is so into you. Okay, so when I click the create button it's going to make it visible. Yes. Okay, so I'm going to stop sharing. Stop sharing. It's okay that I continue recording. You can't see my screen anymore right Alex. No. Okay. All right, so I press create. And it's going to whoops it's going to confirm my credentials okay I have to confirm it's going to make me log in a second time just to be sure that. Okay, token created. I've copied it and I'm going to put it someplace safe, where I can, can basically just copy and paste it over into the secrets on GitHub. Oh, okay. So, so that's all I need to do is I having copied it. I go to action secret and that's the value I paste in there and then click add secret. Yes. Okay, so I don't add. You don't need to write the talking down or something in case you ever lose it or it might get leaked like behave with like every other talk and just revoke it. Okay, so I'm going to start sharing my screen again so you can see that I did what I think is the right thing. Okay, so what I did is I, I took the, the token from wherever it was. Now I've not even sure. Oh, wait a sec. I may have to stop sharing because I think it's still visible on one of my tabs just a minute. Yes. Okay, close. Now, now it's no longer visible on one of my tabs, but here on and now back to sharing again. Clearly I don't do enough secure demonstrating to know when I should show my screen and when I shouldn't. Okay, so. So we see now in the list of secrets in addition to the two that are used by continuous delivery I have crowd in personal token that's used for the crowd in integration. Okay, yeah. The workflow you copied from my design library plugin is set up to run Chrome based on every 12 hours, but also has an additional trigger. And the yeah already already there. Okay, so I could I could click this run, and it will run it against the master branch. Yes. Okay, and here it is queued so now I could conceptually I can I can watch it execute. Yeah, it's not going to use a token and criticize it with crowd and and if we did and if we did everything correct, it works. I have you here to coach me on how to correct it. So that's great. Yeah. In this case we have, we are actually using the workflow which is a benefit because it does tell us what is wrong and what is not working in case something is wrong. Okay. All right, so here it says, you do not have permission to view. So did I give the wrong scopes on the on the crowd in token. That might be possible. Unfortunately, I do not recall all of my mind which scopes I gave to my token. I think I've just just not the risk here but Well, and we could certainly this is a good experiment I can, I could certainly generate a new token. Yeah, just revoke your old one and make a new one. Okay, so since the old one is not working not doing what we need there's no reason to keep it. So new token. And we know that we want projects, translation status, source files and street. Oh, do we probably need Reddit webhooks. Can you scroll up again. Maybe there's a specific point for grant access to manage us. At least I think this is the scope I use to set up my token, but we can just select all scopes for now. I think I need to check out the session purposes I think I need to check out the guides again to make sure which scopes are actually needed. Okay, so, so because this token will only be used by the schedule build plugin. It's, it's not a terrible risk and right now we're a very small deployment scale so granting all scopes is fine but you can then do research to figure the decode, which things we actually need. I mean from a user perspective that is obviously not much of a risk because users can't manage other user accounts or teams or translation memories. But from a perspective of an Jenkins crowd administrator that may be too much of permission offer translation integration token. But yeah for now we can just work with this one because that will definitely work out. Okay, so, so I'm going to let's say I've selected project selected projects yes I did that, but I have to give it a name right and that was. And again this schedule build. I think was the name I and that token name needs to match the token in the action. No, no, no it does that is just the identifier use for problem and use for yourself to know what the token is for. Okay, so that has to match is the one used in the workflow file and in the secret step. So GitHub knows where it has the reference a token. And if you click create now it does show your token again. Okay, so I'm going to stop sharing. Press the create button. It prompts me for a password. It gives me that copy now I'm going to go back to the settings secrets actions. And I'm going to update the crowd in personal token with a new value update that secret. So I've updated it, I'm going to close the page that shows this, the schedule build plug in secret. I'm going to reshare my screen. Right. And so now we've got the action is here and I should be able to run the action again. Yeah. Okay, so we're going to run that workflow again. So, yeah, it's not running. And let's see if it is successful this time. Okay, so it, it, this looks promising. Yeah, that looks fine. We have a text pass and we have a green tick. And if you head back to crowd and we should see the source files available to translate into the plugin now. Okay, so, and here. So I see, let's see. So, where, so in files. Oh, here we go. Yeah, for example, if you select our own properties now. And it's how to make things easier we can actually go into the translators few. You have the public, public page button in the upper right corner. The off right. Okay, so now we go to elastic access plug in. I should have named it plug in shouldn't I project settings. Yeah. Actually, schedule a build. Oh, right. It's right. I should name it with the correct name now schedule build plugin. Thank you. Yes. Okay. And public identifier, I can change that. Yeah. But however this part is used for the URL. So if you have it anywhere. Many to update it. If you don't want it to follow a direction. Got it. And so, but for given this, given this one. No one's aware of this except me. So I can now. Okay. Okay. So description save. All right. Yeah. And if we had back to the public page now, we have the files available to translate in our file. Oh, look there, there they are 47 files. Translate. So if I want to do some Italian language translation. All the sorts. Oh, this is giving me a tutorial. Right. Yeah. Okay, so close it away. Yeah, I'll need to go through that tutorial later. Okay, so. Now we have our source strings available on the left column. The translation. And so I just say yes, this is the one I like. And I save it. No, yeah, for some reason the schedule build string is not updated. That may be actually access several times in this string. Oh, okay, got it. All right. So no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no. I have no idea if this is okay. Unfortunately, I can't help you much out here, but well, and that that's actually, I'm not that much help either. I'm just willing to do not do a very poor translation of this one and not be at all concerned that people are going to grumble that I did a bad Italian translation. Okay, so, but it's taking me through the translation process and... Yeah, currently you're just approving the machine translation, crowd and things that are appropriate. Right, and so now there will come a time when, okay, I may say, all right, I've done as much as I can here. I would like to go through and now approve those translations. Yeah. And for that, I switched to do I quit editor? Not necessarily considering you have proofreading access on this language and this project, you can just click the three dots on the left hand. So these three? No, no, I meant on the right, left to search strings. On the left side, we have search strings, the search bar. Ah, there. And the three dots right next to it. There, okay, all right. Oh, no, I was actually wrong. Just click on crowd sourcing. Oh, crowd sourcing. Oh, there it is, right. Thank you, right. We've done this before. You'd think I'd remember it, great. So crowd sourcing, proofreading. And so now I'm switching to and turn off the... So now I'm going to say, yes, that is an excellent choice, approved, approved, so approving each one. It says, oh. Reach the end of the file because we have no more translations available here. Ah, okay. So what it did is... These few strings are not going to be exported because the way how we configured the action is to only export fully translated files. Otherwise we would have incomplete files or files with English languages in, for example, Italian. Okay. So now if I want to approve them all, that just approved them all, right? Yeah, now if you approve all strings, you have just translated. Okay, so now that I've approved all of them, this one shows that there are strings translated. Nope. I'm, okay. So... We need to switch back from proofreading to crowd sourcing by clicking the proofreading again. Ah, right. Okay, so proofreading here, switch to crowd sourcing. Okay. Yeah, now I think you have just selected the done files. Previously, click again on the three dots right below crowd sourcing. Okay. Yeah, and to do. So none to do. Yeah, messages, properties, does show a green bar. So we have translated all strings here, I guess. Okay, now, and you say you saw a green, where did you see the green bar? I missed that. Yeah, above crowd sourcing. Oh, oh, okay. That is an indicator of that I'm done. Okay. Yeah, that's actually the progress bar. In this view, it's placed a bit poorly, but if you head back to the file directory, you have a green and blue bar right next to the project. Files indicating which files are translated yet and which are not. Okay, so if I quit the editor and go back to, no, did I just make it? Oh yes, this shows me. Here it says, 100% of message properties in the, oops. 100% of message properties in the Italian translation are done, they've been proof read. Yeah. Okay. Normally within the next 12 hours, the integration will deliver it back to GitHub, but if you retrigger the action by hand, it does it right away. Oh, oh, so I can watch it happen even now. Just make sure you have the label available. I think we named it enhancements. Oh, okay. Now, where do I find that label? Good, so I need- That's the typical PR label. Okay, so let's look at the labels. I think that this repository has labels defined. It's got 11 labels available and I don't see an enhancement label. Yeah, I see two at one, really quick. Okay, so enhancement, oh, new label, enhancement, new feature. Currently I'm using the enhancement label in the design library because it does use CD and we need to use it to be picked up. However, we may use or could introduce a new label for a CD named localization having it pick up. But then we would need to teach CD to recognize that as a relevant change, as a significant change. And localization makes good sense as one. It's just for now we use enhancement. Okay, so the label is ready. Now if I invoke the action from the GitHub side. Yeah. Okay, so run that workflow and what this action does is it will go out and ask and basically it invites crowd in to provide the data back to it that it can use to create the pull request. Yes, it does now file a pull request with your just translated messages or properties as GitHub action user underlying using your personal access token to authenticate against crowd in to access the project. And now that personal access token that I generated was again from crowd in, not from GitHub. I haven't done any personal access token here on the GitHub side. No. Okay. I'm just using the personal access token. So the GitHub action is aware how and where it does need to authenticate. And now we have your PR ready. Oh, very good. So it's already here. And I should be able to see it. And see my marvelous. Okay. Now it put a separate a space between the around the equals. And is that allowed? That works. Let me take a look real quick resources. I think the file was named messages or properties. Yeah. It's actually the same in the source file. Ah, I see. So what your point is that the original file uses has things separated by space. So it must be okay. Yeah. And if it's not, I need to fix it in the source file. I mean, it definitely does work out but it basically just clones the format of the accessing file. But that's very sophisticated. That would be good. Okay. The build non poessere programmato. Oh, that's great. I really will have to look up the Italian the word the Italian translation uses elsewhere for build because I'm pretty sure it's not build. It's decidedly not Italian. If we head back to the conversation tab of the PR, you can see that the PR is actually created by GitHub actions, the bot and if you hover over the icon of the commit, it's actually the crowd and bot. Oh, okay. I see. So it'll tell me here. Let's see you said over the icon. Yeah, that's a crowd and bot. Okay, great. And it did get the label. Okay. So the label we define in the workflow. All right. And now that gives me a translation. Yep. Absolutely. If we have set up CD on this repository, we could basically pull in this PR right away and have it released within minutes. Which it does have CD set up on this repository. And so when I merge this, I will get a new release of the schedule build plugin. Yes. Okay. That is the reason why I set up enhancement as default label to make sure we always have a new release if new localization is available. Oh, so now, and how does what entry gets inserted into my change log? It will just be new crowd and translations, won't it? Yes. Okay. So into the enhancement section of the change log. So if I look at the current change log, I've got a section right now for maintenance and dependencies as the updates. So I'll get a new one for enhancements. Yes. However, we can just change the title to something else in the workflow. If you want to name a different or include an overview of the languages affected, for example, this is just the example I have copied from the crowd and workflow example. So there is a way to have crowd in change this so it would conceivably say new crowd in Italian translations or Italian and German, that kind of thing. Yeah. If you take a look at the workflow, you can actually see the changes I have done, which are present on this PR, like using my conventional commits prefix and the message. Okay. So if I look here at... No, no, the GitHub file. Oh, the .github slash workflows. Yeah, the actual workflow file. Got it. Okay, this one. Yeah. At this part, with colon, this is basically the part where I customize DPR feed colon. New current translations is a commit message. Everything else is likely self explaining what it does. And there are replaceable parameters that I can insert in here for things like which languages were affected or... Yeah, I mean, under the hood, the action does basically use crowd and command line interface. And we could, for example, iterate over all languages affected, extract the language key and reuse them in the pull request title through GitHub environments. I don't think... Yeah. Yeah, if you look up crowd and GitHub action on GitHub, you can have a list of all variables available to customize a workflow. On... Okay, look up the crowd in GitHub action. Crowd in action on GitHub. GitHub crowd in action. This... Oh, no, this is on their side. Not on GitHub. Yeah, just go one page back. We have actually a... They actually have a proper repository of it. Oh, there we go. Okay. And in the read me a bit below, they actually list all variables you can use in the file to customize. Okay, so this is where I could see, hey, here is the... Yeah, these are all available keys to customize the file. Can basically change the name of the GitHub action bot to something else, to something more Jenkins-like, if you wish. Well, and I could use the two-letter code here in the commit message. Oh, I don't think that would work right away. Okay. Because that is identified used by crowd in. So... And there are likely other variables we could reuse. I see, okay. Excellent. Thank you. Thank you very much, Alex. Yeah, I think they're using crowd in with their action integrations actually giving the user a bit more of customization about the integration rather than relying on the OAuth with crowd in itself. Because here we can actually customize everything right through GitHub, instead of using your own account when you do it through the crowd integration. This looks great. Thank you. So are there other steps we should take here? This will complete its evaluation, you can see I.Jenkins.io is... Oh, well, it's making good progress. I did not expect it to be quite that far already. So there's a chance this usually takes five to seven minutes, even on a good day. Okay. So the test passed here, we may have a release very soon. Yeah, I hope that's the I.Dust work right again today. And we have a release within a very few minutes. Yeah, so still one task yet to complete. Alex, any other points you'd like to make? We're reaching a point where I need to end. We're about at an hour here. Are there other things that you and I should review here as part of this? Ooh, I don't think so. We have set up the integration here. The checks are done. So Siddhi will likely pick it up anytime soon to actually deploy the changes. Okay, so I'm ready to merge it. I can do the approve. And in this case, I like this because it lets me actually be the approver. I'm not, it's not my own pull request. So I'm approving. I'm now going to say merge. And now it will start the build on the master branch. Oops, I don't see it there yet. This is the GitHub Jenkins security scan. So it hasn't yet launched. Oh, maybe because Jenkins, CI.Jenkins.IO is quite busy. There it is pending. Maybe there are as many builds in the queue. Yeah, it's not. There are many builds in the queue, right? There are, last I checked, there were 1,000 or more. It's down to 700 now. At least it does accept new builds again. Right, right. Damian did a great job this morning of handling all sorts of surprises. 155 agents running. There's a lot of work happening right now. All right, Alex, thank you. Thanks again. So now in terms of enlisting other people to help translate, they registered with CrowdIn and then we add them to the project? Yeah, basically if they sign up on now Jenkins or CrowdIn.com or sign in with GitHub or, for example, that's what I did because I just didn't register here. Yeah, they can basically go ahead and translate the scheduled build plugin and design library into any language we have set up. Or we could add them as proofreader to these projects. If they say, hey, we would like to volunteer here and offer our help to approve these strings. So there's a two-phase idea that we could have which is anyone will crowdsource, anyone can submit a proposed translation. And then people we trust act as proofreaders to say, yes, that's a good choice. Now, does that work where if two or three different people offer different translations, do the proofreaders see the different alternatives that have been offered by the different people? Sometimes we get spam, for instance, if someone spams us and somebody really good submits a good thing, we'll see both of them. Do we only see one? Yeah, we actually see all of them. Like if three people submit three different strings, the refuer and actually the actor itself see three different proposals for the string. And like on GitHub, anyone can proofread anything, but only actual proofreaders, we have given access to the proofreading thing that's the term used in crowd and can accept strings. Okay, all right, so we've got a safeguard that if a trusted person is a signed proofreader, they're the ones who act as the gatekeeper. Yes, I'll take this proposal, I'll not take this other one, great. I mean, in the long run, if someone really does play a bad card here, you would need to accept the PR on GitHub anyway, so you can't just accept bad strings and they end up in the project. Yeah, my only worry was, at least for me, when I get a German language translation to schedule a bill plugin, I'm just going to assume it's good, right? I admit, my ability to assess and my trust of Google Translate even isn't terribly high. So I might paste it into Google Translate just to see the first few, but after that then I'm probably just gonna say yes, it's gotta be better than English. Yeah, I mean, if they are approved, they are likely gonna be correct because someone actually took the time when direct over them and thought, hey, this is appropriate, that fits the context. So yeah, that will likely fit. Excellent. Alex, thank you very much, thanks again. So we'll continue this exercise. I'm gonna go ahead and propose, I think we're at a point where I can propose the online meetup. What if we did it say three weeks from now, I'll send you an idea of what rough day, would that be okay for you? Or let me send it to you by calendar, asking for okay is pointless. I'll send you some different proposals and you can tell me which one or two or three would work for you. My calendar is quite busy the next few months through university, however, considering that we will do it in the evening for my time, we will likely find the time slot. Okay, well, and I'll propose a few different slots and you can tell me if one of them works better than another. Yeah, for sure. Excellent. Alex, thank you very, very much. I'm gonna go ahead and call an end to this. I think unless there's something else you wanted to share before we end. No, nothing from my side. All right, thank you again. And I will for sure look forward to talking to you next week as we go forward further and I'll send you email before then. Yeah, nice. Bye. Bye.