{"id":20197,"date":"2026-09-14T22:52:24","date_gmt":"2026-09-14T22:52:24","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/github-actions-templates-2\/"},"modified":"2026-09-14T22:52:24","modified_gmt":"2026-09-14T22:52:24","slug":"github-actions-templates","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/","title":{"rendered":"Private GitHub Actions-Vorlagen f\u00fcr Ihre Organisation"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">GitHub Actions ist ein relativer Neuling im CI\/CD-Bereich, \u00fcbertrifft aber schnell traditionelle Open-Source-Automatisierungsserver. Das Entwicklungsteam von Sinch Mailgun wei\u00df schon seit einiger Zeit, dass die Community f\u00fcr einige der Tools und Technologien, mit denen wir dies eingerichtet haben, schrumpft und sie Gefahr laufen, zu einer schwer zu pflegenden Nische zu werden. Aus diesen Gr\u00fcnden stellen wir derzeit unsere Jenkins-basierte CI\/CD auf GitHub Actions-CI\/CD um. Zur vollen Transparenz: Manchmal ist nicht alles im Lieferumfang enthalten \u2013 es sei denn, Sie sind ein GitHub Enterprise-Kunde &#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das liegt daran, dass Workflow-Vorlagen in privaten Repositories bis vor kurzem nicht unterst\u00fctzt wurden und wir auf einen Workaround zur\u00fcckgreifen mussten. Gl\u00fccklicherweise  <a href=\"https:\/\/github.blog\/changelog\/2022-03-04-sharing-github-actions-within-your-enterprise-is-now-ga\/\" target=\"_tabs\" rel=\"noopener noreferrer\">hat GitHub k\u00fcrzlich ein Update ver\u00f6ffentlicht,<\/a> das diese Funktionalit\u00e4t nun f\u00fcr Enterprise-Abonnements unterst\u00fctzt. Aber <b>f\u00fcr alle, die die Abonnements GitHub Free oder Team nutzen, besteht das Problem weiterhin. <\/b>Wir wissen nicht, ob oder wann GitHub dieses Update f\u00fcr andere Abonnements bereitstellt. Hier erfahren Sie in der Zwischenzeit, was wir erlebt und wie wir das Problem gel\u00f6st haben.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-3651\"><p class=\"h5 m-0\" id=\"toc-title-3651\">Inhaltsverzeichnis<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#die-herausforderung-bei-der-wiederverwendung-von-workflows\">Die Herausforderung bei der Wiederverwendung von Workflows<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#workflow-vorlagen-synchronisieren\">Workflow-Vorlagen synchronisieren\u00a0<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#github-actions-vorlagen-ein-akzeptabler-workaround-fuer-nicht-enterprise-abonnements\">GitHub Actions-Vorlagen: Ein akzeptabler Workaround f\u00fcr Nicht-Enterprise-Abonnements<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#die-einrichtung-durch-einen-git-basierten-paketmanager-vereinfachen\">Die Einrichtung durch einen Git-basierten Paketmanager vereinfachen<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#vor-und-nachteile-von-github-actions\">Vor- und Nachteile von GitHub Actions<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#wie-es-weitergeht\">Wie es weitergeht<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Die Herausforderung bei der Wiederverwendung von Workflows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Meine bisherige Erfahrung mit GitLab CI verk\u00fcrzte die Einarbeitungszeit in GitHub Actions, aber die feineren Details erwiesen sich als unterschiedlich. Zum Beispiel ist das Einbinden einer Reihe von Schritten aus einem Projekt in ein anderes ganz anders. Sowohl GitHub Actions als auch GitLab CI unterst\u00fctzen die Wiederverwendung von Schritten aus einem Repository in einem anderen, aber <b>die Abonnements GitHub Actions Free und Team erfordern, dass die einzubindenden Schritte \u00f6ffentlich zug\u00e4nglich sind<\/b>. In GitLab CI kann man die Authentifizierung verwenden, um die Jobs, Phasen, Variablen usw. eines privaten Repos zu importieren, und zwar mit der  <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/index.html#include\" target=\"_tabs\" rel=\"noopener noreferrer\">includes<\/a> -Direktive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Zeitpunkt der Verfassung dieses Artikels gab es bei GitHub Actions  <a href=\"https:\/\/stackoverflow.com\/questions\/4659549\/maintain-git-repo-inside-another-git-repo\/4660048#4660048\" target=\"_tabs\" rel=\"noopener noreferrer\">Issues<\/a> (<a href=\"https:\/\/github.com\/github\/roadmap\/issues\/74\" target=\"_tabs\" rel=\"noopener noreferrer\">genau genommen zwei<\/a>), in denen diese gew\u00fcnschte Funktionalit\u00e4t f\u00fcr private Repos verfolgt wurde. Diese Issues waren seit fast 18 Monaten offen, und die Funktion wurde erst k\u00fcrzlich f\u00fcr Enterprise-Abonnements hinzugef\u00fcgt. Ich bin mir nicht sicher, wann (oder ob) diese Funktionalit\u00e4t f\u00fcr alle verf\u00fcgbar sein wird, aber sie scheint eine wesentliche Voraussetzung zu sein, um die private Wiederverwendung von Workflows zu unterst\u00fctzen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Workflow-Vorlagen synchronisieren\u00a0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe Stack Overflow-Beitr\u00e4ge durchforstet und mich durch Kommentar-Threads zu GitHub-Issues gegraben, aber keine guten Workarounds f\u00fcr die fehlende M\u00f6glichkeit gefunden, Workflows aus anderen privaten Repositories derselben Organisation einzubinden.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich dachte, dass Git-Submodule vielleicht eine m\u00f6gliche L\u00f6sung w\u00e4ren. Schlie\u00dflich erm\u00f6glichen sie es, dass ein Repo ein anderes Repo einbindet. K\u00f6nnten wir unsere Workflow-Vorlagen als Submodul in unser Repo aufnehmen und die Submodul-Verwaltung von Git nutzen, um die Vorlagen auf dem neuesten Stand zu halten? Das k\u00f6nnten wir, allerdings nicht, wenn wir im Vorlagen-Repository Vorlagen haben m\u00f6chten, die f\u00fcr bestimmte andere Repos irrelevant sind. <b>Git behandelt ein Repo als kleinste Einheit bei der Submodul-Verwaltung<\/b>, sodass unsere L\u00f6sung entweder ein Repo ausschlie\u00dflich mit relevanten Workflows erfordern oder den Einsatz von Submodulen komplett vermeiden w\u00fcrde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir entschieden uns gegen Submodule, da wir ein einziges Workflow-Repo f\u00fcr Vorlagen in Go und Python (neben anderen) verwenden m\u00f6chten, aber ich habe aus diesem Gedankengang einige wertvolle Informationen gewonnen. Einige <a href=\"https:\/\/stackoverflow.com\/a\/4660048\" target=\"_tabs\" rel=\"noopener noreferrer\">Einige Leute verwenden Symlinks, um Teile eines Repos in ein anderes Repo einzubinden,  <\/a>anstelle von Submodulen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also haben wir versucht, unsere Vorlage mit dem Workflow unserer App zu verkn\u00fcpfen. <b><code>ln $DIR\/workflows\/go\/build_and_push.yml $DIR\/my-app\/.github\/workflows\/build_and_push.yml<\/code><\/b> funktioniert gut, um unsere Workflow-Vorlage mit unserer App zu synchronisieren &#8230; bis wir einen Git-Befehl ausf\u00fchren, der die Vorlage \u00e4ndert (Git \u00e4ndert die Inodes von Dateien, die es modifiziert). Da wir Git Pulls f\u00fcr Updates der Vorlagen durchf\u00fchren m\u00f6chten, mussten wir eine L\u00f6sung finden, die \u00c4nderungen aus dem Vorlagen-Repo automatisch auf die Datei einer App anwendet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub Actions-Vorlagen: Ein akzeptabler Workaround f\u00fcr Nicht-Enterprise-Abonnements<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da es keine native M\u00f6glichkeit gibt, private Vorlagen in unsere Workflows einzubinden, und wir unsere Workflow-Vorlagen in einem einzigen Repository speichern m\u00f6chten, haben wir uns f\u00fcr diese einfache L\u00f6sung entschieden, die das Anwenden von Vorlagen-Updates optimiert. Bis die Abonnements GitHub Free und Team private Vorlagen unterst\u00fctzen, k\u00f6nnen Sie migrieren, aber dies ist eine m\u00f6gliche L\u00f6sung, die wir erprobt und getestet haben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir f\u00fcgen Beispiele f\u00fcr Git-Hooks in unser Vorlagen-Repository ein (z. B. <code>hooks\/post-checkout.sample<\/code>), da alle Git-Befehle, die Verkn\u00fcpfungen aufheben, diese auch wiederherstellen m\u00fcssen. Die Hooks f\u00fcr <code>post-checkout<\/code> und <code>post-merge<\/code> sehen beide so aus:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    #!\/bin\/sh\r\n#\r\n# An example hook script to keep your application workflow up-to-date with this\r\n# template. For example, this updates my-app&#039;s workflow with the go template.\r\n#\r\n# To activate, this must have execute permission and be copied like so:\r\n#\r\n# $ cp hooks\/post-checkout.sample .git\/hooks\/post-checkout\r\n# $ chmod +x .git\/hooks\/post-checkout\r\n\r\n# setup our project directory, assumes my-app is sibling\r\nexport PROJ_DIR=..\r\n# remove existing workflow for clean install\r\nrm $PROJ_DIR\/my-app\/.github\/workflows\/build_and_push.yml\r\n# link app workflow to template\r\nln -v $PROJ_DIR\/workflows\/go\/build_and_push.yml $PROJ_DIR\/my-app\/.github\/workflows\/build_and_push.yml\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\"><code>git merge<\/code> und <code>git checkout<\/code> sind h\u00e4ufige Vorg\u00e4nge, die Verkn\u00fcpfungen aufheben. Daher f\u00fchren wir dieses Skript nach diesen Aktionen aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit Nutzer also Workflow-Vorlagen auf ihre Apps anwenden k\u00f6nnen, m\u00fcssen sie Folgendes tun:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Unser <code>workflows<\/code>-Repo klonen.<\/li>\n\n\n\n<li>Die Dateien <code>hooks\/post-checkout.sample<\/code> und <code>hooks\/post-merge.sample<\/code> an die jeweilige(n) App(s) anpassen.<\/li>\n\n\n\n<li>Sie an die entsprechenden <code>.git\/hooks<\/code>-Speicherorte kopieren und ihnen Ausf\u00fchrungsberechtigungen erteilen.<\/li>\n\n\n\n<li>Einen <code>git checkout<\/code> oder <code>git pull<\/code> ausf\u00fchren (<code>git checkout master<\/code> vom prim\u00e4ren Branch funktioniert).<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Leider h\u00e4lt dies das Vorlagen-Repo nicht von alleine aktuell und erfordert etwas Interaktion von den Projektverantwortlichen, um Updates zu \u00fcbernehmen \u2013 schlie\u00dflich m\u00fcssen die \u00c4nderungen auf das Remote-Repo angewendet werden. Dies geschieht \u00fcber die folgenden Befehle:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    # from the workflow templates repo\r\n$ git pull\r\n# from the project repo\r\n$ git add .github\/workflows\/\r\n$ git commit -m &quot;upgrade workflow template&quot;\r\n$ git push\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Und danach wird der Workflow mit den aktuellsten \u00c4nderungen aus dem Vorlagen-Repo ausgef\u00fchrt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Einrichtung durch einen Git-basierten Paketmanager vereinfachen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir den Prozess zum Anwenden der Vorlagen optimiert haben, sind wir mit unserem Workaround andere Kompromisse eingegangen. Der offensichtlichste ist die erforderliche Einrichtung. Wir fordern die Nutzer auf, ihre Repositories auf eine bestimmte Weise zu strukturieren und Dateien manuell zu kopieren und einzuf\u00fcgen. Diese Anforderungen tragen zu einer gewissen Fehleranf\u00e4lligkeit bei, da das System ausfallen kann, wenn Dateien verschoben werden oder sich Inodes ohne unser Wissen \u00e4ndern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir ziehen jedoch auch einen interessanten Vorteil aus diesem Workaround. Wir haben ein Toolset und Skripte entdeckt, die in einem generischen Kontext funktionieren k\u00f6nnen. Wir haben einen Git-basierten, generischen Paketmanager erstellt, der Verkn\u00fcpfungen und Git-Hooks verwendet, um Dateien zwischen Git-Repos zu aktualisieren:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    #!\/bin\/sh\r\n\r\n# set paths\/files (relative to workflows repo)\r\nexport TEMPLATE_DIR=.\r\nexport APP_DIR=..\/my-app\r\nexport DOCKER_TEMPL=go\/Dockerfile\r\nexport WKFLW_TEMPL=go\/build.yml\r\n\r\n#remove files for clean install\r\nrm $APP_DIR\/Dockerfil $APP_DIR\/.github\/workflows\/build.yml\r\n\r\n# link app workflow to template\r\nln -v $TEMPLATE_DIR\/$DOCKER_TEMPL $APP_DIR\/Dockerfile\r\nln -v $TEMPLATE_DIR\/$WKFLW_TEMPL $APP_DIR\/.github\/workflows\/build.yml\r\n\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Vor- und Nachteile von GitHub Actions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Warum also GitHub Actions? Nun, unser aktuelles System erfordert Modifikationen, Pull-Requests, Deployments und mehr, um einen neuen Dienst bereitzustellen. Und als GitHub Enterprise-Nutzer verf\u00fcgen wir \u00fcber ein gro\u00dfes Kontingent an Ausf\u00fchrungsminuten innerhalb von GitHub Actions und haben uns daher entschlossen, dies als Alternative zu evaluieren.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem wir einige Zeit mit GitHub Actions verbracht haben, sind hier meine Erkenntnisse: <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\nVorteile von GitHub Actions\n<\/th><th>\nNachteile von GitHub Actions\n<\/th><\/tr><\/thead><tbody><tr><td>\nDank gehosteter Runner m\u00fcssen wir uns nicht um deren Wartung k\u00fcmmern.\n<\/td><td>\nDie Abrechnung erfolgt nach Ausf\u00fchrungsminuten. Wir haben also keinen Anreiz, lang andauernde Tests auf von GitHub gehosteten Runnern durchzuf\u00fchren.\n<\/td><\/tr><tr><td>\nEs bietet einige Sicherheitsvorteile (obwohl es dort k\u00fcrzlich einen  <a href=\"https:\/\/www.theregister.com\/2022\/04\/21\/github-stolen-oauth-tokens-used-in-breaches\/\">Sicherheitsvorfall<\/a>).\n<\/td><td>\nEs fehlen noch einige Funktionen, die Jenkins bietet.\n<\/td><\/tr><tr><td>\nEs verf\u00fcgt \u00fcber eine weiter verbreitete, in YAML definierte CI\/CD-Syntax.\n<\/td><td>\nGitHub verwendet in Actions \u00e4hnliche Metaphern und Begrifflichkeiten wie die Konkurrenz, aber diese sind nicht immer identisch. Dies macht die Migration und das Erlernen etwas schwierig.\n<\/td><\/tr><tr><td>\nEs ist einfacher, OSS- oder \u00f6ffentliche Jobs zu integrieren.\n<\/td><td>\nDie Arbeit mit Secrets kann gef\u00e4hrlich sein, und das Entwicklungsteam kann unbewusst Daten preisgeben.\n<\/td><\/tr><tr><td>\nDie Integration in die GitHub-Benutzeroberfl\u00e4che macht das Einsehen der CI-Ergebnisse einfach.\n<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wie Sie sehen, ist das Gras nicht immer gr\u00fcner. Wir gehen jedoch davon aus, dass GitHub mit seinen endlosen Ressourcen von Microsoft auf lange Sicht Jenkins \u00fcberholen wird.\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie es weitergeht<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Unser Workaround ist zwar nicht elegant, aber es ist eine funktionierende L\u00f6sung, bis GitHub private Vorlagen f\u00fcr Nicht-Enterprise-Abonnements unterst\u00fctzt. Wenn dies der Fall ist, k\u00f6nnen Sie Vorlagen in ein einziges Repository migrieren.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trotzdem haben wir ein GitHub Enterprise-Konto, aber noch nicht die M\u00f6glichkeit, die von GitHub hinzugef\u00fcgte Funktion f\u00fcr private Repos zu aktivieren.\u00a0Wir suchen noch nach der Ursache f\u00fcr dieses Problem.\u00a0Bis dahin nutzen wir unseren Workaround und werden in Zukunft pr\u00fcfen, ob wir Zugriff auf diese neue Funktion erhalten k\u00f6nnen. Bleiben Sie dran!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem wir jahrelang Jenkins genutzt hatten, beschlossen wir, zu GitHub Actions zu migrieren, wobei wir auf einige Herausforderungen stie\u00dfen. Daher haben wir einen Workaround entwickelt, der es GitHub-Nutzern ohne Enterprise-Abonnement mit privaten Repos erm\u00f6glicht, ihre Workflow-Vorlagen zu aktualisieren.<\/p>\n","protected":false},"author":16,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-20197","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>So nutzen Sie private Repositories mit GitHub Actions - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Die Migration Ihrer CI\/CD zu GitHub Actions kann knifflig sein, wenn Sie private Vorlagen verwenden m\u00f6chten. Gl\u00fccklicherweise haben wir diesen Workaround f\u00fcr das Anwenden von Vorlagen-Updates entwickelt.\" \/>\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.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"So nutzen Sie private Repositories mit GitHub Actions - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Die Migration Ihrer CI\/CD zu GitHub Actions kann knifflig sein, wenn Sie private Vorlagen verwenden m\u00f6chten. Gl\u00fccklicherweise haben wir diesen Workaround f\u00fcr das Anwenden von Vorlagen-Updates entwickelt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\",\"name\":\"So nutzen Sie private Repositories mit GitHub Actions - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2026-09-14T22:52:24+00:00\",\"description\":\"Die Migration Ihrer CI\\\/CD zu GitHub Actions kann knifflig sein, wenn Sie private Vorlagen verwenden m\u00f6chten. Gl\u00fccklicherweise haben wir diesen Workaround f\u00fcr das Anwenden von Vorlagen-Updates entwickelt.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/dev-life\\\/github-actions-templates\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Private GitHub Actions-Vorlagen f\u00fcr Ihre Organisation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"So nutzen Sie private Repositories mit GitHub Actions - Transactional Email API Service For Developers | Mailgun","description":"Die Migration Ihrer CI\/CD zu GitHub Actions kann knifflig sein, wenn Sie private Vorlagen verwenden m\u00f6chten. Gl\u00fccklicherweise haben wir diesen Workaround f\u00fcr das Anwenden von Vorlagen-Updates entwickelt.","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.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/","og_locale":"de_DE","og_type":"article","og_title":"So nutzen Sie private Repositories mit GitHub Actions - Transactional Email API Service For Developers | Mailgun","og_description":"Die Migration Ihrer CI\/CD zu GitHub Actions kann knifflig sein, wenn Sie private Vorlagen verwenden m\u00f6chten. Gl\u00fccklicherweise haben wir diesen Workaround f\u00fcr das Anwenden von Vorlagen-Updates entwickelt.","og_url":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/","url":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/","name":"So nutzen Sie private Repositories mit GitHub Actions - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2026-09-14T22:52:24+00:00","description":"Die Migration Ihrer CI\/CD zu GitHub Actions kann knifflig sein, wenn Sie private Vorlagen verwenden m\u00f6chten. Gl\u00fccklicherweise haben wir diesen Workaround f\u00fcr das Anwenden von Vorlagen-Updates entwickelt.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/de\/blog\/dev-life\/github-actions-templates\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"Private GitHub Actions-Vorlagen f\u00fcr Ihre Organisation"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/20197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/16"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/20197\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=20197"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=20197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}