<?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=6.8.1</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 [&#8230;]</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 e-con e-parent" data-id="35b07d2" data-element_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-widget_type="heading.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}</style><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-widget_type="text-editor.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style>				<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-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-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-widget_type="image.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.21.0 - 08-05-2024 */
.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=".svg"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}</style>										<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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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 [&#8230;]</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 e-con e-parent" data-id="8cdd5fe" data-element_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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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>
