<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps - Software Developer's Tour</title>
	<atom:link href="https://pawelmajewski.com/category/tutorials/devops/feed/" rel="self" type="application/rss+xml" />
	<link>https://pawelmajewski.com</link>
	<description>Website about programming, news in IT and more</description>
	<lastBuildDate>Wed, 11 Jun 2025 09:02:25 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://pawelmajewski.com/wp-content/uploads/2024/02/logo_normal.png</url>
	<title>DevOps - Software Developer's Tour</title>
	<link>https://pawelmajewski.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Azure DevOps Pipeline in practice</title>
		<link>https://pawelmajewski.com/azure-devops-pipeline-in-practice/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=azure-devops-pipeline-in-practice</link>
					<comments>https://pawelmajewski.com/azure-devops-pipeline-in-practice/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Sat, 15 Mar 2025 21:47:41 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Azure DevOps]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CD]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Pipeline]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8468</guid>

					<description><![CDATA[<p>What is Pipeline? Pipeline is a solution that automatically build, test and deploy an application. We can split Pipeline to (CI) and (CD) Pipelines. CI &#8211; Continous Integration CD &#8211; Continous Delivery/Deployment CI &#8211; helps maintain code quality by catching errors early in the development process. CD &#8211; streamlines the process of delivering code changes to production environments efficiently and reliably. Use it in practice! Today, I&#8217;ll show you how to use Azure DevOps Pipeline to deploy your application. To follow this tutorial, go to Azure DevOps and create a new project. I created a new organization named &#8220;pawelmajewskiblog&#8221; and a project named &#8220;Pipeline example&#8220;. Now, let&#8217;s create a sample WebAPI application that we want to deploy using Azure Pipelines. [WebApiProject &#8211; Minimal API] Program.cs var builder = WebApplication.CreateBuilder(args); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); app.UseHttpsRedirection(); var startDate = DateTime.Now; var pipelineVariable = Environment.GetEnvironmentVariable(&#34;pipeline_variable&#34;); app.MapGet(&#34;/&#34;, () =&#62; { return new { startDate, pipelineVariable }; }) .WithName(&#34;GetVersion&#34;) .WithOpenApi(); app.Run(); This application contains one endpoint named GetVersion, which returns the start date of the application (startData) and the pipeline variable (pipelineVariable) that we will set in the pipeline.   Localhost response is presented below. Push code to the repository You can add .gitignore file https://raw.githubusercontent.com/github/gitignore/main/VisualStudio.gitignore.   When our repository is ready, we can go to the next step. Create first pipeline Go to the And click &#8220;Create Pipeline&#8221;. Select your repository, I&#8217;ll choose &#8220;Azure Repos Git&#8221; Use the script for pipeline presented below trigger: - master pool: vmImage: &#039;ubuntu-latest&#039; variables: buildConfiguration: &#039;Release&#039; steps: - task: UseDotNet@2 displayName: &#039;Install .NET Core SDK&#039; inputs: version: 8.x - task: DotNetCoreCLI@2 inputs: command: &#039;restore&#039; projects: &#039;**/*.csproj&#039; displayName: &#039;dotnet restore $(buildConfiguration)&#039; - task: DotNetCoreCLI@2 inputs: command: &#039;build&#039; projects: &#039;**/*.csproj&#039; arguments: &#039;--configuration $(buildConfiguration)&#039; displayName: &#039;dotnet build $(buildConfiguration)&#039; When you save this pipeline configuration file, then pipeline runs automatically for the first time. When the pipeline finishes its work, you will be notified by email. We&#8217;ll also receive an email when the build fails.</p>
<p>The post <a href="https://pawelmajewski.com/azure-devops-pipeline-in-practice/">Azure DevOps Pipeline in practice</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8468" class="elementor elementor-8468">
				<div class="elementor-element elementor-element-35b07d2 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="35b07d2" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b625e43 elementor-widget elementor-widget-heading" data-id="b625e43" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">What is Pipeline?</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-bf3d0e1 elementor-widget elementor-widget-text-editor" data-id="bf3d0e1" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Pipeline is a solution that automatically build, test and deploy an application. We can split Pipeline to (CI) and (CD) Pipelines.</p><p><strong>CI</strong> &#8211; Continous Integration</p><p><strong>CD</strong> &#8211; Continous Delivery/Deployment</p><p><strong>CI</strong> &#8211; helps maintain code quality by catching errors early in the development process.</p><p><strong>CD</strong> &#8211; streamlines the process of delivering code changes to production environments efficiently and reliably.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-538af2b elementor-widget elementor-widget-heading" data-id="538af2b" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Use it in practice!</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-9d5c8c2 elementor-widget elementor-widget-text-editor" data-id="9d5c8c2" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Today, I&#8217;ll show you how to use Azure DevOps Pipeline to deploy your application.</p><p>To follow this tutorial, go to <a title="Azure DevOps" href="https://azure.microsoft.com/en-us/products/devops" target="_blank" rel="noopener">Azure DevOps</a> and create a new project.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-195dd57 elementor-widget elementor-widget-image" data-id="195dd57" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="522" src="https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline-1024x522.png" class="attachment-large size-large wp-image-8471" alt="azure_pipeline dashboard" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline-1024x522.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline-300x153.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline-768x392.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline-1536x784.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline-2048x1045.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-0886297 elementor-widget elementor-widget-text-editor" data-id="0886297" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>I created a new organization named &#8220;<strong>pawelmajewskiblog</strong>&#8221; and a project named &#8220;<strong>Pipeline example</strong>&#8220;.</p><p>Now, let&#8217;s create a sample <strong>WebAPI application</strong> that we want to deploy using <strong>Azure Pipelines</strong>.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-0d6da0e elementor-widget elementor-widget-heading" data-id="0d6da0e" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">[WebApiProject - Minimal API] Program.cs</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-a2c62e0 elementor-widget elementor-widget-code-block-for-elementor" data-id="a2c62e0" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();

var startDate = DateTime.Now;
var pipelineVariable = Environment.GetEnvironmentVariable(&quot;pipeline_variable&quot;);

app.MapGet(&quot;/&quot;, () =&gt;
{
    return new { startDate, pipelineVariable };
})
.WithName(&quot;GetVersion&quot;)
.WithOpenApi();

app.Run();
</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-b92e940 elementor-widget elementor-widget-text-editor" data-id="b92e940" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>This application contains one endpoint named <strong>GetVersion</strong>, which returns the start date of the application (<strong>startData</strong>) and the pipeline variable (<strong>pipelineVariable</strong>) that we will set in the pipeline.</p><p> </p><p>Localhost response is presented below.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-8924ea1 elementor-widget elementor-widget-image" data-id="8924ea1" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="562" src="https://pawelmajewski.com/wp-content/uploads/2024/02/localhost_response-1024x562.png" class="attachment-large size-large wp-image-8472" alt="" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/localhost_response-1024x562.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/localhost_response-300x165.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/localhost_response-768x421.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/localhost_response-1536x843.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/localhost_response-2048x1123.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-dfa3b35 elementor-widget elementor-widget-heading" data-id="dfa3b35" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Push code to the repository</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-be16993 elementor-widget elementor-widget-text-editor" data-id="be16993" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>You can add .gitignore file <a href="https://raw.githubusercontent.com/github/gitignore/main/VisualStudio.gitignore" target="_blank" rel="noopener">https://raw.githubusercontent.com/github/gitignore/main/VisualStudio.gitignore</a>.</p><p> </p>								</div>
				</div>
				<div class="elementor-element elementor-element-2e6dcd6 elementor-widget elementor-widget-image" data-id="2e6dcd6" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="418" src="https://pawelmajewski.com/wp-content/uploads/2024/02/pushed_repository-1024x418.png" class="attachment-large size-large wp-image-8483" alt="" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/pushed_repository-1024x418.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/pushed_repository-300x123.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/pushed_repository-768x314.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/pushed_repository-1536x628.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/pushed_repository-2048x837.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-baa2491 elementor-widget elementor-widget-text-editor" data-id="baa2491" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>When our repository is ready, we can go to the next step.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-714a438 elementor-widget elementor-widget-heading" data-id="714a438" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Create first pipeline</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-ecdd745 elementor-widget elementor-widget-text-editor" data-id="ecdd745" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Go to the</p>								</div>
				</div>
				<div class="elementor-element elementor-element-df75814 elementor-widget elementor-widget-image" data-id="df75814" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="560" src="https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline_create-1024x560.png" class="attachment-large size-large wp-image-8482" alt="azure_pipeline_create" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline_create-1024x560.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline_create-300x164.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline_create-768x420.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline_create-1536x840.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/azure_pipeline_create.png 1876w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-c7b20e2 elementor-widget elementor-widget-text-editor" data-id="c7b20e2" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>And click &#8220;Create Pipeline&#8221;.</p><p>Select your repository, I&#8217;ll choose &#8220;Azure Repos Git&#8221;</p>								</div>
				</div>
				<div class="elementor-element elementor-element-e830ddd elementor-widget elementor-widget-text-editor" data-id="e830ddd" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Use the script for pipeline presented below</p>								</div>
				</div>
				<div class="elementor-element elementor-element-565a4ed elementor-widget elementor-widget-code-block-for-elementor" data-id="565a4ed" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-yaml'>trigger:
- master

pool:
  vmImage: &#039;ubuntu-latest&#039;

variables:
  buildConfiguration: &#039;Release&#039;

steps:
- task: UseDotNet@2
  displayName: &#039;Install .NET Core SDK&#039;
  inputs:
    version: 8.x
    
- task: DotNetCoreCLI@2
  inputs:
    command: &#039;restore&#039;
    projects: &#039;**/*.csproj&#039;
  displayName: &#039;dotnet restore $(buildConfiguration)&#039;

- task: DotNetCoreCLI@2
  inputs:
    command: &#039;build&#039;
    projects: &#039;**/*.csproj&#039;
    arguments: &#039;--configuration $(buildConfiguration)&#039;
  displayName: &#039;dotnet build $(buildConfiguration)&#039;</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-77c8f54 elementor-widget elementor-widget-text-editor" data-id="77c8f54" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>When you save this pipeline configuration file, then pipeline runs automatically for the first time.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-8ae5638 elementor-widget elementor-widget-image" data-id="8ae5638" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="525" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-1024x525.png" class="attachment-large size-large wp-image-8505" alt="pipeline queued" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-1024x525.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-300x154.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-768x394.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-1536x788.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-2048x1050.png 2048w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_00-1170x600.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-f7900c3 elementor-widget elementor-widget-image" data-id="f7900c3" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="525" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-1024x525.png" class="attachment-large size-large wp-image-8506" alt="pipeline in progress" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-1024x525.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-300x154.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-768x394.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-1536x788.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-2048x1050.png 2048w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_28-1170x600.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-9c253ab elementor-widget elementor-widget-image" data-id="9c253ab" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="525" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-1024x525.png" class="attachment-large size-large wp-image-8507" alt="pipeline success last step" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-1024x525.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-300x154.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-768x394.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-1536x788.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-2048x1050.png 2048w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_37-1170x600.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-3b6ff5b elementor-widget elementor-widget-image" data-id="3b6ff5b" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="525" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-1024x525.png" class="attachment-large size-large wp-image-8508" alt="pipeline branch success" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-1024x525.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-300x154.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-768x394.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-1536x788.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-2048x1050.png 2048w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h22_49-1170x600.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-bc97113 elementor-widget elementor-widget-image" data-id="bc97113" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="525" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-1024x525.png" class="attachment-large size-large wp-image-8509" alt="pipeline list success" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-1024x525.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-300x154.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-768x394.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-1536x788.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-2048x1050.png 2048w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h26_37-1170x600.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-47d106a elementor-widget elementor-widget-text-editor" data-id="47d106a" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>When the pipeline finishes its work, you will be notified by email.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-abf1119 elementor-widget elementor-widget-image" data-id="abf1119" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="501" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h27_52-1024x501.png" class="attachment-large size-large wp-image-8510" alt="build success" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h27_52-1024x501.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h27_52-300x147.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h27_52-768x376.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h27_52-1536x752.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h27_52-2048x1002.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-5a560e2 elementor-widget elementor-widget-text-editor" data-id="5a560e2" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>We&#8217;ll also receive an email when the build fails.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-e064117 elementor-widget elementor-widget-image" data-id="e064117" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="528" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h28_59-1024x528.png" class="attachment-large size-large wp-image-8511" alt="build failed" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h28_59-1024x528.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h28_59-300x155.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h28_59-768x396.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h28_59-1536x791.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h28_59-2048x1055.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-c10c057 elementor-widget elementor-widget-image" data-id="c10c057" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="548" src="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h29_11-1-1024x548.png" class="attachment-large size-large wp-image-8519" alt="build canceled" srcset="https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h29_11-1-1024x548.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h29_11-1-300x160.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h29_11-1-768x411.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h29_11-1-1536x822.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/04/2024-04-04_22h29_11-1-2048x1095.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/azure-devops-pipeline-in-practice/">Azure DevOps Pipeline in practice</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/azure-devops-pipeline-in-practice/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Introduction to Jenkins and Pipelines</title>
		<link>https://pawelmajewski.com/introduction-to-jenkins-and-pipelines/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduction-to-jenkins-and-pipelines</link>
					<comments>https://pawelmajewski.com/introduction-to-jenkins-and-pipelines/#respond</comments>
		
		<dc:creator><![CDATA[Paweł Majewski]]></dc:creator>
		<pubDate>Wed, 05 Feb 2025 16:40:30 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CD]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Pipeline]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://pawelmajewski.com/?p=8490</guid>

					<description><![CDATA[<p>What is Pipeline? Pipeline is a solution that automatically build, test and deploy an application. We can split Pipeline to (CI) and (CD) Pipelines. CI &#8211; Continous Integration CD &#8211; Continous Delivery/Deployment CI &#8211; helps maintain code quality by catching errors early in the development process. CD &#8211; streamlines the process of delivering code changes to production environments efficiently and reliably. Use it in practice! Today, I&#8217;ll show you how to use Jenkins to create CI for your application. To follow this tutorial, go to https://www.jenkins.io/doc/book/installing/ and install Jenkins. Create console application in Visual Studio ﻿Console.WriteLine($&#34;It works&#34;); Push it to your remote repository. You can see an example  on https://github.com/MajewskiPawel/app-ci-cd Use Jenkins! If your repository is private, you&#8217;ll need to add credentials to authorize Jenkins with your Git provider. Navigate to Dashboard -&#62; Manage Jenkins -&#62; Credentials -&#62; System -&#62; Global credentials (unrestricted). When you click &#8220;Add credentials&#8221; button choose &#8220;SSH Username with private key&#8221; in &#8220;Kind&#8221; field. &#8220;Username&#8221; &#8211; username or email &#8220;Private Key&#8221; -&#62; click &#8220;Enter directly&#8220; To add Private Key you need public and private key.  After this, you will find both jenkins and jenkins.pub files in your user directory. Open jenkins.pub file, copy entire value and paste it in your profile configuration on your git provider (example for GitHub is presented below). Open jenkins file (without pub extension), copy entire value and paste it in Private Key field in Jenkins credentials configurator. After saving the form, you should see a list of credentials. Save the ID of the created element because we will need it later. Create new pipeline On the main dashboard click &#8220;New Item&#8221; and add new Pipeline Below is the script I have created to build previously created application. pipeline { agent any stages { stage (&#039;Git&#039;) { steps { git branch: &#039;main&#039;, credentialsId: &#039;test-application&#039;, url: &#039;https://github.com/MajewskiPawel/app-ci-cd&#039; } } stage(&#039;Restore packages&#039;) { steps { powershell &#34;dotnet restore &#039;${workspace}\App\App.sln&#039;&#34; } } stage(&#039;Build project&#039;) { steps { powershell &#34;dotnet build --configuration Release &#039;${workspace}\App\App.csproj&#039;&#34; } } } } Run it! Click &#8220;Build Now&#8221; button on the left navigation bar and see the magic. We can configure Jenkins to synchronize with Git events and our builds can be executed when pull request have been created or when we push something to master branch. Why are we doing this? Before I explain, please modify your application code to the presented below. var z = Console.WriteLine($&#34;It works&#34;); and push it to your repository. Click &#8220;Build Now&#8221; button again. If we had it connected to Git events, we would know immediately when our code has failed, right after someone pushed it to the main branch. Everything we just did is called CI. Not so scary, right :)?</p>
<p>The post <a href="https://pawelmajewski.com/introduction-to-jenkins-and-pipelines/">Introduction to Jenkins and Pipelines</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="8490" class="elementor elementor-8490">
				<div class="elementor-element elementor-element-8cdd5fe e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="8cdd5fe" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-9abd84a elementor-widget elementor-widget-heading" data-id="9abd84a" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">What is Pipeline?</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-2463429 elementor-widget elementor-widget-text-editor" data-id="2463429" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Pipeline is a solution that automatically build, test and deploy an application. We can split Pipeline to (CI) and (CD) Pipelines.</p><p><strong>CI</strong> &#8211; Continous Integration</p><p><strong>CD</strong> &#8211; Continous Delivery/Deployment</p><p><strong>CI</strong> &#8211; helps maintain code quality by catching errors early in the development process.</p><p><strong>CD</strong> &#8211; streamlines the process of delivering code changes to production environments efficiently and reliably.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-c1cf971 elementor-widget elementor-widget-heading" data-id="c1cf971" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Use it in practice!</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-f2f182c elementor-widget elementor-widget-text-editor" data-id="f2f182c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Today, I&#8217;ll show you how to use Jenkins to create CI for your application.</p><p>To follow this tutorial, go to https://www.jenkins.io/doc/book/installing/ and install Jenkins.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-2e2e88a elementor-widget elementor-widget-heading" data-id="2e2e88a" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Create console application in Visual Studio</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-58db5f9 elementor-widget elementor-widget-code-block-for-elementor" data-id="58db5f9" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>﻿Console.WriteLine($&quot;It works&quot;);</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-8c62396 elementor-widget elementor-widget-text-editor" data-id="8c62396" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Push it to your remote repository. You can see an example  on <a title="https://github.com/MajewskiPawel/app-ci-cd" href="https://github.com/MajewskiPawel/app-ci-cd" target="_blank" rel="noopener">https://github.com/MajewskiPawel/app-ci-cd</a></p>								</div>
				</div>
				<div class="elementor-element elementor-element-719b744 elementor-widget elementor-widget-heading" data-id="719b744" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Use Jenkins!</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-61705f8 elementor-widget elementor-widget-text-editor" data-id="61705f8" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>If your repository is private, you&#8217;ll need to add credentials to authorize Jenkins with your Git provider. Navigate to Dashboard -&gt; Manage Jenkins -&gt; Credentials -&gt; System -&gt; Global credentials (unrestricted).</p>								</div>
				</div>
				<div class="elementor-element elementor-element-a820de8 elementor-widget elementor-widget-text-editor" data-id="a820de8" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>When you click &#8220;Add credentials&#8221; button choose &#8220;<strong>SSH Username with private key</strong>&#8221; in &#8220;Kind&#8221; field.</p><p>&#8220;<strong>Username</strong>&#8221; &#8211; username or email</p><p>&#8220;<strong>Private Key</strong>&#8221; -&gt; click &#8220;<strong>Enter directly</strong>&#8220;</p><p>To add Private Key you need public and private key. </p>								</div>
				</div>
				<div class="elementor-element elementor-element-f9c087f elementor-widget elementor-widget-image" data-id="f9c087f" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="979" height="512" src="https://pawelmajewski.com/wp-content/uploads/2024/02/Generate-SSH.png" class="attachment-large size-large wp-image-8492" alt="Generate SSH" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/Generate-SSH.png 979w, https://pawelmajewski.com/wp-content/uploads/2024/02/Generate-SSH-300x157.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/Generate-SSH-768x402.png 768w" sizes="auto, (max-width: 979px) 100vw, 979px" />															</div>
				</div>
				<div class="elementor-element elementor-element-f391db9 elementor-widget elementor-widget-text-editor" data-id="f391db9" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>After this, you will find both <strong>jenkins</strong> and <strong>jenkins.pub</strong> files in your user directory.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-298aa47 elementor-widget elementor-widget-text-editor" data-id="298aa47" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Open <b>jenkins.pub</b> file, copy entire value and paste it in your profile configuration on your git provider (example for GitHub is presented below).</p>								</div>
				</div>
				<div class="elementor-element elementor-element-71cca03 elementor-widget elementor-widget-image" data-id="71cca03" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="521" src="https://pawelmajewski.com/wp-content/uploads/2024/02/Add-ssh-github-1024x521.png" class="attachment-large size-large wp-image-8494" alt="" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/Add-ssh-github-1024x521.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/Add-ssh-github-300x153.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/Add-ssh-github-768x391.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/Add-ssh-github-1536x781.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/Add-ssh-github-2048x1042.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-4a5824e elementor-widget elementor-widget-text-editor" data-id="4a5824e" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Open <b>jenkins </b>file (without pub extension), copy entire value and paste it in <strong>Private Key</strong> field in Jenkins credentials configurator.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-f012bac elementor-widget elementor-widget-image" data-id="f012bac" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="254" src="https://pawelmajewski.com/wp-content/uploads/2024/02/Jenkins-credentials-added-1024x254.png" class="attachment-large size-large wp-image-8493" alt="Jenkins credentials added" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/Jenkins-credentials-added-1024x254.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/Jenkins-credentials-added-300x74.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/Jenkins-credentials-added-768x191.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/Jenkins-credentials-added-1536x381.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/Jenkins-credentials-added-2048x508.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-74d677d elementor-widget elementor-widget-text-editor" data-id="74d677d" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>After saving the form, you should see a list of credentials. Save the ID of the created element because we will need it later.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-b0cd23a elementor-widget elementor-widget-heading" data-id="b0cd23a" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Create new pipeline</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-d594b5f elementor-widget elementor-widget-text-editor" data-id="d594b5f" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>On the main dashboard click &#8220;<strong>New Item</strong>&#8221; and add new Pipeline</p>								</div>
				</div>
				<div class="elementor-element elementor-element-7ba7c7e elementor-widget elementor-widget-image" data-id="7ba7c7e" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="519" src="https://pawelmajewski.com/wp-content/uploads/2024/02/Create-new-pipeline-1024x519.png" class="attachment-large size-large wp-image-8495" alt="Create new pipeline" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/Create-new-pipeline-1024x519.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/Create-new-pipeline-300x152.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/Create-new-pipeline-768x389.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/Create-new-pipeline-1536x778.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/Create-new-pipeline-2048x1038.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-8c8e54f elementor-widget elementor-widget-text-editor" data-id="8c8e54f" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Below is the script I have created to build previously created application.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-6210f80 elementor-widget elementor-widget-code-block-for-elementor" data-id="6210f80" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>pipeline {
    agent any
    
    stages {
        stage (&#039;Git&#039;) {
            steps {
                git branch: &#039;main&#039;, credentialsId: &#039;test-application&#039;, url: &#039;https://github.com/MajewskiPawel/app-ci-cd&#039;
            }
        }
        stage(&#039;Restore packages&#039;) {
            steps {
                powershell &quot;dotnet restore &#039;${workspace}\\App\\App.sln&#039;&quot;
            }
        }
        stage(&#039;Build project&#039;) {
            steps {
                powershell &quot;dotnet build --configuration Release &#039;${workspace}\\App\\App.csproj&#039;&quot;
            }
        }
    }
}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-056097b elementor-widget elementor-widget-heading" data-id="056097b" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Run it!</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-c068bf6 elementor-widget elementor-widget-text-editor" data-id="c068bf6" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Click &#8220;<strong>Build Now</strong>&#8221; button on the left navigation bar and see the magic.</p><p>We can configure Jenkins to synchronize with Git events and our builds can be executed when pull request have been created or when we push something to master branch.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-05d3a7d elementor-widget elementor-widget-image" data-id="05d3a7d" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="482" src="https://pawelmajewski.com/wp-content/uploads/2024/02/Build-success-1024x482.png" class="attachment-large size-large wp-image-8496" alt="Build success" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/Build-success-1024x482.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-success-300x141.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-success-768x362.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-success-1536x723.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-success-2048x964.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-2dceb00 elementor-widget elementor-widget-heading" data-id="2dceb00" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Why are we doing this?</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-2c98b64 elementor-widget elementor-widget-text-editor" data-id="2c98b64" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Before I explain, please modify your application code to the presented below.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-2adb18b elementor-widget elementor-widget-code-block-for-elementor" data-id="2adb18b" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-csharp'>var z = 
Console.WriteLine($&quot;It works&quot;);</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-dcb6bac elementor-widget elementor-widget-text-editor" data-id="dcb6bac" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>and push it to your repository.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-99624b9 elementor-widget elementor-widget-text-editor" data-id="99624b9" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Click &#8220;<strong>Build Now</strong>&#8221; button again.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-4a47bd1 elementor-widget elementor-widget-image" data-id="4a47bd1" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" loading="lazy" width="1024" height="524" src="https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-1024x524.png" class="attachment-large size-large wp-image-8497" alt="Build failed" srcset="https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-1024x524.png 1024w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-300x154.png 300w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-768x393.png 768w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-1536x786.png 1536w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-2048x1048.png 2048w, https://pawelmajewski.com/wp-content/uploads/2024/02/Build-failed-1170x600.png 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-c811211 elementor-widget elementor-widget-text-editor" data-id="c811211" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>If we had it connected to Git events, we would know immediately when our code has failed, right after someone pushed it to the main branch.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-58d9337 elementor-widget elementor-widget-text-editor" data-id="58d9337" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Everything we just did is called CI. Not so scary, right :)?</p>								</div>
				</div>
					</div>
				</div>
				</div><p>The post <a href="https://pawelmajewski.com/introduction-to-jenkins-and-pipelines/">Introduction to Jenkins and Pipelines</a> first appeared on <a href="https://pawelmajewski.com">Software Developer's Tour</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://pawelmajewski.com/introduction-to-jenkins-and-pipelines/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
