{"id":497,"date":"2026-09-25T18:30:00","date_gmt":"2026-09-25T16:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=497"},"modified":"2026-09-25T15:07:52","modified_gmt":"2026-09-25T13:07:52","slug":"bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/","title":{"rendered":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">Utrzymywanie mikrous\u0142ug na statycznych maszynach wirtualnych lub stale dzia\u0142aj\u0105cych klastrach Kubernetes generuje ci\u0105g\u0142e koszty infrastrukturalne, nawet w okresach zerowego nat\u0119\u017cenia ruchu. Wdro\u017cenie bezstanowych (stateless) interfejs\u00f3w API w kontenerach na platformie Google Cloud Run umo\u017cliwia stworzenie w pe\u0142ni zarz\u0105dzanej, bezserwerowej architektury, kt\u00f3ra automatycznie skaluje si\u0119 od zera instancji w godzinach nocnych do tysi\u0119cy r\u00f3wnolegle pracuj\u0105cych kontener\u00f3w podczas nag\u0142ych skok\u00f3w ruchu. Po\u0142\u0105czenie tego modelu wdro\u017ceniowego z systemem GitHub Actions oraz mechanizmem Workload Identity Federation tworzy bezobs\u0142ugowy, wysoce bezpieczny potok CI\/CD bez konieczno\u015bci przechowywania d\u0142ugoterminowych kluczy JSON kont serwisowych w zewn\u0119trznych repozytoriach.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">1. Architektura rozwi\u0105zania: Skalowanie do zera i CI\/CD bez kluczy<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Profesjonalna architektura bezserwerowa w Google Cloud opiera si\u0119 na wsp\u00f3\u0142pracy trzech niezale\u017cnych element\u00f3w:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>\u015arodowisko wykonawcze Google Cloud Run:<\/strong> Bezstanowe kontenery s\u0105 uruchamiane na \u017c\u0105danie na podstawie przychodz\u0105cych zapyta\u0144 HTTP. Ustawienia wsp\u00f3\u0142bie\u017cno\u015bci (Concurrency) pozwalaj\u0105 pojedynczej instancji kontenera na obs\u0142ug\u0119 do 80 r\u00f3wnoleg\u0142ych \u017c\u0105da\u0144 (warto\u015b\u0107 domy\u015blna, z mo\u017cliwo\u015bci\u0105 zwi\u0119kszenia do 1000) przed wyzwoleniem skalowania poziomego.<\/li>\r\n<li><strong>Workload Identity Federation (WIF):<\/strong> Zast\u0119puje statyczne, eksportowalne klucze JSON kont serwisowych wymian\u0105 token\u00f3w OpenID Connect (OIDC) pomi\u0119dzy GitHubem a us\u0142ug\u0105 IAM Google Cloud, eliminuj\u0105c ryzyko wycieku po\u015bwiadcze\u0144.<\/li>\r\n<li><strong>Potok GitHub Actions:<\/strong> Zautomatyzowany przep\u0142yw pracy buduje obraz Docker aplikacji, przesy\u0142a go do Google Artifact Registry i wdra\u017ca now\u0105 rewizj\u0119 us\u0142ugi w Cloud Run z zerowym czasem niedost\u0119pno\u015bci (Zero Downtime).<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/hand-cloudrun-pl.png\" width=\"1120\" height=\"640\" alt=\"Dwie ponumerowane fazy: budowanie zaufania przez Workload Identity Federation, potem budowa i wdro\u017cenie na Cloud Run, z przekre\u015blonym przechowywanym kluczem JSON\">\n<figcaption>Pipeline w \u017cadnym momencie nie trzyma trwa\u0142ego sekretu: GitHub dowodzi, kim jest, Google oddaje token wa\u017cny minuty, i dopiero potem cokolwiek si\u0119 buduje albo wdra\u017ca.<\/figcaption>\n<\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">2. Konfiguracja Workload Identity Federation krok po kroku<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">W celu w\u0142\u0105czenia uwierzytelniania bezkluczowego dla GitHub Actions nale\u017cy utworzy\u0107 pul\u0119 i dostawc\u0119 to\u017csamo\u015bci za pomoc\u0105 interfejsu wiersza polece\u0144 Google Cloud CLI:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code class=\"language-bash\"># 1. Utworzenie puli Workload Identity Pool\ngcloud iam workload-identity-pools create \"github-actions-pool\" \\\n  --project=\"enterprise-ai-project\" \\\n  --location=\"global\" \\\n  --display-name=\"GitHub Actions Pool\"\n\n# 2. Utworzenie dostawcy to\u017csamo\u015bci OIDC dla GitHuba\ngcloud iam workload-identity-pools providers create-oidc \"github-provider\" \\\n  --project=\"enterprise-ai-project\" \\\n  --location=\"global\" \\\n  --workload-identity-pool=\"github-actions-pool\" \\\n  --display-name=\"GitHub Provider\" \\\n  --attribute-mapping=\"google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository\" \\\n  --attribute-condition=\"assertion.repository_owner == 'enterprise-org'\" \\\n  --issuer-uri=\"https:\/\/token.actions.githubusercontent.com\"\n\n# 3. Powi\u0105zanie konta serwisowego z repozytorium GitHub\ngcloud iam service-accounts add-iam-policy-binding \"ci-cd-deployer@enterprise-ai-project.iam.gserviceaccount.com\" \\\n  --project=\"enterprise-ai-project\" \\\n  --role=\"roles\/iam.workloadIdentityUser\" \\\n  --member=\"principalSet:\/\/iam.googleapis.com\/projects\/1234567890\/locations\/global\/workloadIdentityPools\/github-actions-pool\/attribute.repository\/enterprise-org\/microservice-repo\"<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">3. Konfiguracja przep\u0142ywu pracy GitHub Actions krok po kroku<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Zautomatyzowany potok wdro\u017ceniowy wymaga zdefiniowania pliku YAML w \u015bcie\u017cce <code>.github\/workflows\/deploy.yml<\/code>. Przep\u0142yw ten uwierzytelnia si\u0119 przez OIDC, buduje obraz kontenera i wdra\u017ca go w Cloud Run z precyzyjnie okre\u015blonymi parametrami skalowania i wsp\u00f3\u0142bie\u017cno\u015bci:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code class=\"language-yaml\">name: Deploy to Google Cloud Run\n\non:\n  push:\n    branches:\n      - main\n\npermissions:\n  contents: 'read'\n  id-token: 'write'\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Code\n        uses: actions\/checkout@v4\n\n      - name: Authenticate to Google Cloud\n        uses: google-github-actions\/auth@v2\n        with:\n          workload_identity_provider: 'projects\/1234567890\/locations\/global\/workloadIdentityPools\/github-actions-pool\/providers\/github-provider'\n          service_account: 'ci-cd-deployer@enterprise-ai-project.iam.gserviceaccount.com'\n\n      - name: Set up Cloud SDK\n        uses: google-github-actions\/setup-gcloud@v2\n\n      - name: Configure Docker for Artifact Registry\n        run: gcloud auth configure-docker us-central1-docker.pkg.dev\n\n      - name: Build and Push Docker Image\n        run: |\n          docker build -t us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service:${{ github.sha }} .\n          docker push us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service:${{ github.sha }}\n\n      - name: Deploy to Cloud Run\n        run: |\n          gcloud run deploy api-service \\\n            --image us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service:${{ github.sha }} \\\n            --region us-central1 \\\n            --platform managed \\\n            --allow-unauthenticated \\\n            --min-instances 0 \\\n            --max-instances 50 \\\n            --concurrency 80 \\\n            --memory 512Mi \\\n            --cpu 1<\/code><\/pre>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">4. In\u017cynieria skalowania i wsp\u00f3\u0142bie\u017cno\u015bci krok po kroku<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">W celu zapewnienia optymalnego wykorzystania zasob\u00f3w i ograniczenia op\u00f3\u017anie\u0144 zimnego startu (Cold Start), parametry wykonawcze us\u0142ugi Cloud Run musz\u0105 zosta\u0107 precyzyjnie dostrojone:<\/p>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li><strong>Weryfikacja skalowania do zera (<code>--min-instances=0<\/code>):<\/strong> Pozwala Cloud Run zredukowa\u0107 us\u0142ug\u0119 do zera instancji przy braku ruchu; bezczynne instancje mog\u0105 by\u0107 utrzymywane do 15 minut, ale przy domy\u015blnym rozliczaniu opartym na \u017c\u0105daniach nie s\u0105 za nie naliczane op\u0142aty, co obni\u017ca koszty obliczeniowe w okresach spoczynku dok\u0142adnie do 0,00 PLN.<\/li>\r\n<li><strong>Dostrajanie wsp\u00f3\u0142bie\u017cno\u015bci (<code>--concurrency=80<\/code>):<\/strong> Pozwala jednemu wirtualnemu procesorowi kontenera na r\u00f3wnoleg\u0142\u0105 obs\u0142ug\u0119 do 80 \u017c\u0105da\u0144, co znacznie zmniejsza zapotrzebowanie na pami\u0119\u0107 i zapobiega ci\u0105g\u0142emu uruchamianiu nowych instancji.<\/li>\r\n<li><strong>Zarz\u0105dzanie d\u0142awieniem procesora:<\/strong> Domy\u015blnie procesor jest d\u0142awiony poza czasem obs\u0142ugi aktywnego \u017c\u0105dania HTTP. Je\u015bli wymagane jest wykonywanie zada\u0144 w tle po wys\u0142aniu odpowiedzi, nale\u017cy zastosowa\u0107 flag\u0119 `&#8211;no-cpu-throttling` w po\u0142\u0105czeniu z `&#8211;min-instances=1`.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">5. Podsumowanie i warto\u015b\u0107 architektoniczna<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Co da si\u0119 osi\u0105gn\u0105\u0107 dzi\u0119ki temu poradnikowi:<\/strong> Wdro\u017cenie w pe\u0142ni zautomatyzowanego, bezkluczowego potoku CI\/CD dla mikrous\u0142ug w kontenerach na platformie Google Cloud Run przy u\u017cyciu GitHub Actions oraz mechanizmu Workload Identity Federation.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Wynikaj\u0105ca z tego warto\u015b\u0107:<\/strong> Koszty utrzymania infrastruktury zostaj\u0105 zminimalizowane dzi\u0119ki spadkowi wydatk\u00f3w na serwery do zera w okresach braku ruchu, przy jednoczesnym zachowaniu zdolno\u015bci do natychmiastowego skalowania poziomego podczas skok\u00f3w obci\u0105\u017cenia. Wyeliminowanie statycznych kluczy JSON zapobiega ryzyku wycieku po\u015bwiadcze\u0144, a odpowiednio skonfigurowana wsp\u00f3\u0142bie\u017cno\u015b\u0107 maksymalizuje wydajno\u015b\u0107 kontener\u00f3w w ca\u0142kowicie bezobs\u0142ugowym \u015brodowisku backendowym.<\/p>\r\n\n\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n\n<h3>Czy us\u0142uga skalowana do zera instancji naprawd\u0119 nic nie kosztuje?<\/h3>\n<p>Czas dzia\u0142ania nic nie kosztuje, reszta \u0142a\u0144cucha ju\u017c tak. Ka\u017cdy przebieg potoku zapisuje w Artifact Registry nowy obraz oznaczony hashem commita, a ta przestrze\u0144 jest rozliczana wed\u0142ug obj\u0119to\u015bci, niezale\u017cnie od tego, czy us\u0142uga dzia\u0142a. Regu\u0142a czyszczenia w Artifact Registry, kt\u00f3ra usuwa stare obrazy, a zostawia kilka nowszych, \u017ceby powr\u00f3t do wcze\u015bniejszej rewizji pozosta\u0142 mo\u017cliwy, utrzymuje t\u0119 pozycj\u0119 na niskim poziomie.<\/p>\n\n<h3>Jakich r\u00f3l potrzebuje konto serwisowe ci-cd-deployer poza powi\u0105zaniem Workload Identity?<\/h3>\n<p>Powi\u0105zanie z <code>roles\/iam.workloadIdentityUser<\/code> pozwala GitHubowi jedynie wyst\u0119powa\u0107 jako to konto. To, co konto mo\u017ce potem robi\u0107, okre\u015blaj\u0105 kolejne role, a przep\u0142yw pracy potrzebuje trzech z nich:<\/p>\n<ol>\n<li>Prawa zapisu do repozytorium w Artifact Registry, zwykle <code>roles\/artifactregistry.writer<\/code>; bez niego <code>docker push<\/code> ko\u0144czy si\u0119 b\u0142\u0119dem.<\/li>\n<li>Roli Cloud Run do wdra\u017cania. <code>roles\/run.developer<\/code> wystarcza do <code>gcloud run deploy<\/code>, ale nie do <code>--allow-unauthenticated<\/code>: ta flaga zmienia polityk\u0119 IAM us\u0142ugi, a do tego potrzebna jest <code>roles\/run.admin<\/code>.<\/li>\n<li><code>roles\/iam.serviceAccountUser<\/code> na koncie serwisowym, pod kt\u00f3rym dzia\u0142a us\u0142uga; bez osobnego ustawienia jest to domy\u015blne konto serwisowe Compute Engine w projekcie. Bez tej roli konto wdra\u017caj\u0105ce nie utworzy rewizji dzia\u0142aj\u0105cej pod inn\u0105 to\u017csamo\u015bci\u0105.<\/li>\n<\/ol>\n<p>Rozs\u0105dnie jest nadawa\u0107 te role mo\u017cliwie w\u0105sko, na jedno repozytorium i jedn\u0105 us\u0142ug\u0119 zamiast na ca\u0142y projekt. Wyciek klucza jest wykluczony, b\u0142\u0119dny przep\u0142yw pracy ju\u017c nie, a role decyduj\u0105 o tym, jak daleko si\u0119gnie wyrz\u0105dzona przez niego szkoda.<\/p>\n\n<h3>Czy powi\u0105zanie z repozytorium wystarcza, czy wdra\u017ca\u0107 mo\u017ce ka\u017cda ga\u0142\u0105\u017a?<\/h3>\n<p>Powi\u0105zanie obejmuje ca\u0142e repozytorium. Przep\u0142yw pracy startuje wprawdzie tylko po pushu do main, ale ka\u017cdy inny plik przep\u0142ywu pracy w tym samym repozytorium, tak\u017ce na innej ga\u0142\u0119zi, mo\u017ce z <code>id-token: write<\/code> za\u017c\u0105da\u0107 tokenu, a Google go przyjmie, bo atrybut <code>repository<\/code> si\u0119 zgadza.<\/p>\n<p>Zaw\u0119\u017ca to dopiero ga\u0142\u0105\u017a, kt\u00f3r\u0105 token OIDC z GitHuba niesie w polu <code>ref<\/code>. Warunek przy dostawcy to\u017csamo\u015bci, na przyk\u0142ad <code>assertion.ref == 'refs\/heads\/main'<\/code> (do\u0142\u0105czony do <code>--attribute-condition<\/code> przez <code>&amp;&amp;<\/code>), albo dodatkowo zmapowany atrybut, do kt\u00f3rego zostaje przypi\u0119te konto serwisowe, przepuszcza ju\u017c tylko przebiegi z main. Ustawiony w sekcji 2 warunek na <code>assertion.repository_owner<\/code> zapewnia ponadto, \u017ce pula w og\u00f3le nie przyjmuje token\u00f3w z obcych organizacji.<\/p>\n\n<h3>Ile kosztuje po\u0142\u0105czenie &#8211;no-cpu-throttling z &#8211;min-instances=1?<\/h3>\n<p>Kosztuje zalet\u0119, od kt\u00f3rej zaczyna si\u0119 artyku\u0142. Minimalna instancja ze stale przydzielonym procesorem dzia\u0142a ca\u0142\u0105 dob\u0119 i jest rozliczana tak\u017ce wtedy, gdy nie przychodzi \u017cadne \u017c\u0105danie, wi\u0119c koszty obliczeniowe w okresach spoczynku przestaj\u0105 spada\u0107 do zera. Do pracy wykonywanej po odpowiedzi ta\u0144szym wyborem bywa dlatego osobna kolejka albo zadanie Cloud Run (Cloud Run job), dzi\u0119ki czemu sama us\u0142uga sieciowa nadal skaluje si\u0119 do zera.<\/p>\n<\/div>\n\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Cloud Run documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker documentation<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Techniczny przewodnik krok po kroku po wdra\u017caniu i skalowaniu bezserwerowych mikrous\u0142ug w Google Cloud Run z u\u017cyciem GitHub Actions i WIF.<\/p>\n","protected":false},"author":1,"featured_media":14057,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92640],"tags":[92061,92229,92232,92103,92238],"class_list":["post-497","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-cloud-ai-pl","tag-automation-pl","tag-devops-pl","tag-docker-pl","tag-google-cloud-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Techniczny przewodnik krok po kroku po wdra\u017caniu i skalowaniu bezserwerowych mikrous\u0142ug w Google Cloud Run z u\u017cyciem GitHub Actions i WIF.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-25T16:30:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions\",\"datePublished\":\"2026-09-25T16:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/\"},\"wordCount\":1110,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png\",\"keywords\":[\"Automation\",\"DevOps\",\"Docker\",\"Google Cloud\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/\",\"name\":\"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png\",\"datePublished\":\"2026-09-25T16:30:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png\",\"width\":1200,\"height\":630,\"caption\":\"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/","og_locale":"en_US","og_type":"article","og_title":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions - Lukas Wojcik - Blog","og_description":"Techniczny przewodnik krok po kroku po wdra\u017caniu i skalowaniu bezserwerowych mikrous\u0142ug w Google Cloud Run z u\u017cyciem GitHub Actions i WIF.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-25T16:30:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions","datePublished":"2026-09-25T16:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/"},"wordCount":1110,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png","keywords":["Automation","DevOps","Docker","Google Cloud","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/","name":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png","datePublished":"2026-09-25T16:30:00+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-497-bezserwerowe-mikrouslugi-skalowanie--g.png","width":1200,"height":630,"caption":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/bezserwerowe-mikrouslugi-skalowanie-w-google-cloud-run-z-github-actions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bezserwerowe mikrous\u0142ugi: Skalowanie w Google Cloud Run z GitHub Actions"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=497"}],"version-history":[{"count":7,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/497\/revisions"}],"predecessor-version":[{"id":20618,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/497\/revisions\/20618"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/14057"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}