{"id":34568,"date":"2026-08-07T05:00:00","date_gmt":"2026-08-07T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=34568"},"modified":"2026-08-04T13:27:37","modified_gmt":"2026-08-04T11:27:37","slug":"pipeline-to-za-malo-jak-zbudowac-quality-gates-w-azure-devops-dla-dynamics-365-fo-i-spac-spokojnie","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/pipeline-to-za-malo-jak-zbudowac-quality-gates-w-azure-devops-dla-dynamics-365-fo-i-spac-spokojnie\/","title":{"rendered":"Pipeline to za ma\u0142o. Jak zbudowa\u0107 Quality Gates w Azure DevOps dla Dynamics 365 F&amp;O i spa\u0107 spokojnie"},"content":{"rendered":"\n<p>W <a href=\"https:\/\/sii.pl\/blog\/automatyzacja-pipeline-kluczem-do-sukcesu-projektow-w-devops-dla-d365-fo-czesc-iv-kolejne-mozliwosci\/\" target=\"_blank\" rel=\"noopener\" title=\"\">poprzednich artyku\u0142ach<\/a> pokaza\u0142em, jak zautomatyzowa\u0107 proces budowania i wdra\u017cania aplikacji w Azure DevOps dla Dynamics 365 Finance &amp; Operations. Powsta\u0142 kompletny pipeline, kt\u00f3ry wykonuje kompilacj\u0119, analiz\u0119 kodu oraz przygotowuje pakiety wdro\u017ceniowe.<\/p>\n\n\n\n<p>Czy to oznacza, \u017ce ka\u017cde wdro\u017cenie jest ju\u017c bezpieczne?<\/p>\n\n\n\n<p>Niestety nie.<\/p>\n\n\n\n<p>W praktyce wiele projekt\u00f3w nadal boryka si\u0119 z problemami, kt\u00f3re pojawiaj\u0105 si\u0119 dopiero po wdro\u017ceniu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kod kompiluje si\u0119 poprawnie, ale zawiera regresj\u0119,<\/li>\n\n\n\n<li>programista przypadkowo zmieni\u0142 logik\u0119 biznesow\u0105,<\/li>\n\n\n\n<li>nowe funkcjonalno\u015bci pogorszy\u0142y wydajno\u015b\u0107,<\/li>\n\n\n\n<li>wdro\u017cenie przesz\u0142o pomy\u015blnie, mimo \u017ce cz\u0119\u015b\u0107 test\u00f3w zako\u0144czy\u0142a si\u0119 niepowodzeniem.<\/li>\n<\/ul>\n\n\n\n<p>W\u0142a\u015bnie dlatego nowoczesny DevOps nie ko\u0144czy si\u0119 na CI\/CD. Kolejnym etapem jest wprowadzenie <strong>Quality Gates<\/strong>, czyli zestawu automatycznych kryteri\u00f3w jako\u015bci, kt\u00f3re musz\u0105 zosta\u0107 spe\u0142nione, zanim zmiany trafi\u0105 do kolejnego \u015brodowiska.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czym w\u0142a\u015bciwie s\u0105 Quality Gates?<\/strong><\/h2>\n\n\n\n<p>Najpro\u015bciej mo\u017cna powiedzie\u0107, \u017ce Quality Gates to automatyczne \u201ebramki bezpiecze\u0144stwa\u201d.<\/p>\n\n\n\n<p>Pipeline nie pyta cz\u0142owieka: Czy na pewno chcesz wdro\u017cy\u0107?<\/p>\n\n\n\n<p>On sam sprawdza, czy wdro\u017cenie jest wystarczaj\u0105co dobre.<\/p>\n\n\n\n<p>Je\u017celi kt\u00f3rykolwiek z warunk\u00f3w nie zostanie spe\u0142niony \u2013 proces zostaje zatrzymany.<\/p>\n\n\n\n<p>Przyk\u0142adowe bramki:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kod skompilowa\u0142 si\u0119 bez b\u0142\u0119d\u00f3w,<\/li>\n\n\n\n<li>liczba ostrze\u017ce\u0144 Best Practice nie przekracza ustalonego limitu,<\/li>\n\n\n\n<li>AppChecker nie wykry\u0142 b\u0142\u0119d\u00f3w krytycznych,<\/li>\n\n\n\n<li>wszystkie testy jednostkowe zako\u0144czy\u0142y si\u0119 sukcesem,<\/li>\n\n\n\n<li>Code Coverage wynosi co najmniej 80%,<\/li>\n\n\n\n<li>raport CAR nie zawiera nowych problem\u00f3w,<\/li>\n\n\n\n<li>wdro\u017cenie zosta\u0142o zatwierdzone przez odpowiedni\u0105 osob\u0119.<\/li>\n<\/ul>\n\n\n\n<p>Programista nie musi pami\u0119ta\u0107 o ka\u017cdym z tych element\u00f3w.<\/p>\n\n\n\n<p>Pilnuje tego Azure DevOps.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dlaczego jest to tak wa\u017cne w D365 F&amp;O?<\/strong><\/h2>\n\n\n\n<p>Dynamics 365 Finance &amp; Operations to system ERP obs\u0142uguj\u0105cy najwa\u017cniejsze procesy biznesowe przedsi\u0119biorstwa.<\/p>\n\n\n\n<p>B\u0142\u0105d w kodzie mo\u017ce oznacza\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>b\u0142\u0119dne ksi\u0119gowanie dokument\u00f3w,<\/li>\n\n\n\n<li>niepoprawne naliczanie podatk\u00f3w,<\/li>\n\n\n\n<li>zatrzymanie procesu sprzeda\u017cy,<\/li>\n\n\n\n<li>problemy magazynowe,<\/li>\n\n\n\n<li>b\u0142\u0119dne wyliczenia produkcji.<\/li>\n<\/ul>\n\n\n\n<p>Dlatego organizacje wdra\u017caj\u0105ce D365 coraz cz\u0119\u015bciej odchodz\u0105 od r\u0119cznej kontroli jako\u015bci na rzecz pe\u0142nej automatyzacji.<\/p>\n\n\n\n<p>Microsoft r\u00f3wnie\u017c rekomenduje budowanie procesu ALM opartego na automatycznych kontrolach jako\u015bci oraz na odpowiedzialno\u015bci zespo\u0142u za ca\u0142y cykl \u017cycia aplikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jak mo\u017ce wygl\u0105da\u0107 przyk\u0142adowa \u015bcie\u017cka weryfikacji?<\/strong><\/h2>\n\n\n\n<p>Wyobra\u017amy sobie prosty scenariusz. Programista wysy\u0142a Pull Request. Automatycznie uruchamia si\u0119 pipeline.<\/p>\n\n\n\n<p>Kolejne etapy wygl\u0105daj\u0105 nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pobranie kodu z repozytorium.<\/li>\n\n\n\n<li>Kompilacja.<\/li>\n\n\n\n<li>Analiza Best Practice.<\/li>\n\n\n\n<li>AppChecker.<\/li>\n\n\n\n<li>Testy jednostkowe.<\/li>\n\n\n\n<li>Generowanie raport\u00f3w.<\/li>\n\n\n\n<li>Publikacja wynik\u00f3w.<\/li>\n\n\n\n<li>Weryfikacja Quality Gate.<\/li>\n<\/ul>\n\n\n\n<p>Dopiero wtedy zaistnieje mo\u017cliwo\u015b\u0107 wdro\u017cenia.<\/p>\n\n\n\n<p>Je\u017celi kt\u00f3rykolwiek etap zako\u0144czy si\u0119 b\u0142\u0119dem \u2013 pipeline ko\u0144czy prac\u0119. Nikt nie wdro\u017cy kodu przypadkowo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Automatyczne testy \u2013 najwi\u0119kszy sprzymierzeniec DevOps<\/strong><\/h2>\n\n\n\n<p>Wiele zespo\u0142\u00f3w inwestuje ogromne \u015brodki w budow\u0119 pipeline&#8217;\u00f3w, a jednocze\u015bnie praktycznie nie ma test\u00f3w. To troch\u0119 tak, jakby kupi\u0107 nowoczesny samoch\u00f3d wyposa\u017cony w system autonomicznej jazdy, ale zdemontowa\u0107 hamulce.<\/p>\n\n\n\n<p>Pipeline odpowiada za automatyzacj\u0119. Testy odpowiadaj\u0105 za jako\u015b\u0107. Dopiero po\u0142\u0105czenie obu element\u00f3w daje realne korzy\u015bci.<\/p>\n\n\n\n<p>W przypadku D365 F&amp;O mo\u017cemy wykorzystywa\u0107 mi\u0119dzy innymi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SysTest,<\/li>\n\n\n\n<li>testy integracyjne,<\/li>\n\n\n\n<li>testy regresyjne,<\/li>\n\n\n\n<li>RSAT,<\/li>\n\n\n\n<li>testy wydajno\u015bciowe.<\/li>\n<\/ul>\n\n\n\n<p>Im wi\u0119ksza automatyzacja test\u00f3w, tym mniejsze ryzyko kosztownych b\u0142\u0119d\u00f3w produkcyjnych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Approval Gates \u2013 kiedy cz\u0142owiek nadal jest potrzebny<\/strong><\/h2>\n\n\n\n<p>Nie wszystko warto automatyzowa\u0107.<\/p>\n\n\n\n<p>Przed wdro\u017ceniem na produkcj\u0119 cz\u0119sto wymagane jest zatwierdzenie przez:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kierownika projektu,<\/li>\n\n\n\n<li>w\u0142a\u015bciciela biznesowego,<\/li>\n\n\n\n<li>architekta,<\/li>\n\n\n\n<li>administratora systemu.<\/li>\n<\/ul>\n\n\n\n<p>Azure DevOps umo\u017cliwia skonfigurowanie tzw. Approval Gates. Pipeline zatrzymuje si\u0119 przed produkcj\u0105 i oczekuje na akceptacj\u0119. Dzi\u0119ki temu zachowujemy pe\u0142n\u0105 kontrol\u0119 nad procesem, jednocze\u015bnie eliminuj\u0105c r\u0119czne wykonywanie wszystkich wcze\u015bniejszych krok\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dane zamiast przeczucia<\/strong><\/h2>\n\n\n\n<p>Jedn\u0105 z najwi\u0119kszych zalet DevOps jest mo\u017cliwo\u015b\u0107 mierzenia procesu.<\/p>\n\n\n\n<p>Zamiast m\u00f3wi\u0107: \u201eWydaje mi si\u0119, \u017ce projekt dzia\u0142a dobrze\u201d, mo\u017cemy analizowa\u0107 konkretne wska\u017aniki.<\/p>\n\n\n\n<p>Najcz\u0119\u015bciej monitorowane s\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>czas budowania,<\/li>\n\n\n\n<li>liczba nieudanych wdro\u017ce\u0144,<\/li>\n\n\n\n<li>liczba rollback\u00f3w,<\/li>\n\n\n\n<li>czas usuni\u0119cia awarii,<\/li>\n\n\n\n<li>cz\u0119stotliwo\u015b\u0107 wdro\u017ce\u0144,<\/li>\n\n\n\n<li>skuteczno\u015b\u0107 test\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>Takie dane pozwalaj\u0105 szybko zauwa\u017cy\u0107 pogarszaj\u0105c\u0105 si\u0119 jako\u015b\u0107 projektu i reagowa\u0107, zanim problem odczuje u\u017cytkownik ko\u0144cowy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Najcz\u0119stsze b\u0142\u0119dy<\/strong><\/h2>\n\n\n\n<p>Podczas wdra\u017cania DevOps spotykam kilka powtarzaj\u0105cych si\u0119 problem\u00f3w.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pierwszy to brak test\u00f3w.<\/li>\n\n\n\n<li>Drugi to ignorowanie ostrze\u017ce\u0144 Best Practice.<\/li>\n\n\n\n<li>Trzeci to r\u0119czne omijanie pipeline&#8217;\u00f3w \u201ebo przecie\u017c trzeba szybko wdro\u017cy\u0107\u201d.<\/li>\n<\/ol>\n\n\n\n<p>Ka\u017cde takie odst\u0119pstwo sprawia, \u017ce automatyzacja przestaje by\u0107 wiarygodna.<\/p>\n\n\n\n<p>Pipeline powinien by\u0107 jedyn\u0105 drog\u0105 prowadz\u0105c\u0105 do wdro\u017cenia.<\/p>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/06\/Blog-CRM-Desktop.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/06\/Blog-CRM-Mob.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/06\/Blog-CRM-Desktop.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">Microsoft Dynamics 365 CRM<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                Tw\u00f3rz spersonalizowane do\u015bwiadczenia dla swoich klient\u00f3w dzi\u0119ki zaawansowanym funkcjom Dynamics 365 Customer Engagement\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/oferta\/enterprise-platforms\/microsoft\/dynamics-365-crm\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Oferta M365<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Automatyzacja budowania aplikacji to dopiero pocz\u0105tek drogi. Prawdziwy DevOps zaczyna si\u0119 wtedy, gdy pipeline sam potrafi odpowiedzie\u0107 na pytanie:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>Czy ten kod naprawd\u0119 nadaje si\u0119 do wdro\u017cenia?<\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Quality Gates sprawiaj\u0105, \u017ce decyzje przestaj\u0105 by\u0107 oparte na intuicji, a zaczynaj\u0105 wynika\u0107 z mierzalnych kryteri\u00f3w jako\u015bci. Dzi\u0119ki temu zesp\u00f3\u0142 zyskuje wi\u0119ksz\u0105 przewidywalno\u015b\u0107, mniej awarii oraz szybsze wdro\u017cenia, a klient otrzymuje stabilniejszy system.<\/p>\n\n\n\n<p>W kolejnym artykule poka\u017c\u0119, jak zbudowa\u0107 kompletny Dashboard DevOps dla Dynamics 365 F&amp;O, kt\u00f3ry w jednym miejscu prezentuje stan pipeline&#8217;\u00f3w, wyniki test\u00f3w, jako\u015b\u0107 kodu oraz najwa\u017cniejsze wska\u017aniki projektu.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;34568&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Pipeline to za ma\u0142o. Jak zbudowa\u0107 Quality Gates w Azure DevOps dla Dynamics 365 F\\u0026amp;O i spa\u0107 spokojnie&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W poprzednich artyku\u0142ach pokaza\u0142em, jak zautomatyzowa\u0107 proces budowania i wdra\u017cania aplikacji w Azure DevOps dla Dynamics 365 Finance &amp; Operations. &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/pipeline-to-za-malo-jak-zbudowac-quality-gates-w-azure-devops-dla-dynamics-365-fo-i-spac-spokojnie\/\">Continued<\/a><\/p>\n","protected":false},"author":156,"featured_media":34570,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[2656,1512,576,646],"class_list":["post-34568","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-pipeline-devops","tag-poradnik","tag-dynamics-365","tag-dynamics-365-finance-and-operations"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/08\/Programming-2.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/156"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=34568"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34568\/revisions"}],"predecessor-version":[{"id":34573,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/34568\/revisions\/34573"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/34570"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=34568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=34568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=34568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}