Hi everyone, welcome back to CKaphkona live show. I'm your host Stephen Simon and we are
back with another episode of CKaphkona MVP show. And if you are someone who is joining
us for the very first time, we do this CKaphkona MVP show every Wednesday at 7.30pm IST and
9am EST. And that's the time where we go live every Wednesday. And apart from this
we do a lot of other shows. I mean, we do our snailing shows, we do our virtual conferences
we do our growth mindset shows. So, if you are someone who is joining us for the very
first time, just go in, just ckaph.live and you will find all our video content over there
and all the live shows we have done. And before we go ahead and invite our guest of the show
today, who is an amazing personality. Let me go and talk a little about him. So, he's
Tiago and he's joining us from Portugal. Pretty interesting place, very far from where
I am now. And he works in ITO, .NET and DevOps. He has a few close to him, around 50 articles
and many of his articles have been featured on CKaphkona. And if you are someone who works
on .NET or you are using articles on .NET and ITO, you might have read some of his articles
And he has been an MP for two times and we are really excited to bring him to the show
today. So, without any further ado, let me go ahead and invite our guest of the show
Tiago joining us from Portugal. Hi, Tiago, welcome to the live show
Hello, Sanyam, nice to meet you. How are you? Thank you. I'm great. I'm great, Tiago. Thank you so much for accepting my invitation for
this live show. And before we go and talk about all this technical stuff, right, so
let me go ahead and ask you to give a quick introduction about who you are and what you
do. I'm hearing you have experience, I guess a lot. Yeah, that's quite a lot, Sanyam, yes. So, I am software developer and I also have some
skills in the software, in leading software projects as well. And I am doing project management
So, in those 10 years of experience, I have gone through some companies, some big companies
small companies, large companies. And right now I'm working for Boldi, Dev by Devotion
which is one of the largest companies here in Portugal. That's great. Portugal is an interesting place. I know you guys had an opportunity to visit there
Yeah, it was very nice to meet you. Yeah, let me go ahead and ask you, Tiago, how did you come to know about C Sharp Corner
about this platform? And when did you decide that, okay, this is the time I should go and
start contributing? So, how has that changed from being a leader at C Sharp Corner and
started contributing? How did that happen? That's a very nice question. So, my first contact with C Sharp Corner was like, I think
that most of the developers had the first contact, looking for an answer, which had
an issue from my job. So, I was looking for answers, found the C Sharp Corner portal
and found articles to provide my answers. And later I started studying more, more deeply
about the .NET and VT architecture. And I found some very positive topics that they
are not very used. So, I started to create an article in order to create a catalog for
me. So, I could go to this catalog and check some code examples of features working. For
example, I started working about the MDC Action Resume. That was my first article. So, it
was only for me. And then I found that at C Sharp Corner, I could also post that and
it would be available for other developers. So, I would also be helping other developers
So, that was my first contact with C Sharp Corner. And I see, Tiago, your articles have been read 670,000 times. That's a lot, right
These many times your articles have been read. Let me just go ahead and quickly pull up
okay, maybe this one, right? Just to share your memory. This is your article, Object
References, not 690,000. This has crossed over 227,000 views. That's a lot. Did you
remember this article when you were writing it, right? Yes, I remember. And I wrote this article basically because this is one of the most
common issues with developers. I guess that every developer has gone through this kind
of error at least once in their life. So, I wrote that in order so we could understand
better why we had those errors and how to solve them. Yes, and the second one is creating charts. These two articles have grown up, right? I
think community guys have really loved your articles. And this one got featured. That's
very interesting. I think some pages got featured, so that's pretty cool
So, Tiago, you work on Azure, you work on Docker, you work on DevOps. And if I talk
about today, we are also talking about this Docker, right? We have been doing all this
stuff. I mean, Docker is not everyone's piece of cake. It does take your time, it
needs skills. Yes, the solution, I mean, what needs to be completed is pretty good, right
You go ahead and start using every single bit of resource that you have, right? But
the way you achieve is very challenging. So, when did you decide that you should be
moving to Docker? Docker is a very important tool where you can isolate our infrastructure and our
operational system problems from all the code. So, we developers are very used to
problems that when we develop our machines, we can't fix those problems. So, that's
why Docker exists. Docker removes all these kinds of issues. So, it's great that it's
an isolated environment where we are able to develop and do our projects. And it's
going to work the same in any kind of environment. It's very powerful. Me as a
developer, I'm always looking forward for ways to improve my work and Docker is a
very good, powerful tool in order to have a better day available
All right. Looks like very many new people are joining us now. So, I'll welcome everyone
who has joined us today. We are doing this C++19 show with Tiago and he's going to talk
about some really interesting stuff that he has developed by using Docker. So, let's go
ahead and get started, Tiago. I'm going to pull up your screen. And David, who has
a demo of the HTTP Docker. And next, please, clarify for the audience
Okay. Thank you, Simon. So, I'm Tiago and today we are going to be talking about Azure
DevOps Continuous Integration and Continuous Delivery using Docker. And as Simon already
said, I'm a SAS Core MGP for the second year in a row. And I also am doing project
management. It's 10 years of experience in software development lifecycle. And right
now I'm working as a software engineer at Bold by Devos News, which is one of the largest
companies here in Portugal. So, today's agenda, we'll start talking about Docker, its concepts
and how to create a Docker image in C++. And that's the most important component from Docker
That's the Dockerfile. Then we'll move to continuous integration concepts, continuous delivery concepts, alongside with also a practical exercise. So, in the continuous
integration, we are going to create a building with our Docker image. We are going to build
our Docker image. And with the continuous delivery, we are going to publish, deploy
the Docker image to our website. Actually, two websites, two different websites. The
same Docker image. And to finish, I'm going to be speaking about environment variables
That's also a very important topic when we are talking about DevOps
So, first, let's talk about Docker. I'm going to start talking about the main problem that
Docker solves. I guess that every developer has gone through this kind of situation, at
least in their life. When we develop a code, the code works fine on our machines, but then
it has a completely different behavior on the target machine. Maybe because of the operational
system settings, maybe because of the infrastructure, we don't know. Many problems. So, that's
how Docker gets confused. So, Docker, what's Docker? Docker works like a small visual
machine space, like a small visual machine space. And it's very powerful when I talk
about shipping, testing, learning, and deploying software applications. With Docker, you are
going to abstract your infrastructure and environment variables. So, any kind of the
operational system and any kind of software infrastructure is going to have the same behavior
for your project. So, it doesn't matter. It doesn't matter if you're running on a Windows
machine. It doesn't matter if you're running on a Linux machine. You are going to have
exactly the same results. Docker containers are very good to affect deployment, mobility
and repeatability, because as far as your Docker image, you can deploy it to any kind
of environment or any place very fast. So, you have the image you deploy that in seconds
very few seconds. So, those Docker images are placed inside a Docker container, and
those Docker containers have one or more Docker images. And those Docker images have one or
a group of common softwares. And to talk about Docker, we have to talk about the Docker file
The Docker file, the most important is to access from the Docker. With the Docker file
you Dockerize your project. So, the Docker file is basically a text document which contains
all the commands a user could call in the command line to assemble an image. So, basically
you are going to put this Docker file on your project. This Docker file has a lot of commands
to run, and in the end, the output is going to be a Docker image from your project. So
using Docker, users can create an automated build that executes several command lines
sufficiently successful. So, in short, each block of code is called a stage to collect
the desired output in order to create our image. Okay, and the Docker image, our output
our Docker image is basically formed by a lot of layers. So, every time that we run
a command on our Docker file, it basically creates a layer. So, for example, in the end
our image is going to be a compound of different layers. So, we are going to have a lot of
layers, basic layers, and then we'll put layer by layer, and in the end, we'll have our image
So, this is the Docker file that we are going to use, but before going into our Docker file
I'm going to show you about the project that we are working here, and also the website
that we are going to deploy. So, the project here is a very simple project, and it's an MVC project
It's an MVC project, and it's a very simple project. Basically, it's a calculator, a web calculator
and it's an MVC, a razor engine. So, basically here, what only matters for us are those values
which we are going back to later. Here we have the company, I am running local. The company here is
Charlie, and the environment is local. We are going back to this when we are going to talk about
the environment variables. Here we have our website. We are going to deploy this Docker image to the website
Web F is zero. It's down because it's reporting Docker images. Web 1 is also down, reporting Web images
I'm going to publish those images to my Docker hub here, and you can see it's empty. And this is our project
I always created the project in the Azure Data Ops repository, and it's exactly how it works on my machine
So, how can I Dockerize this project? It's very simple. The only thing that I have to do here is to upload
my Docker file. So, I'm going to upload my Docker file here
Okay. Now my project is ready to be Dockerized, and let's talk about this Docker file that I just deployed here
So, the Docker file, as I told you before, is the most important part of the Docker
If the Docker file, the output of the Docker file is the Docker image. So, this is a multi-stage Docker file
which means I'm going to have different base images in order to do some testing for a better result
So, okay, before going block by block, as I said before, the Docker image is based on many layers
So, anytime that we are going to pop edge or run a command, we are going to create a layer in our Docker image
So, here are the first block of code. We are creating a stage based on the .NET 2.1 and .NET Core runtime
And we are exposing the port 80 and create our working directory inside this image, which is ready
The second block of code is going to be responsible to build our project, and it's based on the .NET 2.1 SDK
It's basically we are going to start a new stage here. So, now, what are we doing here
Here we are focusing on our .NET Core projects and forget the unit tests for now
But what we are doing here, we are basically using the previous stage, the build stage
in order to restore all the Nougat packages. We are also copying everything from our project source
from our project, our source, our repository, I could say that, our repository
So, we are copying everything from our repository to inside the Docker image
And inside the Docker image, we are going to run the .NET Restore command in order to restore all the Nougat packages
Then, we are going to run the .NET Build command with the release configuration and the output folder, the app folder
Then, here, we are going through the unit test project. I didn't show you the unit test project
so I'm going to show you the unit test project before going through this block of code
So, this is our project, as I told you before. We have this unit test. It's a very simple unit test
We have two unit tests only, which will validate the calculations. It's very simple, very simple
It was created using XUnit, very simple, very simple. So, here, what we are going to do here? Here, first, we are going to create a label for this label
So, as I told you before, each layer, each command creates a layer
So, we are going to create a label that is going to be used later
This label test input is going to be used later. So, we are doing basically the same stuff that we were doing before with the .NET project, the main project
So, we are installing the unit test packages, and we are also copying everything inside our .NET label
Then, we are running the .NET test command. So, this command is going to run your unit tests and put the output in those directories
So, not only the unit tests, but also the code that we report
So, here, it's all about the unit test project. We are going to create a label. We are going to copy everything inside the container
And for that container, we run the .NET restore, and then we run the .NET test
Later, we are going to create a new stage. This stage is a new stage, but it's based on the publish stage
So, the publish stage was used before. No, on the build stage. The build stage was created here
So, we are creating a new stage here, the publish stage. The publish stage is going to have exactly the same layers that the build stage had
So, it's going to have all the layers, and it's also going to create more layers
So, basically, we got the build stage that had, I don't know, three or two layers
And then we create a new stage, and this stage has everything, and it's going to add more layers on it
And the build stage is not going to be used. So, here, we are running the .NET publish command, which releases configurations to the ASP output folder
Here, what it's going to do is basically create the... it's going to patch our project and put everything in a folder
And in the next command, what it does is basically create a new stage called a design
This stage is also based on the build stage, which was created before here, which was the basic stage
So, it also has everything from the basic stage. And here, what we are doing is basically we are going to pop everything from our publish stage
So, everything that we created here, everything that was on our output folder here, we are going to create and put in this container
And also, we are also setting our entry point. So, this entry point is going to be called every time you publish your image
So, this is the entry point for your image. Okay, and continuous integration
We talked about Docker, but Docker itself is not going to help very much
So, we have to use Docker with continuous integration. What continuous integration does
Continuous integration is very, very, very, very simple. It does basically build, patch, and patch your project
So, every time that a developer pushes code to a public repository, this continuous integration process is going to get his code
is going to merge his code into the repository, and then it's going to build, patch, and patch this code
The continuous integration process has to be a very smooth process. So, it's kind of an invisible process
So, no developer must know that it's running on the background. He's going to just push his code, and then in the background, the continuous integration process is going to pack his code, and the output, of course, build and patch it
The result for a continuous integration process is always a learning code, a working code
So, before continuous integration, if you didn't have continuous integration, how easy would that be
We would not have any kind of automated process to merge our code
So, when we had any kind of conflict, a developer would have to stop his work, so he would fix all the conflicts
We would also not have any specifications, and the patching would be manual
The developer would have to go to his machine and run some commands in order to have the patch to be started in the environment
So, before jumping to the next slide, let's go to our platform called Exercise and create our continuous integration process here
So, from here, we already have our project here with the Dockerfile, so we're going to create a new pipeline
Here, we select the repository, and I'm going to build a Docker image. Okay
It already has my YAML file ready. I'm going to paste it here
So, those are all the steps that are going to be executed in order to build our project and to put our image to our Docker Hub
So, I'm going to save it over here. So, while it's running on the background, I'm going to go back to our presentation, so I will explain about the YAML file that was used before
So, this is exactly the same YAML file that I used there
It's exactly the same YAML file. Do I use YAML files in our continuous integration process
It's a very good file as I said. For who uses it, you could see that it's kind of following the same kind of structure
So, here, it's a very good kind of file to be used
So, with this file, we can create a template from this. And from this template, we can deploy this template, this file, to other environments
Or we also put this same template to deploy another project, for example
So, here, I'm going to break down each block of code. The first block of code is responsible to create a variable
As you can see, we are creating a target variable. And this target variable is receiving the build.id
And this target variable is going to be used to add the tag of the image
Okay, we are typing build.id and defining the image that the cloud will run
As you can see, I'm using the Ubuntu native image to run all those tags below
The first block of code is responsible to build our Docker image
So, remember the Docker file that we saw before? This process is responsible to build that image
So, what this process is going to do is it's going to go through each step on that Docker file and it's going to run that
We can see here a container has been set to Docker device
And I'm going to talk about this later. This is connected to a thread connecting Azure DevOps
And the thread connecting is responsible for connecting the Azure DevOps with my Docker Hub container
But I'm going to show you later about this. So, basically what it's going to do here, it's going to build the image, it's target my repository, revise other groups
I'm going to show you here. So, this is the repository
And it's there. And here we have the services connections. Here we have the services connections
As you could see there, it's a Docker registry service connections. Basically, what it's doing here is connecting our DevOps with my Docker Hub
So, let's go back to the slides. Okay, the second block of code, it's a script
Remember in the Docker file where we created a label for one of the layers
So, what's going on here? We are accessing that layer in order to export the test results that were generated on that layer
So, we are accessing that layer. We create a new container based on this layer
And for that container, I'm just exporting the test results folder to a test results folder in my build directory
So, it's going to be accessible for the build to reach those results
And there I'm deleting the test container. Okay, in this block of code here, we are handling the test results and the code coverage report
So, in the previous step, we got the results from our Docker element and exported that to our build source directory
So, now what we are doing here, we are exporting, we are publishing those results
So, the first test is publishing the test results. And the second test is publishing the code coverage report
Just that. Okay, here we have the last block of code. And what's going on here
Actually, we do not need all those three tests. We have three tests there, but actually we only need one
That is the last one. Those two first tests, one, I'm logging out from my container hub
And the second, I'm logging in. So, why those tests? Those tests here are because Azure Networks is facing some connection issues with the Docker Hub
So, if you try to build your image and then publish this image to your Docker Hub, it will create a problem
So, this is a workaround. So, in a normal scenario, we would not need those two tests to log out and log in again from my Docker Hub container registry
And in the end, I am publishing the Docker images to my Docker Hub container
Okay, so let's go back to our build. At this time, it's probably finished
So, as you can see here, it's building successfully. We can see here the summary for the build
And we can see also the test results. As you could see before, we have two tests, only two tests
And we can see that both tests were successful. And we can also here see the code coverage report
And as you can see here, the code coverage is not very good
I would need to build more unit tests in order to improve this code coverage report
So, here in the summary, you see both here. And we can see also every test that was executed in order to build and create our image
Okay. As you could see before, we are going to build our Docker image with the build number, build ID
And as it shows here, the build ID is the age. What success we created needs to be decided
So, go back to our Docker Hub. If we refresh here, we are going to be able to see our Docker image here
Okay. So, as I told you, our image tag age is here
It was put at 7 minutes ago. Successful. So, let's go back to our presentation on our continuous integration process
What's happening here is build, test, and package our project. We already have our Docker image in our Docker Hub
So, what we are going to do here? Now, we jump to the next step, which is the continuous delivery process
Okay. What's the continuous delivery process? The continuous delivery process automatically deploys and tests codes in multiple stages to help drive quality
So, basically, the continuous delivery process is basically going to get your R Spark that was generated before
with your continuous integration process, which is your R Spark. Your R Spark is your output for your continuous integration
So, it's going to get this R Spark and it's going to deploy your website
So, with continuous delivery, we guarantee that we have the latest code
that your code is tested, and everything should work fine. So, it's very, very basic as well
It's all about getting what was generated from the continuous integration process and publishing this
So, what about when the response continues delivering? That's a very, very challenging situation
I have always wanted to do some jobs like this, response continues delivering, and it's a manual process
So, instead of learning an automated code to get your R Spark and publishing it
we usually have a lot of steps to follow in order to guarantee that we are going to deploy this code
And we all already know what manual process means. It usually means errors
So, let's avoid doing manual process, please. Because when we are doing manual process, we have a lot of things of doing something wrong
But maybe, by mistake, maybe not. So, a manual process could lead you to ask for help to execute one step of the process
So, we imagine the developer is not in a good day, so he would record this code to a production environment, for example
And he's not in a good day, so he accidentally forgot to execute one step
and his deployment failed. So, your client is going to see that your deployment didn't go well as planned
and then we are going to start searching for what went wrong
And it's very difficult to understand that what went wrong, was that you forgot to execute a step
So, we are going to waste a lot of time in order to validate this deployment
So, this could lead to a lot of errors. So, for example, forgetting one step
So, misunderstanding one step. So, if you see the process, the manual process
you will understand that one step is to do something, but actually you should have done differently
So, you're going to execute it wrongly, and it's going to be bad because it's going to have a bad result
So, let's create our continuous delivery process now. Okay, so we already have our continuous integration working fine
We already have our Docker image here. What we have to do now is to get this Docker image and publish it to our both websites
As you can see here, our both websites are offline. I'm going to publish those images there
Okay, so for this, create a new pipeline. Okay, I'll publish an empty template
I'll select the artifact, and the artifact here is going to be the builder
So, every time the builder runs this process, it will launch to run the continuous delivery process
So, I'm going to enable the trigger here. So, every time the build is successful
I'm going to run the continuous delivery process, so I'm going to deploy those images in our websites
Here, let's add a patch here. Okay, let's build the agent here for Alien S1
As our websites are hosted by Azure, I have to select a specific patch in order to deploy to Azure AppStats
So, I'm going to be using the AppStats deploy patch. This one
So, let's set this. Okay, here is also another SaaS connection, just like before where we had a SaaS connection
to connect our Azure DevOps to our Docker Hub container. And here we have another SaaS connection
that is connecting Azure DevOps with my Azure subscription. So, I'm going to show you this
So, here if you go to SaaS connection, you're going to see the SaaS connection here
It's a very basic one as well, just to access my resources inside my Azure subscription
So, my web app is a packed container for Linux, and I'm going to deploy for the web app view first
Okay, here we paste the registry or namespace. And our registry here is this one
Our image here is DevOps. Please, let's not mistake the image with the tag
The tag is like a unique identifier for this image, so a Docker image could have a lot of tags
So, we tag it with a version of that software. So, here our image is DevOps
And the tag, remember, that we used before to set the tag
is the build ID. So, here again, in order to install the latest version
the latest available image, we are going to use the build ID as well
So, I'm going to place here the build ID. Okay, let's create some status
And, okay, I'm going to... No, I'm not going to save. I need to reset everything up for the web app view
but you also have the web app one. So, what I'm going to do here
I'm going to clone this patch from over here. I'm just going to change the target website
So, instead of spelling on web app view, I'm going to spell on web app one
So, okay, everything is all right. So, every time that our continuous integration process runs with success
our continuous delivery process is going to be triggered in order to install those artifacts
generated from our continuous integration. So, here we can also define some cases in order to validate
but I'm not going to use this. So, I'm going to install on the first website
and then I'm going to install on the second website. Okay, I'll click the release here
And while it runs on the background, we are going back to explain about environment variables
So, let's wait to... Let's wait to run. So, environment variables
Remember, before in our project, I'm going to show you here again
we had those variables, the company name and the environment. I'm using here the company name, Chicago, I'm using local
and the environment is local. And here in my project, it's a normal setting
In my next settings, I have the setting here, it's running in the company environment local
So, environment variables are a very powerful tool to be used with DevOps
in order to evaluate environment if it's available. And we are not going to expose those variables to other environments
Imagine that we have two clients, client IE, client B, and those clients, they have their own specific environment variables
connecting to new secrets, and the client B cannot see those same secrets
cannot see his connection to show. We could handle that with environment variables
So, with environment variables, even your developers are going to see those secrets or connections
because they are going to be applied exactly for each environment. You could apply environment variables to some levels, for example
As I told you before, I'm applying the environment variables on my access level, on my Visual Studio project
So, every time that I run this project local, I'm going to see those environment variables
But I could also use those environment variables in my Docker level
or also my host level. And the priority here is always as close to the host
as more important your environment variable is. So, what does that mean
It means that, for example, if I have one environment variable in my local
and then I run a command on my Docker to override this environment variable
this environment variable is going to be overrided. But if I have another environment variable with the same name in my host
this environment variable is going to be overrided as well. So, as close to the host as more important this environment variable is
So, this is going to be displayed. And it's also very good to avoid mixing configurations between environments
As a developer, sometimes we have to debug problems in production, for example, problems in another environment
So, what we usually do is to get the production, and we apply this connection to another environment
and then we start debugging the code. We fix the code, we fix the problem
but sometimes it puts you out of progress to update this connection streaming
So, you are going to deploy your code, and if it gets to development, you are going to test it
and then you are going to realize that you are testing against the production environment
with the production database. It's going to cause a lot of mess
So, if you do not have those mistakes, you could have your connection stream set by an environment variable
that's going to place those variables correctly. In order to never, never mistake those variables
Okay, now we can go back to the project. It probably has already finished the release process
Okay, the website one is successful. The stuff on the website is still working
So, if I click here, you are going to see already the new website
I'm going to make it here. Okay, it's already available. So, as I told you before, we have exactly the same image here
but with different results. Here, I have my company STR, it's running local
Here, in the Red Hat Zero company, we have the company Zero in the environment cloud
Here, we also have the Red Hat One, which is the company one
and the environment cloud. And it's very simple to construct this kind of environment variable
If we go to our app services, we can see here in the configuration
a variable. Okay, here we talk to the variable. As you can see, the company environment
it's exactly the same name as here in my project, company environment, company name
And it's going to override my value with this value here. So, we can see here, all those values being applied
I didn't need to do any kind of additional step, any kind of additional test
It was automatically overriding. So, we have our Red Hat One deployed
and our Red Hat Zero deployed from our Docker image. So, I hope you enjoyed it
That's all for today. So, in this exercise, we could deploy the Docker image from scratch
We could deploy, we could push our Docker image to our Docker Hub
and from our Docker Hub, we could web this image and deploy it to our environment
So, that's all for today. I hope you enjoyed it. And if you have any questions, you may find me on those social medias
That's it. What was an amazing session, Tiago. I think you covered the entire ecosystem, right
You just created a whole new project in front of us, right? Starting from very scratch
Everything you did was inside the Cloud Quality 45 minutes. It was fantastic
We have a few couple of questions coming in from, let me know if this makes sense, right
One question is, I'm using Azure DevOps to build and publish my Docker image
How can I pass arguments while doing build and push within Docker task
Okay, that's a very good question. You can test elements running, maybe those build syntax
they are not available to test elements. So, probably what you have to do is you're going to have to
push your image in there so you can test elements. Okay, I hope this answers the question
Definitely, a lot of new people are joining us right now. People really loved it
And this couple of more questions, there's been a long question for you
but just to make sure you answer as many as possible. This question is, how can a Docker image in Azure DevOps
even be Docker-tasked into? That's a very great question. I'm not sure
I think we'll talk about this and I will see you later
Yeah, I mean, definitely, whatever you thought, Vint, about my head, because it's not a topic everyone goes in and talks every other day
Because this is a very niche topic and very, very handful set of people work on this
So, definitely, I think, hopefully we can go to this. The final question that we have for today
the final question that we have come in is, how to have conditional image tags in Azure DevOps build YAML pipeline
Conditional image tags. Okay, in our YAML pipeline, we can configure scripts
As I showed you before, we have a block of scripts that I'm using to export the test results and the code coverage
So, we turn on scripts in order to apply the conditional statements
and create our image tags. I guess that's the whole project. Okay, I know you really expect that. Right
So, apart from this talk and Azure things, I see, actually, we have been posting a lot of articles that come about
is it 200 for exam? What is it? And I don't know, what is it in an exam anyway
Okay, this question was in my backlog of things to study for a long time ago
but I couldn't find time to study that. Thanks, thanks, very, very difficult here
Thanks to this quarantine, thanks to this pandemic, I could find time as far as I'm working remote from my home
So, I could find time to keep studying, and so I decided to invest a lot of time to study
And for me, the best part, the best way to study is to create an article
So, I have to go deep in any kind of concept and create practical exercises
And for me, it's the best way that it works to study. Because studying is very boring, you know
Sometimes, when I'm studying alone, I usually end up sleeping. So, creating articles is a very good way to study
Definitely, definitely. A lot of people love me already, love me a second today
That's very, very good content and very nicely done. I was just looking at it
I can tell you, it was definitely very nicely done. Thank you for sharing that. Thank you so much
We have one question coming in from Anthony. He says, how can I integrate my release pipeline in Yaml file format
similar to what we did for Build? I guess the release pipelines are not available on Yaml format yet
They are only available on that kind of research test. So, we hope that Azure DevOps also gives you this opportunity to use the release pipelines
in Yaml in the next coming days. Okay, Kemal. As I see, people are often asking about the question about this data
What are some of the resources that you share to go in and learn this
And what are some of the articles? It would be good to go ahead and find any case problems anybody is working with this
also with Azure DevOps. What are some of the best resources you would like to share
Okay, I have some articles talking about those. I don't have articles going through all those sources
But I have an article explaining how to create a docker image
I have also some articles explaining how to create continuous integration and also the delivery pipeline using all the projects. Perfect
So, if anyone who is going to be going and learning more about what Siav has been talking today
this is Siav, C-Sharp's online URL profiler. You can go ahead and read a lot of stuff
People have been loving his content, both on C-Sharp and also this live show
And thank you, everyone. Thank you so much to everyone who has joined us today. We're going to wrap up this show now
But before I do, I would like to go ahead and ask one final question to Siav
Siav, how have you been working on this? All this technical stuff, library stuff, 10 years of experience with the IT
What do you do apart from this? What are your hobbies and what do you do in your spare time
Okay, people usually do not believe that one of my hobbies is to study
and go deeper in those technologies. But besides that, I love exercising
I love riding my bike. I also have a dog, and I love going out and enjoy the outside environment
Just being here and working, I also enjoy the outside world. I enjoy traveling as well, and I'm a normal person
All right. Definitely not on our program. Definitely a community. People really look up to you on the community forum
And thank you so much, Siav, for coming to this show. Thank you so much for all the time that you're doing and the amazing content, definitely
I, Sivin Saivan, on behalf of the entire 3-Step Funnel Community, managed within the Google, would like to thank you for your valuable time
and contribution to the community. We would love to have you back next year
I mean, it's Christmas and you're coming up the next day. Whenever you get time, we'd love to have you back
And hopefully meet you in person. Do that, but be very interesting
Yeah, I look forward. So thank you very much, Simon, for this opportunity
I'm looking forward to my next opportunity. And also thank you for your job for the developers community
I'm sure that you are doing a very, very good job. So thank you, Simon
All right. So thank you everyone who has joined us today. We'll see you in the next episode of 3-Step Funnel NPQ
And Merry Christmas and Happy New Year, everyone. Merry Christmas and Happy New Year. Bye-bye