← Back
JetBrains TV October 19, 2026 36m

Fix Your CI Without Leaving the IDE: TeamCity MCP and CLI | Artem Rokhin | GameDev Day 2026

Read full transcript 30 segments
  1. We invite Artem, We invite Artem, who will present who will present who will present a report " a report " Fix your CI Fix your CI Fix your CI without leaving your IDE: TeamCity without leaving your IDE: TeamCity without leaving your IDE: TeamCity and CLI with Unity". Hello, and CLI with Unity". Hello, and CLI with Unity". Hello, Artem. Artem. Artem. Greetings. Hello, Nedo. Greetings. Hello, Nedo. Artem is a Artem is a solutions engineer at JetBrains. So, solutions engineer at JetBrains. So, solutions engineer at JetBrains. So, could you could you could you briefly tell briefly tell briefly tell us what exactly you'll be us what exactly you'll be us what exactly you'll be talking about? talking about? Um, yes, of course. I can , I can turn on , I can turn on , I can turn on some slides. some slides. some slides. I have an agenda I have an agenda I have an agenda and an introduction, so I can and an introduction, so I can and an introduction, so I can describe what I'm describe what I'm describe what I'm going to talk about. going to talk about. But for this I will But for this I will need the help of my need the help of my need the help of my colleagues so that colleagues so that colleagues so that We can turn on your We can turn on your We can turn on your screen. screen. screen. Good. That's Good. That's Good. That's it. Now we it. Now we it. Now we see your screen. see your screen. see your screen. Yes, we see it Yes, we see it Yes, we see it clearly. clearly. clearly. Thank you. Thank you very much. Thank you. Thank you very much. Thank you. Thank you very much. So, my name is So, my name is So, my name is Artem Rokhin. I'm a Artem Rokhin. I'm a Artem Rokhin. I'm a solutions engineer at solutions engineer at solutions engineer at JetBrains, working JetBrains, working JetBrains, working specifically for the specifically for the specifically for the TeamCity team, our CI/ TeamCity team, our CI/ CD platform. I've been at JetBrains for CD platform. I've been at JetBrains for CD platform. I've been at JetBrains for quite a long time, quite a long time, quite a long time, about 12 years. For about 12 years. For most of that most of that time, I worked as a time, I worked as a time, I worked as a release manager, release manager, release manager, helping teams helping teams helping teams get get get products to market faster.

  2. products to market faster. Of course. For the past Of course. For the past year, I have been on the TeamCity team, year, I have been on the TeamCity team, year, I have been on the TeamCity team, helping our helping our helping our clients build clients build clients build delivery pipelines delivery pipelines delivery pipelines based on TeamCity. So, this is based on TeamCity. So, this is based on TeamCity. So, this is all about me. What are all about me. What are all about me. What are we going to talk about we going to talk about we going to talk about today? First, today? First, today? First, for those who are not for those who are not for those who are not familiar with TeamCity, I will give a familiar with TeamCity, I will give a familiar with TeamCity, I will give a very brief introduction very brief introduction very brief introduction about the tool itself, about the tool itself, about the tool itself, how it looks for how it looks for game development projects. Yes? Then we're game development projects. Yes? Then we're going to run a going to run a going to run a build of the build of the build of the Unity project itself. We Unity project itself. We Unity project itself. We will try to do this will try to do this will try to do this locally. We locally. We locally. We will try this on the will try this on the will try this on the CI side. As you CI side. As you CI side. As you can see, I can see, I can see, I have a spoiler here. The assembly have a spoiler here. The assembly have a spoiler here. The assembly will fail. We will fail. We will fail. We will try will try will try to investigate this to investigate this to investigate this error, and the overall error, and the overall error, and the overall idea of ​​today's idea of ​​today's idea of ​​today's demo is to demo is to demo is to conduct this conduct this conduct this investigation without investigation without investigation without leaving the context of leaving the context of leaving the context of Rider. We've added a few Rider. We've added a few Rider. We've added a few options. And I options. And I options. And I will share them will share them will share them later. And, of course, there later. And, of course, there later. And, of course, there will be questions after that will be questions after that will be questions after that . So, . So, . So, let's start by let's start by let's start by introducing TeamCity.

  3. introducing TeamCity. Here is my Here is my TeamCity cloud instance. Yes? TeamCity cloud instance. Yes? TeamCity cloud instance. Yes? You can see You can see You can see the conveyor. This is the number of the conveyor. This is the number of the conveyor. This is the number of tasks that are tasks that are tasks that are connected to each connected to each connected to each other. They are other. They are other. They are being fulfilled. And being fulfilled. And it ends with the it ends with the deployment step. So, deployment step. So, deployment step. So, everything unfolds on everything unfolds on everything unfolds on staging. You see staging. You see code review, code review, security analysis using security analysis using security analysis using our well-known our well-known our well-known tool, and some tool, and some tool, and some tests being performed. So, the tests being performed. So, the tests being performed. So, the test results test results test results are being collected. Then we are being collected. Then we are being collected. Then we build the application itself build the application itself build the application itself for, for, for, for, for, for, for, for, for, for, for, for, for, for, for, sorry, for sorry, for sorry, for different platforms. And different platforms. And different platforms. And we deploy them in a we deploy them in a testing environment. Well, and for testing environment. Well, and for that, inside that, inside that, inside this pipeline we this pipeline we this pipeline we have certain features have certain features have certain features specifically for specifically for specifically for game developers. game developers. game developers. For example, we For example, we For example, we support all support all support all engines. I mean engines. I mean engines. I mean Unity, Unreal. We have some Unity, Unreal. We have some Unity, Unreal. We have some integrations with integrations with integrations with gaming gaming gaming tools. Me tools. Me tools. Me too, me too, I'll too, me too, I'll too, me too, I'll share this quickly right share this quickly right share this quickly right now. So, now. So, now. So, first about the tests.

  4. first about the tests. first about the tests. We have support for unit We have support for unit tests. This means, tests. This means, tests. This means, let me, let let me, let let me, let me open this me open this me open this configuration. Here's this one, configuration. Here's this one, configuration. Here's this one, and here we have the and here we have the and here we have the tests tab. Yes, and we tests tab. Yes, and we tests tab. Yes, and we can see separately can see separately can see separately all the unit tests that all the unit tests that all the unit tests that we have here. We have a we have here. We have a we have here. We have a time duration. We time duration. We time duration. We can filter can filter can filter tests by duration. tests by duration. This is really handy This is really handy when you have thousands, well, when you have thousands, well, when you have thousands, well, hundreds of these tests hundreds of these tests . And more importantly, we . And more importantly, we . And more importantly, we can go can go can go directly to the directly to the directly to the history of a specific history of a specific history of a specific test. Yes, and here we test. Yes, and here we test. Yes, and here we can see all the can see all the can see all the executions of this executions of this executions of this test. Historical test. Historical test. Historical results. So it's very results. So it's very results. So it's very useful to see useful to see useful to see statistics over time to see statistics over time to see statistics over time to see if there are any if there are any if there are any performance issues. We performance issues. We performance issues. We can see all the can see all the can see all the launches, right? All launches, right? All launches, right? All commit authors, all commit authors, all commit authors, all changes. And also at the top we changes. And also at the top we changes. And also at the top we have this have this have this management process. So, management process. So, management process. So, for example, you can investigate for example, you can investigate for example, you can investigate a test if it has a test if it has a test if it has random failures, and random failures, and random failures, and the person will receive the person will receive the person will receive a notification about the a notification about the a notification about the assignment of the assignment of the assignment of the study, or study, or study, or you can disable the you can disable the you can disable the test itself. This means that test itself. This means that test itself. This means that the test will still the test will still the test will still run, but run, but run, but TeamCity will ignore TeamCity will ignore TeamCity will ignore its results. This is its results. This is its results. This is very useful when very useful when very useful when you need to quickly you need to quickly you need to quickly unblock the unblock the unblock the release process. Well, let's move on release process. Well, let's move on , and the next one will be , and the next one will be Sorry. About the

  5. Sorry. About the Unity build step itself. So here Unity build step itself. So here Unity build step itself. So here I have a Unity build step I have a Unity build step . I can specify some . I can specify some . I can specify some necessary parameters. necessary parameters. necessary parameters. I can determine whether to I can determine whether to I can determine whether to run tests or run tests or run tests or not. I can choose not. I can choose not. I can choose player modes, player modes, player modes, such as turning such as turning such as turning graphics on or off, graphics on or off, graphics on or off, etc. So, this is etc. So, this is etc. So, this is available out of the box available out of the box available out of the box and ready to run the and ready to run the and ready to run the build step. And build step. And build step. And another point another point another point worth mentioning here is the worth mentioning here is the worth mentioning here is the integration with the integration with the integration with the Unity license. But to do Unity license. But to do Unity license. But to do that, we that, we that, we first need to get to first need to get to first need to get to the concept of a the concept of a the concept of a TeamCity agent. So, agents, TeamCity agent. So, agents, TeamCity agent. So, agents, TeamCity agent, this has TeamCity agent, this has TeamCity agent, this has nothing to do with nothing to do with nothing to do with artificial intelligence. artificial intelligence. artificial intelligence. These are so-called runners, These are so-called runners, These are so-called runners, that is, assembly that is, assembly that is, assembly machines where the machines where the machines where the code is executed. You code is executed. You code is executed. You see that for the cloud see that for the cloud see that for the cloud we have a certain number of we have a certain number of we have a certain number of agents, different agents, different agents, different sizes, sizes, sizes, virtual systems, virtual systems, virtual systems, etc. But before etc. But before etc. But before you start building you start building you start building Unity, right? You want Unity, right? You want Unity, right? You want to activate your to activate your to activate your Unity license, and that's exactly what you Unity license, and that's exactly what you Unity license, and that's exactly what you can do here.

  6. can do here. can do here. So you just So you just So you just specify it once, specify it once, specify it once, right? From the TeamCity side, the right? From the TeamCity side, the right? From the TeamCity side, the Unity license will be Unity license will be Unity license will be applied to applied to applied to each TeamCity agent each TeamCity agent each TeamCity agent so that the build can be so that the build can be so that the build can be successfully executed. successfully executed. So, this is a small but So, this is a small but really nice and really nice and really nice and useful feature for useful feature for useful feature for this kind of this kind of this kind of license management. Now license management. Now license management. Now let's get back to let's get back to let's get back to our conveyor. So our conveyor. So , you see some of the , you see some of the , you see some of the steps, right? They are steps, right? They are steps, right? They are interconnected. interconnected. interconnected. Some of them can Some of them can Some of them can be performed be performed be performed in parallel. First of in parallel. First of in parallel. First of all, it saves time. all, it saves time. TeamCity itself is designed TeamCity itself is designed to optimize to optimize to optimize build pipelines. And build pipelines. And build pipelines. And since all since all since all the tasks are the tasks are the tasks are interconnected, it interconnected, it interconnected, it allows allows allows for for for things like build cache, things like build cache, things like build cache, right? For example, you right? For example, you right? For example, you can perform a can perform a can perform a certain task at certain task at certain task at the beginning of the pipeline, right the beginning of the pipeline, right ? To retrieve certain ? To retrieve certain ? To retrieve certain artifacts, build cache artifacts, build cache , and then , and then , and then reuse it reuse it reuse it in all subsequent in all subsequent in all subsequent stages. Let's also stages. Let's also stages. Let's also quickly go over the quickly go over the quickly go over the pipeline settings pipeline settings pipeline settings and see how it and see how it and see how it can be run.

  7. can be run. can be run. I have auto-start enabled I have auto-start enabled for any new for any new changes to my changes to my changes to my repository. You repository. You repository. You can see that the system can see that the system can see that the system is tracking all the commits is tracking all the commits is tracking all the commits in my repository in my repository in my repository and triggering builds. and triggering builds. and triggering builds. Or I can also Or I can also Or I can also add a trigger on a add a trigger on a add a trigger on a schedule. This is useful schedule. This is useful when you have heavy when you have heavy when you have heavy workloads, such as workloads, such as workloads, such as performance tests performance tests performance tests or complex or complex or complex deployments, that you deployments, that you deployments, that you want to run want to run want to run at night. So by morning at night. So by morning at night. So by morning the results the results the results will be available, and will be available, and will be available, and engineers will be able to engineers will be able to react accordingly. It's all react accordingly. It's all about execution. about execution. about execution. Now let's see how to Now let's see how to Now let's see how to add a new task add a new task add a new task directly to the directly to the directly to the pipeline. By the way, it's pipeline. By the way, it's pipeline. By the way, it's quite simple and easy quite simple and easy . You just . You just . You just use use use the interface to do it. the interface to do it. the interface to do it. So, we'll give it a So, we'll give it a So, we'll give it a name and add name and add name and add a few steps. a few steps. For example, Unity. You For example, Unity. You can specify a name for can specify a name for can specify a name for the step. For example, the step. For example, the step. For example, tests. And we are ready to tests. And we are ready to tests. And we are ready to work. Now we work. Now we work. Now we need to assign need to assign need to assign this task to a pipeline this task to a pipeline this task to a pipeline and define the logic.

  8. and define the logic. and define the logic. So, for example, I So, for example, I So, for example, I want this to want this to want this to run in run in run in parallel with all parallel with all parallel with all my other my other my other checks. And now, checks. And now, checks. And now, if I click " if I click " save", TeamCity save", TeamCity save", TeamCity will prompt me to will prompt me to will prompt me to commit to my commit to my commit to my repository. This is because repository. This is because repository. This is because my my my TeamCity configuration is stored as TeamCity configuration is stored as TeamCity configuration is stored as code in my code in my code in my repository alongside repository alongside repository alongside my game code. True? my game code. True? my game code. True? And we need to And we need to And we need to remember this because remember this because remember this because we'll use we'll use we'll use it a little later. it a little later. So, let me So, let me cancel that for now. cancel that for now. And, actually, I think that And, actually, I think that should be should be should be enough for a enough for a enough for a quick overview of TeamCity. quick overview of TeamCity. So now I'll move on to the So now I'll move on to the Unity editor. One Unity editor. One Unity editor. One second. Here he is.

  9. second. Here he is. second. Here he is. Imagine I'm a Imagine I'm a Imagine I'm a game developer. I am game developer. I am game developer. I am creating a game. The game is on creating a game. The game is on creating a game. The game is on Unity, and now I've Unity, and now I've Unity, and now I've completed all the changes and am completed all the changes and am completed all the changes and am more or less ready more or less ready more or less ready to share to share to share the results with QA the results with QA engineers, other engineers, other engineers, other team members, and team members, and team members, and generally present generally present generally present it to end it to end it to end users. True? users. True? But I am a responsible But I am a responsible developer. So before I developer. So before I developer. So before I do that, before I do that, before I do that, before I share share share the results, I'm the results, I'm the results, I'm going to compile the game going to compile the game going to compile the game locally and locally and locally and test it test it test it myself. So myself. So myself. So let's do it. let's do it. let's do it. This will be quick. I'm This will be quick. I'm This will be quick. I'm launching it right launching it right launching it right now, and it's already now, and it's already now, and it's already available here. You available here. You available here. You see it's see it's see it's running on my running on my running on my localhost, localhost, localhost, right? And this is important right? And this is important right? And this is important to remember. So, in the to remember. So, in the to remember. So, in the game itself, I can game itself, I can game itself, I can choose a player. I choose a player. I choose a player. I can add can add can add transportation for myself and transportation for myself and transportation for myself and for the computer. I can for the computer. I can for the computer. I can drive drive . I can return. I . I can return. I . I can return. I can shoot, and it can shoot, and it can shoot, and it looks like we're looks like we're looks like we're on the moon. So I can on the moon. So I can on the moon. So I can explore the explore the explore the Moon itself. It looks like Moon itself. It looks like Moon itself. It looks like everything is working.

  10. everything is working. everything is working. It seems to work It seems to work It seems to work well. Yes. So, I well. Yes. So, I well. Yes. So, I committed all the committed all the committed all the changes to the repository. changes to the repository. TeamCity detected the changes and TeamCity detected the changes and executed the entire executed the entire executed the entire pipeline. So you pipeline. So you pipeline. So you see my changes are see my changes are see my changes are already here. The conveyor itself already here. The conveyor itself already here. The conveyor itself has been completed, and it is has been completed, and it is has been completed, and it is green. So, it looks like green. So, it looks like green. So, it looks like everything went as everything went as everything went as expected. Let's expected. Let's expected. Let's see. Here see. Here see. Here I have configurations I have configurations I have configurations for WebGL build and for WebGL build and for WebGL build and WebGL deployment. So WebGL deployment. So WebGL deployment. So if I go to the if I go to the deployment configuration and deployment configuration and scroll through the logs, I will scroll through the logs, I will scroll through the logs, I will find my find my find my test URL. So test URL. So test URL. So this is a this is a this is a testing URL, something on testing URL, something on testing URL, something on CloudFront. So I'm CloudFront. So I'm CloudFront. So I'm deploying this on AWS.

  11. deploying this on AWS. deploying this on AWS. Let me open Let me open Let me open this link. You this link. You this link. You see that this is now a see that this is now a see that this is now a cloud URL, cloud URL, cloud URL, right? And my game is right? And my game is right? And my game is now here. Hmm, probably the now here. Hmm, probably the now here. Hmm, probably the same, but something might same, but something might same, but something might be a little different. be a little different. So, let me So, let me continue with the selection and continue with the selection and continue with the selection and start the game itself. start the game itself. Okay, it starts, and Okay, it starts, and of course you see that there is of course you see that there is of course you see that there is no background. So, I no background. So, I no background. So, I can still drive can still drive can still drive my my my vehicle. I can vehicle. I can vehicle. I can shoot, I can shoot, I can shoot, I can drive. But there is no background here drive. But there is no background here drive. But there is no background here . Okay, let's . Okay, let's . Okay, let's close this for now. close this for now. So, we are in a So, we are in a situation where something situation where something situation where something works locally, but works locally, but works locally, but not on the remote not on the remote not on the remote server. Right? server. Right? server. Right? Not on staging. Not on staging. I think this is a scenario I think this is a scenario you've encountered you've encountered you've encountered at least once in your at least once in your at least once in your career. So, how do you career. So, how do you career. So, how do you investigate this? What investigate this? What investigate this? What to do? There must to do? There must to do? There must be some difference between be some difference between be some difference between how I run how I run how I run the application locally the application locally the application locally and how I do it in CI.

  12. and how I do it in CI. So now I can So now I can move on to the move on to the move on to the pipeline settings pipeline settings . I can check . I can check . I can check the parameters. I can the parameters. I can the parameters. I can check a check a check a specific task. I specific task. I specific task. I can look at can look at can look at the scripts themselves or maybe the the scripts themselves or maybe the task-specific parameters, task-specific parameters, right? Maybe I'll right? Maybe I'll right? Maybe I'll find something. I'll move on to find something. I'll move on to find something. I'll move on to Unity itself. I'll try to Unity itself. I'll try to Unity itself. I'll try to go through go through go through the settings in Unity. the settings in Unity. the settings in Unity. Of course, I'll switch to Of course, I'll switch to Of course, I'll switch to my Rider. I will check the my Rider. I will check the my Rider. I will check the code. Maybe code. Maybe code. Maybe I'll check I'll check I'll check the configuration. the configuration. the configuration. Maybe some other Maybe some other Maybe some other things, right? Uh-huh. I will things, right? Uh-huh. I will things, right? Uh-huh. I will go back to TeamCity and go back to TeamCity and go back to TeamCity and repeat these repeat these repeat these iterations many iterations many iterations many times until I find the times until I find the times until I find the real cause of the real cause of the real cause of the problem. But my problem. But my problem. But my idea is to idea is to idea is to stay in Rider and stay in Rider and stay in Rider and try to investigate the try to investigate the try to investigate the crash directly from there. And crash directly from there. And crash directly from there. And to do this, we to do this, we to do this, we implemented two things in TeamCity.

  13. implemented two things in TeamCity. So, the first one is TeamCity So, the first one is TeamCity CLI. And the second is TeamCity MCP. CLI. And the second is TeamCity MCP. CLI. And the second is TeamCity MCP. So let me So let me So let me start with the CLI. Essentially, start with the CLI. Essentially, start with the CLI. Essentially, it is a command line it is a command line it is a command line for interacting with the for interacting with the for interacting with the TeamCity server. TeamCity server. TeamCity server. Let me Let me Let me run it. It should be run it. It should be run it. It should be TeamCity. TeamCity. TeamCity. It is now It is now It is now starting. Okay. starting. Okay. starting. Okay. So, I'm ready to So, I'm ready to So, I'm ready to log into my log into my log into my TeamCity instance. And TeamCity instance. And TeamCity instance. And see how it see how it see how it works. Oh, wait. works. Oh, wait. works. Oh, wait. Maybe I'll just Maybe I'll just Maybe I'll just check. Maybe I'm check. Maybe I'm check. Maybe I'm already connected. So already connected. So , this should be TeamCity auth , this should be TeamCity auth , this should be TeamCity auth status. Okay, let's go. status. Okay, let's go. status. Okay, let's go. We logged in to We logged in to We logged in to demo.teamcity.com. And now we demo.teamcity.com. And now we demo.teamcity.com. And now we can check can check can check all the recent all the recent all the recent runs in my runs in my runs in my pipeline. So, TeamCity pipeline. So, TeamCity pipeline. So, TeamCity run list. And for the task, run list. And for the task, run list. And for the task, we need to we need to we need to copy the project ID.

  14. copy the project ID. So, it's "tanks" something there. So, it's "tanks" something there. Let me insert Let me insert Let me insert it here. Tank unit, tank it here. Tank unit, tank it here. Tank unit, tank build. And let's build. And let's build. And let's limit it to five, the limit it to five, the limit it to five, the last five last five last five performances. Okay, performances. Okay, performances. Okay, so we have a list of so we have a list of so we have a list of all the performances. So, all the performances. So, all the performances. So, they are all successful, but they are all successful, but they are all successful, but of course I need the of course I need the of course I need the last one. Because last one. Because last one. Because something was damaged something was damaged something was damaged in this, in this in this, in this in this, in this launch. And for that, launch. And for that, launch. And for that, I need to I need to I need to copy this ID. It's 2 copy this ID. It's 2 copy this ID. It's 2 8 2 2 1. And now I 8 2 2 1. And now I 8 2 2 1. And now I need to investigate, uh need to investigate, uh , and see what , and see what , and see what this, what this launch this, what this launch this, what this launch looks like. Again looks like. Again looks like. Again , I can , I can , I can continue to do continue to do continue to do this on the command line this on the command line . So, TeamCity, let's . So, TeamCity, let's . So, TeamCity, let's use view and ID. use view and ID. Okay, well, it gives Okay, well, it gives me a list of tasks me a list of tasks me a list of tasks inside the pipeline. Uh inside the pipeline. Uh , I still want to, uh, , I still want to, uh, , I still want to, uh, see the results of see the results of see the results of the tasks and IDs in this the tasks and IDs in this the tasks and IDs in this pipeline. Okay, and here pipeline. Okay, and here pipeline. Okay, and here we are. And since we are. And since we are. And since the problem was related to the problem was related to the problem was related to WebGL, right? I'm willing to WebGL, right? I'm willing to WebGL, right? I'm willing to bet that bet that bet that something went wrong with the something went wrong with the something went wrong with the WebGL build task.

  15. WebGL build task. So let me So let me explore, investigate explore, investigate explore, investigate this task. I this task. I this task. I need to copy the need to copy the need to copy the WebGL assembly ID. This, uh, this one WebGL assembly ID. This, uh, this one . Okay, and I . Okay, and I can see the overview of can see the overview of can see the overview of this task. In this task. In this task. In a second. Okay, and we're a second. Okay, and we're a second. Okay, and we're launching it. launching it. launching it. Let's start, we have Let's start, we have Let's start, we have basic information basic information basic information about the task. So, we about the task. So, we about the task. So, we see that it was see that it was see that it was successful and lasted successful and lasted successful and lasted about 10 minutes. about 10 minutes. about 10 minutes. So, this, uh, this is where we So, this, uh, this is where we So, this, uh, this is where we can see the agent can see the agent can see the agent that was used for this that was used for this that was used for this . We . We . We see a link to a see a link to a see a link to a browser to browser to browser to view logs. But, view logs. But, view logs. But, well, I want to well, I want to well, I want to stay in the console stay in the console stay in the console and not go back to the and not go back to the and not go back to the browser. So for browser. So for browser. So for that, let me that, let me that, let me dig deeper and dig deeper and dig deeper and check the logs of these check the logs of these check the logs of these executions right here in the executions right here in the executions right here in the terminal. So, terminal. So, terminal. So, change the change the change the view mode to log and view mode to log and view mode to log and run again. And here run again. And here run again. And here we are. Basically we are. Basically , this is all the logs that , this is all the logs that , this is all the logs that TeamCity has for this TeamCity has for this TeamCity has for this particular run.

  16. particular run. So, I can see So, I can see all the details, all the all the details, all the all the details, all the debugging debugging debugging information, information, information, warnings, warnings, warnings, errors that occurred errors that occurred errors that occurred during this run during this run . But maybe that's . But maybe that's . But maybe that's too much. Maybe too much. Maybe too much. Maybe that's too much, but hey that's too much, but hey that's too much, but hey , we're still in the , we're still in the , we're still in the terminal. So we terminal. So we terminal. So we can actually can actually can actually extract the entire log, the extract the entire log, the extract the entire log, the entire log in its entirety. entire log in its entirety. entire log in its entirety. Also, I suspect Also, I suspect Also, I suspect it has something to do with it has something to do with it has something to do with flavor mode, as flavor mode, as flavor mode, as I've been working I've been working I've been working with it recently. True. And I'm with it recently. True. And I'm with it recently. True. And I'm just going to just going to just going to search for flavor and search for flavor and search for flavor and see if there's see if there's see if there's anything mentioned about anything mentioned about anything mentioned about it in the logs. So it in the logs. So it in the logs. So let me let me let me do this. Uh, flavor, and do this. Uh, flavor, and do this. Uh, flavor, and here we are. So, here we are. So, here we are. So, actually we have a actually we have a actually we have a parameter, well, it's parameter, well, it's parameter, well, it's called game build called game build called game build flavor, and it was flavor, and it was flavor, and it was set to set to set to diagnostic. So, that's most likely the diagnostic. So, that's most likely the diagnostic. So, that's most likely the reason why reason why reason why our game didn't have our game didn't have our game didn't have that background. Yes? that background. Yes? Let's see Let's see how this parameter is defined how this parameter is defined how this parameter is defined . As I . As I . As I mentioned, TeamCity mentioned, TeamCity mentioned, TeamCity stores all stores all stores all configuration as code, configuration as code, configuration as code, right? So, we right? So, we right? So, we have a TeamCity YAML file in the have a TeamCity YAML file in the have a TeamCity YAML file in the repository with all repository with all repository with all the settings, the settings, the settings, right? For our right? For our right? For our conveyor. And let's conveyor. And let's conveyor. And let's search for "diagnostic".

  17. search for "diagnostic". search for "diagnostic". Okay, he's here. You Okay, he's here. You Okay, he's here. You can see that the environment parameter can see that the environment parameter is defined and is defined and set to " set to " diagnostic". Now let's diagnostic". Now let's diagnostic". Now let's change it. So, change it. So, change it. So, let's change it let's change it let's change it to "game". Okay, "game." And to "game". Okay, "game." And to "game". Okay, "game." And let's make a let's make a let's make a commit. Let's commit. Let's commit. Let's capture this change. capture this change. capture this change. Let's add some Let's add some Let's add some message to the message to the message to the commit. Update commit. Update Update the Update the version parameter. Um, parameter, version parameter. Um, parameter, version parameter. Um, parameter, and actually push. and actually push. Let's push all changes Let's push all changes to the remote to the remote to the remote repository. repository. Since TeamCity is Since TeamCity is monitoring my monitoring my monitoring my repository and can repository and can repository and can detect all changes, detect all changes, detect all changes, it should find this it should find this it should find this change and start the change and start the change and start the pipeline automatically. pipeline automatically. We can check We can check this via CLI, but we this via CLI, but we this via CLI, but we can also check this can also check this can also check this via browser. So via browser. So via browser. So let me let me let me quickly go to the quickly go to the quickly go to the pipeline list.

  18. pipeline list. So, the test build, So, the test build, let's open it. And you let's open it. And you let's open it. And you can see that the pipeline is can see that the pipeline is can see that the pipeline is now in the process of now in the process of now in the process of execution. Here is our execution. Here is our execution. Here is our commit with the commit with the commit with the parameter update, and the parameter update, and the parameter update, and the pipeline itself has already pipeline itself has already pipeline itself has already started. So, the started. So, the started. So, the code verification code verification code verification passed. Okay, passed. Okay, passed. Okay, code analysis too. And code analysis too. And code analysis too. And now we are running now we are running now we are running tests. Okay, it looks like tests. Okay, it looks like tests. Okay, it looks like everything is working. This everything is working. This everything is working. This will take some time. To will take some time. To will take some time. To finish. In the finish. In the finish. In the meantime, let's get back to meantime, let's get back to meantime, let's get back to Rider. And as I said, Rider. And as I said, Rider. And as I said, there were two approaches to there were two approaches to there were two approaches to interacting with TeamCity from Rider interacting with TeamCity from Rider . And the next approach . And the next approach is MCP. So, TeamCity has an MCP is MCP. So, TeamCity has an MCP endpoint, and we can endpoint, and we can endpoint, and we can configure it in configure it in configure it in Rider settings. If Rider settings. If Rider settings. If we go to Tools, we go to Tools, we go to Tools, Assistance, MCP, I've already added a Assistance, MCP, I've already added a TeamCity connection here. Yes, I just TeamCity connection here. Yes, I just added it. So, here's added it. So, here's added it. So, here's my MCP endpoint, and here's my MCP endpoint, and here's my MCP endpoint, and here's my my my authorization token. It is important authorization token. It is important authorization token. It is important to know that when to know that when to know that when generating this generating this generating this token, I could choose the token, I could choose the token, I could choose the scope available scope available scope available through the MCP. This can be a through the MCP. This can be a through the MCP. This can be a global scope, a global scope, a global scope, a project scope, and project scope, and project scope, and you can you can you can even define even define even define permissions within a project. For example,

  19. permissions within a project. For example, permissions within a project. For example, you can set you can set you can set read-only permissions read-only permissions read-only permissions for a specific for a specific for a specific project. So your AI project. So your AI agent will have agent will have agent will have limited scope and limited scope and limited scope and permissions and will not be able to permissions and will not be able to permissions and will not be able to corrupt your corrupt your corrupt your configuration. Now in configuration. Now in configuration. Now in Rider we can Rider we can Rider we can open the AI ​​chat open the AI ​​chat open the AI ​​chat on the right. It is already on the right. It is already on the right. It is already open to me. open to me. Yes, you see the AI ​​chat Yes, you see the AI ​​chat right here, so we right here, so we right here, so we can start a can start a can start a new chat. I am going to new chat. I am going to new chat. I am going to use my use my use my agent of agent of agent of choice. This is Cloud, but you choice. This is Cloud, but you choice. This is Cloud, but you can can can use any other one use any other one you are familiar with. So, you are familiar with. So, let me let me let me enter a very simple enter a very simple enter a very simple query. I ask my query. I ask my query. I ask my Cloud agent, Cloud agent, Cloud agent, using TeamCity using TeamCity using TeamCity MCP, to check what MCP, to check what MCP, to check what is happening with the background is happening with the background is happening with the background on the staging and why on the staging and why everything is working everything is working fine on my local machine. You see, fine on my local machine. You see, fine on my local machine. You see, he's working now.

  20. he's working now. he's working now. I'm looking for tools. You I'm looking for tools. You I'm looking for tools. You see that the see that the MCP connection is used. So, he MCP connection is used. So, he detects certain detects certain detects certain launches, 45, and you see, launches, 45, and you see, launches, 45, and you see, he just noticed them. he just noticed them. It turned out that the It turned out that the build type was build type was build type was set to " set to " diagnostic", and this is diagnostic", and this is diagnostic", and this is actually the cause of this actually the cause of this actually the cause of this error. Of course, Cloud error. Of course, Cloud error. Of course, Cloud will give me more will give me more will give me more details, more details, more details, more explanations, and he explanations, and he explanations, and he even revealed that even revealed that even revealed that the fix has already the fix has already the fix has already been committed, been committed, been committed, etc. So what we etc. So what we etc. So what we need to do is need to do is need to do is just wait for just wait for just wait for the pipeline to complete. the pipeline to complete. Right? Then we Right? Then we can check can check can check if if if the fix really the fix really the fix really helped us helped us helped us fix the problem.

  21. fix the problem. Right? Let Right? Let me ask Cloud to me ask Cloud to me ask Cloud to monitor the pipeline monitor the pipeline monitor the pipeline and provide me with a and provide me with a and provide me with a link once link once link once the build is the build is the build is deployed to my deployed to my deployed to my cloud environment. cloud environment. So let me So let me use this use this use this query. Just a second. query. Just a second. By the way, we could By the way, we could do this via CLI, do this via CLI, do this via CLI, right? Because we could right? Because we could right? Because we could open the list of open the list of open the list of running tasks. running tasks. Here I asked my Here I asked my Cloud Agent to monitor the Cloud Agent to monitor the Cloud Agent to monitor the latest pipeline, latest pipeline, latest pipeline, notify me when notify me when notify me when it completes, and it completes, and it completes, and also provide a also provide a also provide a link to my link to my staging environment so I could staging environment so I could test test test the fix myself. Okay, the fix myself. Okay, the fix myself. Okay, the conveyor is still running the conveyor is still running . It gets . It gets . It gets information from the information from the information from the TeamCity server. Almost 50% TeamCity server. Almost 50% complete. WebGL is currently in complete. WebGL is currently in complete. WebGL is currently in development. The next development. The next development. The next check check check will occur in 30 will occur in 30 will occur in 30 seconds. Oh, okay, it's seconds. Oh, okay, it's seconds. Oh, okay, it's already over. So already over. So already over. So let's check let's check let's check if our if our if our fix helped.

  22. fix helped. Let me Let me copy Let copy Let copy Let me copy the me copy the staging URL. And staging URL. And staging URL. And let's go back to let's go back to let's go back to the browser to the browser to the browser to see how it see how it see how it works now. One works now. One works now. One second. New tab second. New tab , let's go. And yes, yes , let's go. And yes, yes . Okay, right from . Okay, right from . Okay, right from this view you this view you this view you can see that the moon is can see that the moon is can see that the moon is available here. And so, available here. And so, available here. And so, let's just let's just let's just choose the choose the choose the vehicles. Okay, yes. vehicles. Okay, yes. vehicles. Okay, yes. We see that now We see that now We see that now the behavior is exactly the same as the behavior is exactly the same as the behavior is exactly the same as on my on my on my local machine. local machine. local machine. So, I can drive the So, I can drive the So, I can drive the vehicle myself vehicle myself vehicle myself and see the and see the and see the moon. I can moon. I can moon. I can explore the map. explore the map. Okay, it looks like Okay, it looks like the fix the fix the fix worked and worked and worked and everything is working now. And here are, in everything is working now. And here are, in everything is working now. And here are, in fact, two ways fact, two ways fact, two ways you can explore you can explore you can explore such problems directly from such problems directly from such problems directly from Rider. And you don't need to Rider. And you don't need to Rider. And you don't need to constantly switch constantly switch constantly switch contexts, jumping contexts, jumping contexts, jumping back and forth. Okay, and back and forth. Okay, and back and forth. Okay, and finally the cloud finally the cloud finally the cloud informed me that informed me that informed me that the build was successfully the build was successfully the build was successfully completed. OK.

  23. completed. OK. Yes, that's actually the Yes, that's actually the main idea. So you main idea. So you main idea. So you can just can just can just stay in one stay in one stay in one interface and interface and interface and solve any solve any solve any issues, even if issues, even if issues, even if they are related to they are related to continuous continuous integration, integration, integration, infrastructure, or infrastructure, or infrastructure, or something else. And so, something else. And so, something else. And so, that's all I wanted to that's all I wanted to that's all I wanted to talk about today. talk about today. If you are interested, if If you are interested, if you would like to learn you would like to learn you would like to learn more details, if more details, if more details, if you would like to you would like to you would like to chat with chat with chat with us, we can us, we can us, we can prepare a prepare a prepare a custom custom custom demo for demo for demo for your specific your specific your specific needs or needs or needs or discuss your discuss your discuss your processes, please processes, please processes, please contact us contact us contact us via jetbrains.com/teamcity. And via jetbrains.com/teamcity. And via jetbrains.com/teamcity. And yes, we would be very yes, we would be very yes, we would be very happy to do that. happy to do that. Thank you. Yes, thank you very much for Yes, thank you very much for your report. She your report. She your report. She was very interesting. was very interesting. was very interesting. I have a question right away.

  24. I have a question right away. I have a question right away. Can I ask? Can I ask? Can I ask? Yes, of course. Yes, of course. As a JetBrains developer, I'm As a JetBrains developer, I'm used to using used to using used to using TeamCity, but I understand TeamCity, but I understand TeamCity, but I understand that people may that people may that people may wonder wonder wonder how it how it how it differs from differs from differs from GitHub Actions. So GitHub Actions. So GitHub Actions. So could you elaborate could you elaborate could you elaborate on that? on that? on that? How is it How is it How is it different from different from different from GitHub Actions? We recently GitHub Actions? We recently GitHub Actions? We recently implemented, and I implemented, and I implemented, and I showed this during the showed this during the showed this during the demo, we demo, we demo, we introduced TeamCity introduced TeamCity introduced TeamCity Pipelines. This is a Pipelines. This is a Pipelines. This is a YAML-based approach where you can YAML-based approach where you can configure your configure your pipelines very quickly and easily. So in that pipelines very quickly and easily. So in that pipelines very quickly and easily. So in that regard, with this feature, regard, with this feature, regard, with this feature, TeamCity looks pretty much the TeamCity looks pretty much the TeamCity looks pretty much the same and provides the same and provides the same and provides the same visibility and same visibility and same visibility and ease of ease of ease of use, use, use, right? However, it also right? However, it also right? However, it also has some specific has some specific has some specific features for features for features for game development, right? It game development, right? It game development, right? It supports all game supports all game supports all game engines out of the box. It engines out of the box. It engines out of the box. It has a lot of has a lot of has a lot of optimization features like optimization features like optimization features like build cache, unit build cache, unit build cache, unit tests, the ability to tests, the ability to tests, the ability to disable and disable and disable and explore tests, explore tests, explore tests, check everything, and check everything, and check everything, and have complete visibility. And have complete visibility. And have complete visibility. And it also supports it also supports it also supports very complex and very complex and very complex and advanced pipelines advanced pipelines advanced pipelines where you need to where you need to where you need to deploy a project to deploy a project to deploy a project to multiple platforms, multiple platforms, multiple platforms, right? And you can right? And you can right? And you can do this perfectly do this perfectly do this perfectly with TeamCity.

  25. with TeamCity. Yes, cool. Sounds Yes, cool. Sounds really cool. really cool. Yes, absolutely. Um, I was Yes, absolutely. Um, I was also, you know, also, you know, also, you know, surprised surprised surprised to see the to see the to see the command line return. It's like we're coming command line return. It's like we're coming full circle again. I started full circle again. I started with the command line with the command line with the command line because I'm old, then it all because I'm old, then it all because I'm old, then it all moved on to moved on to user-friendly user interfaces, and now user-friendly user interfaces, and now we're back we're back we're back to the command line again. to the command line again. to the command line again. Interestingly, during the Interestingly, during the Interestingly, during the session we conducted session we conducted session we conducted a survey where one a survey where one a survey where one of the questions was, “How do of the questions was, “How do of the questions was, “How do you interact with you interact with you interact with your CI?” and CLI topped your CI?” and CLI topped your CI?” and CLI topped the list, which is very the list, which is very the list, which is very interesting. So, more and interesting. So, more and interesting. So, more and more people more people more people are using CLI. And this is a are using CLI. And this is a are using CLI. And this is a great way great way great way to work with MCP and to work with MCP and to work with MCP and artificial intelligence. artificial intelligence. artificial intelligence. I'm curious, you know, I'm curious, you know, I'm curious, you know, because I work with because I work with because I work with Rider, I like to Rider, I like to Rider, I like to stay with Rider stay with Rider stay with Rider as long as possible. You know as long as possible. You know , if I write code and , if I write code and , if I write code and work in this work in this work in this mode. What about the mode. What about the mode. What about the return journey? Is return journey? Is return journey? Is there artificial intelligence in there artificial intelligence in there artificial intelligence in TeamCity itself, or is it TeamCity itself, or is it TeamCity itself, or is it just third-party AI? just third-party AI? just third-party AI? Um, yes. In fact, we Um, yes. In fact, we Um, yes. In fact, we added AI assistance added AI assistance added AI assistance directly into TeamCity.

  26. directly into TeamCity. For example, you can For example, you can ask about ask about ask about configuration, how to configuration, how to configuration, how to specify or add specify or add specify or add some dependencies, some dependencies, some dependencies, settings, settings, settings, build features, etc. build features, etc. We also have an AI-based build analyzer. That is, when AI-based build analyzer. That is, when a build crashes, you a build crashes, you a build crashes, you can ask AI can ask AI can ask AI to analyze to analyze to analyze the error. And because the error. And because the error. And because TeamCity has the context of the TeamCity has the context of the TeamCity has the context of the build configuration build configuration build configuration and the and the and the repository itself, it repository itself, it repository itself, it handles this handles this handles this very well. He can very well. He can very well. He can provide explanations and provide explanations and provide explanations and recommendations on how recommendations on how recommendations on how to fix this error. to fix this error. By the way, By the way, more more more steps will be coming soon. We steps will be coming soon. We steps will be coming soon. We continue to continue to continue to work on work on work on AI features. So stay AI features. So stay AI features. So stay tuned for tuned for tuned for updates. updates. updates. I'm looking forward to I'm looking forward to using this myself, because sometimes it's really using this myself, because sometimes it's really hard hard hard to understand why a to understand why a to understand why a build failed. build failed. build failed. So, yes. Sounds So, yes. Sounds So, yes. Sounds very cool. very cool. very cool. Mhm. Yes, the more Mhm. Yes, the more Mhm. Yes, the more complex your complex your complex your build, the more build, the more build, the more places where something can places where something can places where something can go wrong. I go wrong. I go wrong. I liked the comment liked the comment liked the comment in the previous panel in the previous panel in the previous panel where we discussed AI where we discussed AI where we discussed AI to help to help to help customers with customers with customers with support requests.

  27. support requests. You seem to be leaving You seem to be leaving the person in the process, but the person in the process, but the person in the process, but being able to quickly being able to quickly being able to quickly answer answer answer questions is also a questions is also a questions is also a very useful thing. very useful thing. That's right. Exactly. Um, we had...Oh, Um, we had...Oh, sorry, Nadia. sorry, Nadia. sorry, Nadia. Continue. Continue. Continue. Yes, I just wanted to Yes, I just wanted to Yes, I just wanted to mention that we had an mention that we had an mention that we had an interesting question in the interesting question in the interesting question in the chat. Daniel already chat. Daniel already chat. Daniel already answered, but answered, but answered, but maybe it's worth maybe it's worth maybe it's worth voicing it here. Are voicing it here. Are voicing it here. Are these these these builds hosted in TeamCity? And what is the builds hosted in TeamCity? And what is the builds hosted in TeamCity? And what is the storage cost storage cost storage cost per GB? So, could per GB? So, could per GB? So, could you, yes. you, yes. you, yes. So, So, So, it depends on it depends on it depends on how you set it up. how you set it up. how you set it up. You can host You can host You can host this in the product this in the product this in the product inside TeamCity, but inside TeamCity, but inside TeamCity, but you can also you can also you can also set up external set up external set up external storage, such as S3, storage, such as S3, storage, such as S3, and store it there. Regarding and store it there. Regarding and store it there. Regarding pricing, we pricing, we pricing, we have a calculator on have a calculator on have a calculator on our website. You our website. You our website. You can specify the can specify the can specify the exact size of exact size of exact size of the artifacts and it will the artifacts and it will the artifacts and it will show you the correct show you the correct show you the correct figure.

  28. figure. Class. I Class. I love that we love that we love that we have so many different have so many different have so many different options for working options for working options for working with TeamCity, on our own or with TeamCity, on our own or with TeamCity, on our own or however we want. Daniel however we want. Daniel however we want. Daniel also mentioned TeamCity Cloud, also mentioned TeamCity Cloud, also mentioned TeamCity Cloud, which is a SaaS version. which is a SaaS version. which is a SaaS version. Well, of course. And that's Well, of course. And that's Well, of course. And that's exactly what I was exactly what I was exactly what I was showing. That is, showing. That is, showing. That is, there are two options. there are two options. there are two options. The first is TeamCity The first is TeamCity The first is TeamCity on-premises. You can on-premises. You can on-premises. You can run it on run it on run it on your own your own your own infrastructure, infrastructure, infrastructure, even in an isolated even in an isolated even in an isolated network, and manage network, and manage network, and manage everything yourself, or everything yourself, or everything yourself, or use our use our use our cloud offering. cloud offering. With all available With all available agents: Windows, Linux, and agents: Windows, Linux, and agents: Windows, Linux, and even Mac. So if you even Mac. So if you even Mac. So if you don't want don't want don't want to worry about them to worry about them to worry about them yourself, you can yourself, you can yourself, you can use our use our use our cloud agents. There cloud agents. There cloud agents. There is also a hybrid mode where is also a hybrid mode where is also a hybrid mode where you run you run you run TeamCity management in the TeamCity management in the TeamCity management in the cloud, we update cloud, we update cloud, we update it for you, and all it for you, and all it for you, and all agents run on agents run on agents run on your infrastructure your infrastructure . In this case, all the . In this case, all the . In this case, all the code remains with the code remains with the code remains with the agents on your agents on your agents on your premises.

  29. premises. Oh, this is very useful for Oh, this is very useful for game studios that game studios that game studios that want to keep all the want to keep all the want to keep all the code in-house, while code in-house, while JetBrains manages the continuous integration system within the SaaS service. service. Sorry, please repeat that again Sorry, please repeat that again . . So, the actual So, the actual management of the management of the management of the TeamCity server itself. That is, TeamCity server itself. That is, TeamCity server itself. That is, all build agents all build agents all build agents run in the studio, and the run in the studio, and the run in the studio, and the management console management console management console runs under the runs under the runs under the guidance of JetBrains. guidance of JetBrains. guidance of JetBrains. Yes. Yes. Yes. Yes. Yes. Yes. Yes. Yes. Yes. Yes. Yes. Yes. That's right. That's right. That's right. Yes, great. Good. Yes, great. Good. Yes, great. Good. I like this I like this I like this hybrid option. An hybrid option. An hybrid option. An interesting additional interesting additional interesting additional question. Um, if question. Um, if question. Um, if you have that, is it you have that, is it you have that, is it also possible to start and also possible to start and also possible to start and stop machines, stop machines, stop machines, i.e. agents, to i.e. agents, to i.e. agents, to scale your scale your scale your build farm, so to build farm, so to build farm, so to speak? speak? Yes. Of course, there Yes. Of course, there are different options for this. are different options for this. For example, you can For example, you can move all the move all the move all the executions to, say, executions to, say, executions to, say, Kubernetes, right? We have Kubernetes, right? We have Kubernetes, right? We have native integration with native integration with native integration with Kubernetes, and when Kubernetes, and when Kubernetes, and when the need arises, a the need arises, a the need arises, a Kubernetes pod is created in which Kubernetes pod is created in which Kubernetes pod is created in which the task is executed the task is executed . Of course, when there's nothing . Of course, when there's nothing . Of course, when there's nothing to run, everything will be to run, everything will be to run, everything will be closed. So you don't have to closed. So you don't have to closed. So you don't have to worry about worry about worry about downtime of machines or downtime of machines or downtime of machines or agents. So no, we don't agents. So no, we don't agents. So no, we don't charge until you

  30. charge until you charge until you run any run any run any tasks in TeamCity. tasks in TeamCity. I'm glad to hear that. I'm glad to hear that. That's good. Okay, That's good. Okay, That's good. Okay, Adam. Thank you for the Adam. Thank you for the Adam. Thank you for the wonderful presentation. wonderful presentation. wonderful presentation. I really I really I really like the new like the new like the new pipelines feature pipelines feature pipelines feature we have in TeamCity. we have in TeamCity. we have in TeamCity. This makes it much easier This makes it much easier This makes it much easier to understand what is to understand what is to understand what is happening and the happening and the happening and the setup process. setup process. setup process. This is a wonderful thing. Wonderful This is a wonderful thing. Wonderful This is a wonderful thing. Wonderful presentation. presentation. presentation. Thank you for inviting Thank you for inviting Thank you for inviting me today. I am very glad me today. I am very glad me today. I am very glad that I was able to that I was able to that I was able to deliver this deliver this deliver this report.

Summary

The presentation focuses on integrating TeamCity, a CI/CD platform, with Unity game development workflows. Key subjects include using TeamCity for build automation and troubleshooting failures directly within the IDE using JetBrains Rider. The practical takeaway is the ability to fix CI issues without leaving your development environment, thereby streamlining the game development pipeline.

View original episode ↗