{"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-10-26T12:44:32","modified_gmt":"2026-10-26T11:44:32","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":"<p>Google Cloud Run obs\u0142uguje kontenerowe us\u0142ugi WWW bez utrzymywania w\u0142asnego serwera lub klastra Kubernetes. Przy odpowiedniej konfiguracji us\u0142uga bez \u017c\u0105da\u0144 mo\u017ce zmniejszy\u0107 liczb\u0119 instancji do zera. Wzrost ruchu uruchamia kolejne instancje w granicach dost\u0119pnych limit\u00f3w i kwot. Instancja to dzia\u0142aj\u0105ca kopia aplikacji. Uruchomienie nowej kopii trwa; takie op\u00f3\u017anienie nazywa si\u0119 zimnym startem. Nadal potrzebne jest utrzymanie aplikacji i op\u0142acanie pozosta\u0142ych us\u0142ug.<\/p>\n<p>Obraz zawiera aplikacj\u0119 i pliki potrzebne do dzia\u0142ania. Rewizja to wdro\u017cona wersja z okre\u015blonym obrazem i ustawieniami. GitHub Actions mo\u017ce budowa\u0107 obrazy i wdra\u017ca\u0107 przez Workload Identity Federation (WIF). WIF zast\u0119puje stale zapisany klucz konta us\u0142ugi Google kr\u00f3tkotrwa\u0142ymi po\u015bwiadczeniami. Przej\u0119te przep\u0142ywy pracy, nadmierne uprawnienia i przypadkowo do\u0142\u0105czone po\u015bwiadczenia pozostaj\u0105 ryzykiem. Dlatego przyk\u0142ad wykonuje build przed uwierzytelnieniem w chmurze, a now\u0105 rewizj\u0119 pocz\u0105tkowo wdra\u017ca bez zwyk\u0142ego ruchu.<\/p>\n<h2>1. Wymagania i oddzielne to\u017csamo\u015bci<\/h2>\n<p>Projekt, rozliczenia, wymagane API, repozytorium Artifact Registry <code>services<\/code>, konto wdro\u017ceniowe i oddzielne konto wykonawcze musz\u0105 ju\u017c istnie\u0107. Przyk\u0142ad aktualizuje istniej\u0105c\u0105 us\u0142ug\u0119 <code>api-service<\/code> w <code>us-central1<\/code>. Us\u0142uga ma w\u0142\u0105czon\u0105 kontrol\u0119 wywo\u0142a\u0144 IAM i nie ma publicznych uprawnie\u0144 wywo\u0142ania. Pierwsza konfiguracja oraz zmiany dost\u0119pu publicznego wymagaj\u0105 odpowiednich uprawnie\u0144 administracyjnych poza potokiem.<\/p>\n<ul><li><strong>Konto wdro\u017ceniowe:<\/strong> <code>ci-cd-deployer<\/code> wymaga Artifact Registry Writer na repozytorium obraz\u00f3w, Cloud Run Developer na istniej\u0105cej us\u0142udze oraz Service Account User na koncie wykonawczym. Writer obejmuje r\u00f3wnie\u017c odczyt obraz\u00f3w potrzebny do wdro\u017cenia.<\/li><li><strong>Konto wykonawcze:<\/strong> <code>api-runtime<\/code> otrzymuje tylko uprawnienia aplikacji, na przyk\u0142ad dost\u0119p do konkretnego magazynu danych. Uprawnienia wdro\u017ceniowe nie nale\u017c\u0105 do tej roli.<\/li><li><strong>Aplikacja:<\/strong> Kontener musi nas\u0142uchiwa\u0107 na <code>0.0.0.0:$PORT<\/code> i przechowywa\u0107 sesje lub trwa\u0142e dane poza nietrwa\u0142ym kontenerem. Wymagane s\u0105 Dockerfile oraz wykonywalny, w\u0142a\u015bciwy dla projektu skrypt <code>ci\/test.sh<\/code>.<\/li><\/ul>\n<figure class=\"lw-diagram\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-497-review-20261024.png\" width=\"1120\" height=\"580\" alt=\"Build przed uwierzytelnieniem, wdro\u017cenie digestu obrazu, testy i udost\u0119pnienie\"><figcaption>Build odbywa si\u0119 przed utworzeniem pliku po\u015bwiadcze\u0144 chmurowych. WIF ogranicza dost\u0119p; testy aplikacji i jawne prze\u0142\u0105czenie ruchu ko\u0144cz\u0105 wydanie.<\/figcaption><\/figure>\n<h2>2. Ograniczenie WIF do w\u0142a\u015bciciela, repozytorium i ga\u0142\u0119zi main<\/h2>\n<p>Polecenia tworz\u0105 now\u0105 relacj\u0119 zaufania. Wszystkie przyk\u0142adowe identyfikatory wymagaj\u0105 wcze\u015bniejszego zast\u0105pienia. <code>PROJECT_NUMBER<\/code> jest numerycznym numerem projektu Google, a nie identyfikatorem projektu. <code>OWNER_ID<\/code> i <code>REPOSITORY_ID<\/code> s\u0105 numerycznymi identyfikatorami GitHub. Dzi\u0119ki temu ponowne zaj\u0119cie usuni\u0119tej nazwy organizacji lub repozytorium przez inne konto nie odtwarza zaufanej to\u017csamo\u015bci.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\">#!\/usr\/bin\/env bash<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Replace all example identifiers before administrative setup.<\/span>\n<\/span><span class=\"cbb-line\">PROJECT_ID=<span class=\"cbb-string\">\"enterprise-ai-project\"<\/span>\n<\/span><span class=\"cbb-line\">PROJECT_NUMBER=<span class=\"cbb-string\">\"1234567890\"<\/span>\n<\/span><span class=\"cbb-line\">OWNER_ID=<span class=\"cbb-string\">\"11111111\"<\/span>\n<\/span><span class=\"cbb-line\">REPOSITORY_ID=<span class=\"cbb-string\">\"22222222\"<\/span>\n<\/span><span class=\"cbb-line\">DEPLOYER=<span class=\"cbb-string\">\"ci-cd-deployer@<\/span><span class=\"cbb-variable\">${PROJECT_ID}<\/span><span class=\"cbb-string\">.iam.gserviceaccount.com\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">gcloud iam workload-identity-pools create github-actions-pool \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$PROJECT_ID<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">--location<\/span>=global \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--display-name<\/span>=<span class=\"cbb-string\">\"GitHub Actions Pool\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">gcloud iam workload-identity-pools providers create-oidc github-provider \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$PROJECT_ID<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">--location<\/span>=global \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--workload-identity-pool<\/span>=github-actions-pool \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--issuer-uri<\/span>=<span class=\"cbb-string\">\"https:\/\/token.actions.githubusercontent.com\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--attribute-mapping<\/span>=<span class=\"cbb-string\">\"google.subject=assertion.sub,attribute.repository_id=assertion.repository_id,attribute.repository_owner_id=assertion.repository_owner_id,attribute.ref=assertion.ref,attribute.event_name=assertion.event_name\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--attribute-condition<\/span>=<span class=\"cbb-string\">\"assertion.repository_owner_id == '<\/span><span class=\"cbb-variable\">${OWNER_ID}<\/span><span class=\"cbb-string\">' &amp;&amp; assertion.repository_id == '<\/span><span class=\"cbb-variable\">${REPOSITORY_ID}<\/span><span class=\"cbb-string\">' &amp;&amp; assertion.ref == 'refs\/heads\/main' &amp;&amp; assertion.event_name == 'push'\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">gcloud iam service-accounts add-iam-policy-binding <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$DEPLOYER<\/span><span class=\"cbb-string\">\"<\/span> \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=<span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$PROJECT_ID<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-attr\">--role<\/span>=roles\/iam.workloadIdentityUser \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--member<\/span>=<span class=\"cbb-string\">\"principalSet:\/\/iam.googleapis.com\/projects\/<\/span><span class=\"cbb-variable\">${PROJECT_NUMBER}<\/span><span class=\"cbb-string\">\/locations\/global\/workloadIdentityPools\/github-actions-pool\/attribute.repository_id\/<\/span><span class=\"cbb-variable\">${REPOSITORY_ID}<\/span><span class=\"cbb-string\">\"<\/span><\/span><\/code><\/pre><\/figure>\n<p>Warunek dostawcy dopuszcza tylko zdarzenia push z ustalonego repozytorium na <code>main<\/code>. Sam wyzwalacz workflow nie ogranicza dost\u0119pu po stronie Google Cloud. Propagacja zmian WIF i IAM mo\u017ce potrwa\u0107. Powi\u0105zanie <code>roles\/iam.workloadIdentityUser<\/code> pozwala u\u017cy\u0107 to\u017csamo\u015bci konta wdro\u017ceniowego; uprawnienia do zasob\u00f3w nadal s\u0105 wymagane oddzielnie.<\/p>\n<p>Ochrona ga\u0142\u0119zi i przegl\u0105d zmian plik\u00f3w workflow pozostaj\u0105 wa\u017cne: inny uprawniony workflow na <code>main<\/code> tak\u017ce mo\u017ce spe\u0142ni\u0107 te warunki. \u015arodowisko GitHub <code>production<\/code> wymaga w\u0142a\u015bciwych regu\u0142 ochrony. Sama nazwa \u015brodowiska w YAML nie tworzy obowi\u0105zku zatwierdzenia.<\/p>\n<h2>3. Budowanie obrazu, uwierzytelnienie i przygotowanie rewizji<\/h2>\n<p>Przed pierwszym uruchomieniem wzorzec <code>gha-creds-*.json<\/code> nale\u017cy umie\u015bci\u0107 w <code>.gitignore<\/code>, a poni\u017csze wykluczenia w <code>.dockerignore<\/code>. Pozosta\u0142e pliki sekret\u00f3w oraz pliki ignore przypisane do Dockerfile wymagaj\u0105 dopasowania do projektu; p\u00f3\u017aniejsze wyj\u0105tki nie mog\u0105 ponownie w\u0142\u0105cza\u0107 po\u015bwiadcze\u0144.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">gha-creds-*.json\n<\/span><span class=\"cbb-line\">.git\n<\/span><span class=\"cbb-line\">.env\n<\/span><span class=\"cbb-line\">.env.*<\/span><\/code><\/pre><\/figure>\n<p>Akcja auth domy\u015blnie zapisuje plik kr\u00f3tkotrwa\u0142ych po\u015bwiadcze\u0144 w katalogu roboczym. P\u00f3\u017aniejsze <code>docker build<\/code> z szerokim <code>COPY<\/code> mog\u0142oby do\u0142\u0105czy\u0107 ten plik do obrazu. Dlatego testy i budowanie odbywaj\u0105 si\u0119 przed uwierzytelnieniem w chmurze. Wersje akcji wskazuj\u0105 konkretne, sprawdzone commity; aktualizacje nadal wymagaj\u0105 przegl\u0105du.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-attr\">name<\/span>: Build and stage a Cloud Run revision\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">on<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">push<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">branches<\/span>: &#91;main&#93;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">permissions<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">contents<\/span>: read\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">id-token<\/span>: write\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">concurrency<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">group<\/span>: cloud-run-api-service\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">cancel-in-progress<\/span>: <span class=\"cbb-constant\">false<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">env<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">PROJECT_ID<\/span>: enterprise-ai-project\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">REGION<\/span>: us-central1\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">IMAGE<\/span>: us-central1-docker.pkg.dev\/enterprise-ai-project\/services\/api-service\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">PROVIDER<\/span>: projects\/1234567890\/locations\/global\/workloadIdentityPools\/github-actions-pool\/providers\/github-provider\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">DEPLOYER<\/span>: ci-cd-deployer@enterprise-ai-project.iam.gserviceaccount.com\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">RUNTIME<\/span>: api-runtime@enterprise-ai-project.iam.gserviceaccount.com\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">jobs<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">stage<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">runs-on<\/span>: ubuntu-latest\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">timeout-minutes<\/span>: <span class=\"cbb-number\">30<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">environment<\/span>: production\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">defaults<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">run<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">shell<\/span>: bash\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">steps<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Checkout\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: actions\/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 <span class=\"cbb-comment\"># v7<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">with<\/span>:\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">persist-credentials<\/span>: <span class=\"cbb-constant\">false<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Application tests and build before cloud authentication\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">run<\/span>: <span class=\"cbb-meta\">|<\/span>\n<\/span><span class=\"cbb-line\">          set -euo pipefail\n<\/span><span class=\"cbb-line\">          .\/ci\/test.sh\n<\/span><span class=\"cbb-line\">          docker build --tag <span class=\"cbb-string\">\"$IMAGE:$GITHUB_SHA\"<\/span> .\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Authenticate for image push\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">with<\/span>:\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">workload_identity_provider<\/span>: <span class=\"cbb-variable\">${{ env.PROVIDER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">service_account<\/span>: <span class=\"cbb-variable\">${{ env.DEPLOYER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">project_id<\/span>: <span class=\"cbb-variable\">${{ env.PROJECT_ID }}<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Set up gcloud\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Push image\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">run<\/span>: <span class=\"cbb-meta\">|<\/span>\n<\/span><span class=\"cbb-line\">          set -euo pipefail\n<\/span><span class=\"cbb-line\">          gcloud auth configure-docker <span class=\"cbb-string\">\"$REGION-docker.pkg.dev\"<\/span> --quiet\n<\/span><span class=\"cbb-line\">          docker push <span class=\"cbb-string\">\"$IMAGE:$GITHUB_SHA\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Refresh authentication before deployment\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">with<\/span>:\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">workload_identity_provider<\/span>: <span class=\"cbb-variable\">${{ env.PROVIDER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">service_account<\/span>: <span class=\"cbb-variable\">${{ env.DEPLOYER }}<\/span>\n<\/span><span class=\"cbb-line\">          <span class=\"cbb-attr\">project_id<\/span>: <span class=\"cbb-variable\">${{ env.PROJECT_ID }}<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Configure refreshed gcloud credentials\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">uses<\/span>: google-github-actions\/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db <span class=\"cbb-comment\"># v3<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">name<\/span>: Stage revision without changing traffic\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">run<\/span>: <span class=\"cbb-meta\">|<\/span>\n<\/span><span class=\"cbb-line\">          set -euo pipefail\n<\/span><span class=\"cbb-line\">          gcloud run services describe api-service \\\n<\/span><span class=\"cbb-line\">            --project=<span class=\"cbb-string\">\"$PROJECT_ID\"<\/span> --region=<span class=\"cbb-string\">\"$REGION\"<\/span> &gt;\/dev\/null\n<\/span><span class=\"cbb-line\">          DIGEST=<span class=\"cbb-string\">\"$(gcloud artifacts docker images describe \"<\/span>$IMAGE:$GITHUB_SHA\" \\\n<\/span><span class=\"cbb-line\">            --project=<span class=\"cbb-string\">\"$PROJECT_ID\"<\/span> --format=<span class=\"cbb-string\">'value(image_summary.digest)'<\/span>)\"\n<\/span><span class=\"cbb-line\">          &#91;&#91; <span class=\"cbb-string\">\"$DIGEST\"<\/span> =~ ^sha256:&#91;0-9a-f&#93;{<span class=\"cbb-number\">64<\/span>}$ &#93;&#93;\n<\/span><span class=\"cbb-line\">          gcloud run deploy api-service \\\n<\/span><span class=\"cbb-line\">            --project=<span class=\"cbb-string\">\"$PROJECT_ID\"<\/span> --region=<span class=\"cbb-string\">\"$REGION\"<\/span> \\\n<\/span><span class=\"cbb-line\">            --image=<span class=\"cbb-string\">\"$IMAGE@$DIGEST\"<\/span> --service-account=<span class=\"cbb-string\">\"$RUNTIME\"<\/span> \\\n<\/span><span class=\"cbb-line\">            --no-traffic --tag=candidate \\\n<\/span><span class=\"cbb-line\">            --min-instances=0 --max-instances=50 \\\n<\/span><span class=\"cbb-line\">            --concurrency=80 --memory=512Mi --cpu=1 --cpu-throttling \\\n<\/span><span class=\"cbb-line\">            --quiet<\/span><\/code><\/pre><\/figure>\n<p>Potok wysy\u0142a obraz z tagiem commita, a nast\u0119pnie wdra\u017ca ustalony digest. Digest identyfikuje zawarto\u015b\u0107 obrazu; sam tag mo\u017ce si\u0119 zmieni\u0107. Uwierzytelnienie jest odnawiane przed wdro\u017ceniem, aby czas budowania i wysy\u0142ania nie zu\u017cywa\u0142 niepotrzebnie kr\u00f3tkiego okresu wa\u017cno\u015bci. Bardzo d\u0142ugi upload lub deployment nadal mo\u017ce wymaga\u0107 ponownego uwierzytelnienia i kontrolowanej pr\u00f3by.<\/p>\n<p><code>--no-traffic<\/code> pozostawia zwyk\u0142y ruch przy wcze\u015bniejszych rewizjach. Tag <code>candidate<\/code> tworzy osobny adres testowy i przy nast\u0119pnym przebiegu wskazuje now\u0105 rewizj\u0119. Adres nadal podlega zasadom dost\u0119pu us\u0142ugi. Podstawowe testy funkcjonalne sprawdzaj\u0105 na przyk\u0142ad typowe \u017c\u0105danie API. Wymagaj\u0105 konta uprawnionego do wywo\u0142ania us\u0142ugi, zwykle z Cloud Run Invoker i odpowiednim tokenem ID. Sam poprawny start nie dowodzi poprawnego dzia\u0142ania aplikacji.<\/p>\n<p>Po testach i sprawdzeniu dok\u0142adnego identyfikatora rewizji ruch mo\u017cna prze\u0142\u0105czy\u0107 jawnie. Placeholder poni\u017cej wymaga zast\u0105pienia faktycznie sprawdzon\u0105 rewizj\u0105. Wycofanie analogicznie wskazuje wcze\u015bniejsz\u0105 zweryfikowan\u0105 rewizj\u0119. Zmiany tabel bazy danych i ju\u017c wykonane dzia\u0142ania w innych systemach pozostaj\u0105 w mocy. Na przyk\u0142ad wys\u0142ana wiadomo\u015b\u0107 nie zostaje cofni\u0119ta przez przywr\u00f3cenie poprzedniej rewizji.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># After authenticated smoke tests and approval of this exact revision:<\/span>\n<\/span><span class=\"cbb-line\">gcloud run services update-traffic api-service \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--project<\/span>=enterprise-ai-project <span class=\"cbb-attr\">--region<\/span>=us-central1 \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--to-revisions<\/span>=REVIEWED_REVISION_NAME=<span class=\"cbb-number\">100<\/span><\/span><\/code><\/pre><\/figure>\n<h2>4. Skalowanie i koszty dopasowane do aplikacji<\/h2>\n<ul><li><strong>Wsp\u00f3\u0142bie\u017cno\u015b\u0107 80:<\/strong> To maksymalna liczba jednoczesnych \u017c\u0105da\u0144 na instancj\u0119 w przyk\u0142adzie, a nie pr\u00f3g wymagaj\u0105cy pe\u0142nego wype\u0142nienia. Autoskalowanie uwzgl\u0119dnia mi\u0119dzy innymi wykorzystanie CPU i wsp\u00f3\u0142bie\u017cno\u015bci. \u017b\u0105dania intensywnie u\u017cywaj\u0105ce CPU lub pami\u0119ci cz\u0119sto wymagaj\u0105 ni\u017cszych warto\u015bci; wi\u0119ksza r\u00f3wnoleg\u0142o\u015b\u0107 nie zmniejsza automatycznie zu\u017cycia pami\u0119ci.<\/li><li><strong>Zero minimalnych instancji:<\/strong> <code>--min-instances=0<\/code> dotyczy nowej rewizji. Minimaln\u0105 liczb\u0119 na poziomie us\u0142ugi r\u00f3wnie\u017c trzeba sprawdzi\u0107. Przy rozliczaniu wed\u0142ug \u017c\u0105da\u0144 zwyk\u0142e bezczynne instancje bez minimalnego utrzymywania nie generuj\u0105 op\u0142at za bezczynne zasoby obliczeniowe; start, zamykanie i \u017c\u0105dania nadal mog\u0105 kosztowa\u0107. Dochodz\u0105 obrazy w rejestrze, sie\u0107, logi i GitHub Actions.<\/li><li><strong>Maksimum 50:<\/strong> <code>--max-instances=50<\/code> jest tutaj limitem rewizji. Wiele rewizji i chwilowe przekroczenia mog\u0105 zwi\u0119kszy\u0107 sum\u0119. Odpowiedni dodatkowy limit us\u0142ugi lepiej chroni zale\u017cne systemy; \u017cadne z tych ustawie\u0144 nie stanowi twardego limitu rachunku.<\/li><li><strong>Praca w tle:<\/strong> <code>--cpu-throttling<\/code> wybiera przydzia\u0142 CPU zwi\u0105zany z \u017c\u0105daniami. Rozliczanie instancjowe ze stale przydzielonym CPU i minimalnymi instancjami umo\u017cliwia prac\u0119 w tle, lecz nie gwarantuje nieprzerwanego procesu. Instancje mog\u0105 zosta\u0107 zako\u0144czone. Zadania z mo\u017cliwo\u015bci\u0105 ponowienia mog\u0105 korzysta\u0107 z trwa\u0142ej kolejki Cloud Tasks lub odpowiednich Cloud Run Jobs.<\/li><\/ul>\n<p>Warto\u015bci 80, 50 i 512 MiB s\u0105 ustawieniami pocz\u0105tkowymi przyk\u0142adu. Testy obci\u0105\u017ceniowe powinny mierzy\u0107 op\u00f3\u017anienia, b\u0142\u0119dy, zu\u017cycie pami\u0119ci i po\u0142\u0105czenia z baz\u0105. Cloud Run mo\u017ce prze\u0142\u0105cza\u0107 rewizje bez planowanej przerwy, ale b\u0142\u0119dny kod, niezgodne migracje lub wyczerpane kwoty nadal mog\u0105 powodowa\u0107 awarie.<\/p>\n\n\n<!-- lw-flux-illu 495-a4 -->\n<figure class=\"lw-illu\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/illustrationen\/flux-495-a4.webp\" width=\"1120\" height=\"630\" loading=\"lazy\" decoding=\"async\" alt=\"Trzy sk\u0142adane sto\u0142y mieszcz\u0105 t\u0119 sam\u0105 najwi\u0119ksz\u0105 liczb\u0119 talerzy, a czwarty stoi z\u0142o\u017cony przy \u015bcianie. Tak samo concurrency okre\u015bla, ile zapyta\u0144 instancja obs\u0142uguje naraz, a nieu\u017cywane nic nie kosztuj\u0105.\"><figcaption>Trzy sk\u0142adane sto\u0142y mieszcz\u0105 t\u0119 sam\u0105 najwi\u0119ksz\u0105 liczb\u0119 talerzy, a czwarty stoi z\u0142o\u017cony przy \u015bcianie. Tak samo concurrency okre\u015bla, ile zapyta\u0144 instancja obs\u0142uguje naraz, a nieu\u017cywane nic nie kosztuj\u0105.<\/figcaption><\/figure>\n\n\n<div class=\"lw-faq\"><h2>Pytania i odpowiedzi<\/h2><h3>Czy wdra\u017canie bez klucza jest bezobs\u0142ugowe?<\/h3><p>Nie. WIF usuwa z tego procesu stale zapisany klucz Google. Kr\u00f3tkotrwa\u0142e tokeny, dost\u0119p do GitHub i uprawnienia wykonawcze nadal wymagaj\u0105 ochrony. Zale\u017cno\u015bci, obrazy bazowe, commity akcji i regu\u0142y IAM wymagaj\u0105 utrzymania.<\/p><h3>Dlaczego brakuje &#8211;allow-unauthenticated?<\/h3><p>Flaga nadaje publiczne prawo wywo\u0142ania i wymaga dodatkowych uprawnie\u0144 IAM. Przyk\u0142ad zak\u0142ada ju\u017c prywatn\u0105 us\u0142ug\u0119 i zachowuje zasady wywo\u0142ania. Pomini\u0119cie flagi nie zmienia istniej\u0105cej us\u0142ugi publicznej w prywatn\u0105.<\/p><h3>Co kosztuje po zatrzymaniu wszystkich instancji?<\/h3><p>Mi\u0119dzy innymi zapisane obrazy i pozosta\u0142e u\u017cywane us\u0142ugi chmurowe. Regu\u0142a czyszczenia rejestru powinna zachowywa\u0107 potrzebne obrazy wyda\u0144 i wycofania. Skalowanie do zera nie oznacza darmowych wdro\u017ce\u0144 ani darmowej ca\u0142ej infrastruktury.<\/p><\/div>\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\">Dokumentacja Cloud Run<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Dokumentacja Docker<\/a><\/li>\n<li><a href=\"https:\/\/docs.cloud.google.com\/iam\/docs\/workload-identity-federation-with-deployment-pipelines\" target=\"_blank\" rel=\"noopener noreferrer\">WIF w procesach wdra\u017cania<\/a><\/li><li><a href=\"https:\/\/github.com\/google-github-actions\/auth\/blob\/main\/docs\/TROUBLESHOOTING.md\" target=\"_blank\" rel=\"noopener noreferrer\">Akcja auth: po\u015bwiadczenia w wynikach budowania<\/a><\/li><li><a href=\"https:\/\/github.com\/google-github-actions\/auth\" target=\"_blank\" rel=\"noopener noreferrer\">Uwierzytelnianie Google Cloud w GitHub Actions<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/about-concurrency\" target=\"_blank\" rel=\"noopener noreferrer\">Wsp\u00f3\u0142bie\u017cno\u015b\u0107 w Cloud Run<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/configuring\/billing-settings\" target=\"_blank\" rel=\"noopener noreferrer\">Ustawienia rozlicze\u0144 Cloud Run<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/configuring\/max-instances-limits\" target=\"_blank\" rel=\"noopener noreferrer\">Maksymalna liczba instancji<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/rollouts-rollbacks-traffic-migration\" target=\"_blank\" rel=\"noopener noreferrer\">Testowanie rewizji, prze\u0142\u0105czanie ruchu i wycofywanie wersji<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/reference\/iam\/roles\" target=\"_blank\" rel=\"noopener noreferrer\">Uprawnienia do wdra\u017cania w Cloud Run<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/run\/docs\/container-contract\" target=\"_blank\" rel=\"noopener noreferrer\">Wymagania wykonawcze kontener\u00f3w Cloud Run<\/a><\/li><li><a href=\"https:\/\/github.blog\/changelog\/2025-08-15-github-actions-policy-now-supports-blocking-and-sha-pinning-actions\/\" target=\"_blank\" rel=\"noopener noreferrer\">Przypinanie GitHub Actions do konkretnych commit\u00f3w<\/a><\/li><\/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":23100,"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<\/title>\n<meta name=\"description\" content=\"Wdro\u017cenie Cloud Run przez GitHub Actions: Workload Identity Federation, uprawnienia, skalowanie, wsp\u00f3\u0142bie\u017cno\u015b\u0107 i koszty.\" \/>\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\" \/>\n<meta property=\"og:description\" content=\"Wdro\u017cenie Cloud Run przez GitHub Actions: Workload Identity Federation, uprawnienia, skalowanie, wsp\u00f3\u0142bie\u017cno\u015b\u0107 i koszty.\" \/>\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=\"article:modified_time\" content=\"2026-10-26T11:44:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-497-review-20261024-dark.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\",\"dateModified\":\"2026-10-26T11:44:32+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\":1264,\"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\\\/10\\\/hero-497-review-20261024-dark.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\",\"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\\\/10\\\/hero-497-review-20261024-dark.png\",\"datePublished\":\"2026-09-25T16:30:00+00:00\",\"dateModified\":\"2026-10-26T11:44:32+00:00\",\"description\":\"Wdro\u017cenie Cloud Run przez GitHub Actions: Workload Identity Federation, uprawnienia, skalowanie, wsp\u00f3\u0142bie\u017cno\u015b\u0107 i koszty.\",\"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\\\/10\\\/hero-497-review-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-497-review-20261024-dark.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","description":"Wdro\u017cenie Cloud Run przez GitHub Actions: Workload Identity Federation, uprawnienia, skalowanie, wsp\u00f3\u0142bie\u017cno\u015b\u0107 i koszty.","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","og_description":"Wdro\u017cenie Cloud Run przez GitHub Actions: Workload Identity Federation, uprawnienia, skalowanie, wsp\u00f3\u0142bie\u017cno\u015b\u0107 i koszty.","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","article_modified_time":"2026-10-26T11:44:32+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-497-review-20261024-dark.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","dateModified":"2026-10-26T11:44:32+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":1264,"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\/10\/hero-497-review-20261024-dark.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","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\/10\/hero-497-review-20261024-dark.png","datePublished":"2026-09-25T16:30:00+00:00","dateModified":"2026-10-26T11:44:32+00:00","description":"Wdro\u017cenie Cloud Run przez GitHub Actions: Workload Identity Federation, uprawnienia, skalowanie, wsp\u00f3\u0142bie\u017cno\u015b\u0107 i koszty.","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\/10\/hero-497-review-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-497-review-20261024-dark.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":10,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/497\/revisions"}],"predecessor-version":[{"id":27016,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/497\/revisions\/27016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/23100"}],"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}]}}