From b708f6fc273eac4bcb90155ae7fe86fc67e556c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 01:15:17 +0000 Subject: [PATCH] chore(third-party-sync): update actions-template-sync to v2.5.2 --- .../actions-template-sync/.all-contributorsrc | 399 ++++++++ .../.devcontainer/devcontainer.json | 34 + .../.devcontainer/docker-compose.yml | 41 + .../actions-template-sync/.dockerignore | 3 + .../actions-template-sync/.editorconfig | 29 + .../actions-template-sync/.github/CODEOWNERS | 3 + .../.github/CODE_OF_CONDUCT.md | 77 ++ .../.github/CONTRIBUTING.md | 58 ++ .../actions-template-sync/.github/FUNDING.yml | 2 + .../.github/ISSUE_TEMPLATE/BUG_REPORT.yml | 81 ++ .../.github/ISSUE_TEMPLATE/DOC_TEMPLATE.yml | 29 + .../ISSUE_TEMPLATE/FEATURE_REQUEST.yml | 40 + .../.github/PULL_REQUEST_TEMPLATE.md | 10 + .../actions-template-sync/.github/SECURITY.md | 8 + .../.github/dependabot.yml | 12 + .../actions-template-sync/.github/labeler.yml | 10 + .../workflows/actions_template_sync.yml | 27 + .../.github/workflows/gh_pages_mk_docs.yml | 19 + .../.github/workflows/lint.yml | 20 + .../.github/workflows/push_docker.yml | 99 ++ .../.github/workflows/release.yml | 49 + .../.github/workflows/release_please.yml | 44 + .../workflows/release_test_docker_images.yml | 63 ++ .../.github/workflows/shellcheck.yml | 18 + .../.github/workflows/test.yml | 52 ++ .../.github/workflows/test_all.yml | 53 ++ .../.github/workflows/test_github_app.yml | 48 + .../.github/workflows/test_hooks.yml | 29 + .../.github/workflows/test_ssh.yml | 27 + .../.github/workflows/test_ssh_gitlab.yml | 29 + .../.github/workflows/test_steps.yml | 47 + .../actions-template-sync/.gitignore | 6 + .../actions-template-sync/.markdownlintignore | 2 + .../actions-template-sync/.markdownlintrc | 4 + .../actions-template-sync/.templatesyncignore | 8 + .../actions-template-sync/CHANGELOG.md | 267 ++++++ .../actions-template-sync/CITATION.cff | 26 + .../actions-template-sync/Dockerfile | 71 ++ .../actions-template-sync/LICENSE | 21 + .../actions-template-sync/Makefile | 38 + .../actions-template-sync/README.md | 862 ++++++++++++++++++ .../actions-template-sync/action.yml | 137 +++ .../actions-template-sync/docker-compose.yml | 30 + .../docker-test-config.yml | 6 + .../docs/ARCHITECTURE.md | 93 ++ .../actions-template-sync/docs/DOCKER.md | 15 + .../actions-template-sync/docs/README.md | 19 + .../assets/pat_fine_grained_needed_scopes.png | Bin 0 -> 59675 bytes .../assets/pat_needed_access_source_repo.png | Bin 0 -> 42293 bytes .../assets/pat_needed_scopes_source_repo.png | Bin 0 -> 74518 bytes .../assets/pat_needed_scopes_target_repo.png | Bin 0 -> 61030 bytes .../actions-template-sync/mkdocs.yml | 11 + .../actions-template-sync/src/entrypoint.sh | 235 +++++ .../actions-template-sync/src/gpg_no_tty.sh | 9 + .../actions-template-sync/src/sync_common.sh | 79 ++ .../src/sync_template.sh | 607 ++++++++++++ .../actions-template-sync/templatesync.yml | 11 + tools/third_party_sync/repos.lock.json | 10 +- 58 files changed, 4026 insertions(+), 1 deletion(-) create mode 100644 third_party/AndreasAugustin/actions-template-sync/.all-contributorsrc create mode 100644 third_party/AndreasAugustin/actions-template-sync/.devcontainer/devcontainer.json create mode 100644 third_party/AndreasAugustin/actions-template-sync/.devcontainer/docker-compose.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.dockerignore create mode 100644 third_party/AndreasAugustin/actions-template-sync/.editorconfig create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/CODEOWNERS create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/CODE_OF_CONDUCT.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/CONTRIBUTING.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/FUNDING.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/BUG_REPORT.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/DOC_TEMPLATE.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/SECURITY.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/dependabot.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/labeler.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/actions_template_sync.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/gh_pages_mk_docs.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/lint.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/push_docker.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/release.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_please.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_test_docker_images.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/shellcheck.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_all.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_github_app.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_hooks.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh_gitlab.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_steps.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/.gitignore create mode 100644 third_party/AndreasAugustin/actions-template-sync/.markdownlintignore create mode 100644 third_party/AndreasAugustin/actions-template-sync/.markdownlintrc create mode 100644 third_party/AndreasAugustin/actions-template-sync/.templatesyncignore create mode 100644 third_party/AndreasAugustin/actions-template-sync/CHANGELOG.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/CITATION.cff create mode 100644 third_party/AndreasAugustin/actions-template-sync/Dockerfile create mode 100644 third_party/AndreasAugustin/actions-template-sync/LICENSE create mode 100644 third_party/AndreasAugustin/actions-template-sync/Makefile create mode 100644 third_party/AndreasAugustin/actions-template-sync/README.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/action.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/docker-compose.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/docker-test-config.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/ARCHITECTURE.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/DOCKER.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/README.md create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_fine_grained_needed_scopes.png create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_access_source_repo.png create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_scopes_source_repo.png create mode 100644 third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_scopes_target_repo.png create mode 100644 third_party/AndreasAugustin/actions-template-sync/mkdocs.yml create mode 100644 third_party/AndreasAugustin/actions-template-sync/src/entrypoint.sh create mode 100644 third_party/AndreasAugustin/actions-template-sync/src/gpg_no_tty.sh create mode 100644 third_party/AndreasAugustin/actions-template-sync/src/sync_common.sh create mode 100644 third_party/AndreasAugustin/actions-template-sync/src/sync_template.sh create mode 100644 third_party/AndreasAugustin/actions-template-sync/templatesync.yml diff --git a/third_party/AndreasAugustin/actions-template-sync/.all-contributorsrc b/third_party/AndreasAugustin/actions-template-sync/.all-contributorsrc new file mode 100644 index 00000000..cdb0efa4 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.all-contributorsrc @@ -0,0 +1,399 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "AndreasAugustin", + "name": "andy Augustin", + "avatar_url": "https://avatars0.githubusercontent.com/u/8027933?v=4", + "profile": "https://github.com/AndreasAugustin", + "contributions": [ + "doc", + "code", + "review", + "security", + "ideas", + "question", + "example", + "content", + "blog", + "maintenance", + "infra", + "platform", + "test" + ] + }, + { + "login": "pattacini", + "name": "Ugo Pattacini", + "avatar_url": "https://avatars.githubusercontent.com/u/3738070?v=4", + "profile": "https://www.iit.it/people/ugo-pattacini", + "contributions": [ + "doc" + ] + }, + { + "login": "jg-rivera", + "name": "Jose Gabrielle Rivera", + "avatar_url": "https://avatars.githubusercontent.com/u/27613092?v=4", + "profile": "https://github.com/jg-rivera", + "contributions": [ + "code" + ] + }, + { + "login": "pdrittenhouse", + "name": "P.D. Rittenhouse", + "avatar_url": "https://avatars.githubusercontent.com/u/1556730?v=4", + "profile": "http://pdrittenhouse.com", + "contributions": [ + "ideas" + ] + }, + { + "login": "Daniel-Boll", + "name": "Daniel Boll", + "avatar_url": "https://avatars.githubusercontent.com/u/43689101?v=4", + "profile": "https://github.com/Daniel-Boll", + "contributions": [ + "bug" + ] + }, + { + "login": "albertschwarzkopf", + "name": "albertschwarzkopf", + "avatar_url": "https://avatars.githubusercontent.com/u/35684914?v=4", + "profile": "https://github.com/albertschwarzkopf", + "contributions": [ + "ideas" + ] + }, + { + "login": "akulpillai", + "name": "Akul Pillai", + "avatar_url": "https://avatars.githubusercontent.com/u/32793567?v=4", + "profile": "http://akulpillai.com", + "contributions": [ + "security" + ] + }, + { + "login": "steveizzle", + "name": "Stefan Riembauer", + "avatar_url": "https://avatars.githubusercontent.com/u/45331237?v=4", + "profile": "https://github.com/steveizzle", + "contributions": [ + "ideas" + ] + }, + { + "login": "fabriziocacicia", + "name": "Fabrizio Cacicia", + "avatar_url": "https://avatars.githubusercontent.com/u/7525888?v=4", + "profile": "http://fabriziocacicia.com", + "contributions": [ + "security", + "bug" + ] + }, + { + "login": "JTunis", + "name": "Justin Tunis", + "avatar_url": "https://avatars.githubusercontent.com/u/11543636?v=4", + "profile": "https://github.com/JTunis", + "contributions": [ + "ideas", + "code", + "bug" + ] + }, + { + "login": "mikematos84", + "name": "Michael Matos", + "avatar_url": "https://avatars.githubusercontent.com/u/4093433?v=4", + "profile": "https://mikematos84.github.io", + "contributions": [ + "bug" + ] + }, + { + "login": "fatmcgav-depop", + "name": "Gavin Williams", + "avatar_url": "https://avatars.githubusercontent.com/u/109519102?v=4", + "profile": "https://github.com/fatmcgav-depop", + "contributions": [ + "ideas" + ] + }, + { + "login": "msiebeneicher", + "name": "Marc Siebeneicher", + "avatar_url": "https://avatars.githubusercontent.com/u/5821183?v=4", + "profile": "https://github.com/msiebeneicher", + "contributions": [ + "ideas", + "code", + "bug", + "doc" + ] + }, + { + "login": "LuisHenri", + "name": "Luís Henrique A. Schünemann", + "avatar_url": "https://avatars.githubusercontent.com/u/44511825?v=4", + "profile": "https://github.com/LuisHenri", + "contributions": [ + "ideas", + "doc", + "code" + ] + }, + { + "login": "george-gca", + "name": "George", + "avatar_url": "https://avatars.githubusercontent.com/u/31376482?v=4", + "profile": "https://github.com/george-gca", + "contributions": [ + "question", + "doc", + "ideas" + ] + }, + { + "login": "pedrorrivero", + "name": "Pedro Rivero", + "avatar_url": "https://avatars.githubusercontent.com/u/52980156?v=4", + "profile": "http://www.linkedin.com/in/pedrorrivero/", + "contributions": [ + "ideas" + ] + }, + { + "login": "ebronson68", + "name": "Eleanor Bronson", + "avatar_url": "https://avatars.githubusercontent.com/u/111298136?v=4", + "profile": "https://github.com/ebronson68", + "contributions": [ + "ideas" + ] + }, + { + "login": "marvin-belonio", + "name": "Marvin Osswald", + "avatar_url": "https://avatars.githubusercontent.com/u/88089002?v=4", + "profile": "https://github.com/marvin-belonio", + "contributions": [ + "doc" + ] + }, + { + "login": "dotdc", + "name": "David Calvert", + "avatar_url": "https://avatars.githubusercontent.com/u/12827900?v=4", + "profile": "https://github.com/dotdc", + "contributions": [ + "doc", + "bug", + "code", + "maintenance", + "blog" + ] + }, + { + "login": "aairey", + "name": "Andy Airey", + "avatar_url": "https://avatars.githubusercontent.com/u/7644094?v=4", + "profile": "https://blog.airey.be", + "contributions": [ + "bug", + "review" + ] + }, + { + "login": "Fs02", + "name": "Surya Asriadie", + "avatar_url": "https://avatars.githubusercontent.com/u/3049307?v=4", + "profile": "https://fs02.github.io/", + "contributions": [ + "bug" + ] + }, + { + "login": "jellllly420", + "name": "jellllly420", + "avatar_url": "https://avatars.githubusercontent.com/u/64725601?v=4", + "profile": "https://github.com/jellllly420", + "contributions": [ + "ideas", + "question", + "doc" + ] + }, + { + "login": "xontab", + "name": "Shaun Tabone", + "avatar_url": "https://avatars.githubusercontent.com/u/4987684?v=4", + "profile": "http://www.xontab.com", + "contributions": [ + "code" + ] + }, + { + "login": "kevin-aude", + "name": "Kevin AUDE", + "avatar_url": "https://avatars.githubusercontent.com/u/98819045?v=4", + "profile": "https://github.com/kevin-aude", + "contributions": [ + "ideas", + "code" + ] + }, + { + "login": "jnig", + "name": "Jakob", + "avatar_url": "https://avatars.githubusercontent.com/u/3729585?v=4", + "profile": "https://github.com/Jnig", + "contributions": [ + "review" + ] + }, + { + "login": "kdeldycke", + "name": "Kevin Deldycke", + "avatar_url": "https://avatars.githubusercontent.com/u/159718?v=4", + "profile": "https://kevin.deldycke.com", + "contributions": [ + "bug", + "ideas", + "code" + ] + }, + { + "login": "JessicaS11", + "name": "Jessica Scheick", + "avatar_url": "https://avatars.githubusercontent.com/u/11756442?v=4", + "profile": "https://github.com/JessicaS11", + "contributions": [ + "bug" + ] + }, + { + "login": "gasbi", + "name": "Gaspar Melsion", + "avatar_url": "https://avatars.githubusercontent.com/u/10176387?v=4", + "profile": "https://github.com/gasbi", + "contributions": [ + "ideas" + ] + }, + { + "login": "kanno41", + "name": "Ken Harding", + "avatar_url": "https://avatars.githubusercontent.com/u/2818651?v=4", + "profile": "https://github.com/kanno41", + "contributions": [ + "code", + "bug" + ] + }, + { + "login": "JakobHavtorn", + "name": "Jakob Drachmann Havtorn", + "avatar_url": "https://avatars.githubusercontent.com/u/10236734?v=4", + "profile": "https://jakobhavtorn.github.io/", + "contributions": [ + "ideas" + ] + }, + { + "login": "brian6932", + "name": "Brian", + "avatar_url": "https://avatars.githubusercontent.com/u/18603393?v=4", + "profile": "https://github.com/brian6932", + "contributions": [ + "doc" + ] + }, + { + "login": "MuriloChianfa", + "name": "MuriloChianfa", + "avatar_url": "https://avatars.githubusercontent.com/u/60560085?v=4", + "profile": "https://github.com/MuriloChianfa", + "contributions": [ + "doc" + ] + }, + { + "login": "davidsnyder", + "name": "David Snyder", + "avatar_url": "https://avatars.githubusercontent.com/u/229108?v=4", + "profile": "https://github.com/davidsnyder", + "contributions": [ + "research" + ] + }, + { + "login": "TechnicallyJoe", + "name": "Jonathan Østrup", + "avatar_url": "https://avatars.githubusercontent.com/u/7877957?v=4", + "profile": "https://github.com/technicallyjoe", + "contributions": [ + "ideas", + "code" + ] + }, + { + "login": "icco", + "name": "Nat Welch", + "avatar_url": "https://avatars.githubusercontent.com/u/20201?v=4", + "profile": "https://natwelch.com", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "PepijnB", + "name": "Pepijn Boer", + "avatar_url": "https://avatars.githubusercontent.com/u/24453103?v=4", + "profile": "https://github.com/PepijnB", + "contributions": [ + "bug", + "doc" + ] + }, + { + "login": "alexvanderberkel", + "name": "Alex", + "avatar_url": "https://avatars.githubusercontent.com/u/862899?v=4", + "profile": "https://github.com/alexvanderberkel", + "contributions": [ + "code", + "ideas", + "review", + "test" + ] + }, + { + "login": "yuhengshen", + "name": "yuhengshen", + "avatar_url": "https://avatars.githubusercontent.com/u/29867660?v=4", + "profile": "https://github.com/yuhengshen", + "contributions": [ + "bug", + "code" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "actions-template-sync", + "projectOwner": "AndreasAugustin", + "repoType": "github", + "repoHost": "https://github.com", + "skipCi": true, + "commitConvention": "angular", + "commitType": "docs" +} diff --git a/third_party/AndreasAugustin/actions-template-sync/.devcontainer/devcontainer.json b/third_party/AndreasAugustin/actions-template-sync/.devcontainer/devcontainer.json new file mode 100644 index 00000000..f27e7179 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.devcontainer/devcontainer.json @@ -0,0 +1,34 @@ +// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.112.0/containers/docker-existing-docker-compose +// If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml. +{ + "name": "Existing Docker Compose (Extend)", + // Update the 'dockerComposeFile' list if you have more compose files or use different names. + // The .devcontainer/docker-compose.yml file contains any overrides you need/want to make. + "dockerComposeFile": [ + "../docker-compose.yml", + "docker-compose.yml" + ], + // The 'service' property is the name of the service for the container that VS Code should + // use. Update this value and .devcontainer/docker-compose.yml to the real service name. + "service": "dev", + // The optional 'workspaceFolder' property is the path VS Code should open by default when + // connected. This is typically a file mount in .devcontainer/docker-compose.yml + "workspaceFolder": "/workspace", + // Set *default* container specific settings.json values on container create. + "settings": { + "terminal.integrated.shell.linux": "/bin/zsh" + }, + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "DavidAnson.vscode-markdownlint" + ] + // Uncomment the next line if you want start specific services in your Docker Compose config. + // "runServices": [], + // Uncomment the next line if you want to keep your containers running after VS Code shuts down. + // "shutdownAction": "none", + // Uncomment the next line to run commands after the container is created - for example installing git. + // "postCreateCommand": "apt-get update && apt-get install -y git", + // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. + // "remoteUser": "vscode" +} \ No newline at end of file diff --git a/third_party/AndreasAugustin/actions-template-sync/.devcontainer/docker-compose.yml b/third_party/AndreasAugustin/actions-template-sync/.devcontainer/docker-compose.yml new file mode 100644 index 00000000..aa8d45ea --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.devcontainer/docker-compose.yml @@ -0,0 +1,41 @@ +--- +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +services: + # Update this to the name of the service you want to work with in your docker-compose.yml file + dev: + # You may want to add a non-root user to your Dockerfile and uncomment the line below + # to cause all processes to run as this user. Once present, you can also simply + # use the "remoteUser" property in devcontainer.json if you just want VS Code and + # its sub-processes (terminals, tasks, debugging) to execute as the user. On Linux, + # you may need to ensure the UID and GID of the container user you create matches your + # local user. See https://aka.ms/vscode-remote/containers/non-root for details. + # user: vscode + + # Uncomment if you want to add a different Dockerfile in the .devcontainer folder + # build: + # context: . + # dockerfile: Dockerfile + + # Uncomment if you want to expose any additional ports. The snippet below exposes port 3000. + # ports: + # - 3000:3000 + + volumes: + # Update this to wherever you want VS Code to mount the folder of your project + - .:/workspace:cached + + # Uncomment the next line to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-in-docker-compose for details. + # - /var/run/docker.sock:/var/run/docker.sock + + # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust. + # cap_add: + # - SYS_PTRACE + # security_opt: + # - seccomp:unconfined + + # Overrides default command so things don't shut down after the process ends. + command: /bin/sh -c "while sleep 1000; do :; done" diff --git a/third_party/AndreasAugustin/actions-template-sync/.dockerignore b/third_party/AndreasAugustin/actions-template-sync/.dockerignore new file mode 100644 index 00000000..3a42fca5 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.dockerignore @@ -0,0 +1,3 @@ +.github/ +.devcontainer/ +.dependabot/ diff --git a/third_party/AndreasAugustin/actions-template-sync/.editorconfig b/third_party/AndreasAugustin/actions-template-sync/.editorconfig new file mode 100644 index 00000000..0e4fbfb7 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.editorconfig @@ -0,0 +1,29 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true + +[*.md] +indent_style = space +indent_size = 2 +max_line_length = 80 + +[*.{json,yml}] +indent_style = space +indent_size = 2 + +# Tab indentation (no size specified) +[Makefile] +indent_style = tab +indent_size = 4 + +[*.sh] +indent_size = 2 +indent_style = space diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/CODEOWNERS b/third_party/AndreasAugustin/actions-template-sync/.github/CODEOWNERS new file mode 100644 index 00000000..4e341619 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners + +* @AndreasAugustin diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/CODE_OF_CONDUCT.md b/third_party/AndreasAugustin/actions-template-sync/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..76975418 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,77 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at dev@andreas-augustin.org. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][conduct] + +[homepage]: https://www.contributor-covenant.org +[conduct]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +For answers to common questions about this code of conduct, see +[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq) diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/CONTRIBUTING.md b/third_party/AndreasAugustin/actions-template-sync/.github/CONTRIBUTING.md new file mode 100644 index 00000000..f662cc29 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/CONTRIBUTING.md @@ -0,0 +1,58 @@ +# Contributing + +## Branching model + +We use the [GitHub flow](https://guides.github.com/introduction/flow/) + +## Commit messages + +We use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) +Please als add an issue and the issue number as prefix to your commit message header description. + +```bash +git commit -m "[optional scope]: (#ticket_nr) " +``` + +### Emojis + +Feel free to add emojis to your message. + +| Emoji | Raw Emoji Code | Type | Description | +|:--------------------------:|------------------------------|--------------------|-------------| +| :star: | `:star:` | `new` or `feature` | add **new feature** | +| :bug: | `:bug:` | `bug` | fix **bug** issue | +| :ambulance: | `:ambulance:` | `bug` | ciritial hotfix **bug** issue | +| :lock: | `:lock:` | `security` | fix **security** issue | +| :chart_with_upwards_trend: | `:chart_with_upwards_trend:` | `performance` | fix **performance** issue | +| :zap: | `:zap:` | `improvement` | update **backwards-compatible** feature | +| :boom: | `:boom` | `breaking` | update **backwards-incompatible** feature | +| :warning: | `:warning:` | `deprecated` | **deprecate** feature | +| :globe_with_meridians: | `:globe_with_meridians:` | `i18n` | update or fix **internationalization** | +| :wheelchair: | `:wheelchair:` | `a11y` | update or fix **accessibility** | +| :lipstick: | `:lipstick:` | `update` | update **UI/Cosmetic** | +| :up: | `:up:` | `update` | update **other** | +| :rotating_light: | `:rotating_light:` | `refactor` | remove **linter**/strict/deprecation warnings | +| :shirt: | `:shirt:` | `refactor` | **refactoring** or code **layouting** | +| :white_check_mark: | `:white_check_mark:` | `test` | add **tests** | +| :green_heart: | `:green_heart:` | `test` | fix **tests** failur or **CI** building | +| :pencil: | `:pencil:` | `docs` | update **documentation** | +| :copyright: | `:copyright:` | `docs` | decide or change **license** | +| :lollipop: | `:lollipop:` | `example` | for **example** or **demo** codes | +| :arrow_up: | `:arrow_up:` | `dependency` | upgrade **dependencies** | +| :arrow_down: | `:arrow_down:` | `dependency` | downgrade **dependencies** | +| :pushpin: | `:pushpin:` | `dependency` | pin **dependencies** | +| :wrench: | `:wrench:` | `config` | update **configuration** | +| :package: | `:package:` | `build` | **packaging** or **bundling** or **building** | +| :hatching_chick: | `:hatching_chick:` | `release` | **initial** commit | +| :confetti_ball: | `:confetti_ball:` | `release` | release **major** version | +| :tada: | `:tada:` | `release` | release **minor** version | +| :sparkles: | `:sparkles:` | `release` | release **patch** version | +| :rocket: | `:rocket:` | `release` | **deploy** to production enviroment | +| :bookmark: | `:bookmark:` | `release` | **tagged** with version label | +| :back: | `:back:` | `revert` | **revert** commiting | +| :construction: | `:construction:` | `wip` | **WIP** commiting | +| :truck: | `:truck:` | `move` | **move** or **rename** files, repository, ... | +| :twisted_rightwards_arrows:| `:twisted_rightwards_arrows:`| - | merge **conflict resolution** | +| :heavy_plus_sign: | `:heavy_plus_sign:` | - | **add** files, dependencies, ... | +| :heavy_minus_sign: | `:heavy_minus_sign:` | - | **remove** files, dependencies, ... | +| :on: | `:on:` | - | **enable** feature and something ... | diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/FUNDING.yml b/third_party/AndreasAugustin/actions-template-sync/.github/FUNDING.yml new file mode 100644 index 00000000..864e3c56 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [AndreasAugustin] +ko_fi: andreasaugustin diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/BUG_REPORT.yml b/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/BUG_REPORT.yml new file mode 100644 index 00000000..372ca9f5 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/BUG_REPORT.yml @@ -0,0 +1,81 @@ +--- +name: "🐛 Bug Report" +description: File a bug report +title: "[Bug]: " +labels: ["bug"] +assignees: [] +body: + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the bug you encountered. + options: + - label: I have searched the existing issues + required: true + - type: textarea + id: description + attributes: + label: Describe the bug + description: What is the problem? A clear and concise description of the bug. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: | + What did you expect to happen? + validations: + required: true + - type: textarea + id: current + attributes: + label: Current Behavior + description: Describe the behavior + placeholder: |- + In the X repository in Y service I'm encountering Z error. See trace: + + ``` + Please include full errors, uncaught exceptions, stack traces, and + relevant logs. + + If possible enable DEBUG logging by creating a secret named `ACTIONS_STEP_DEBUG` with the value `true` + ``` + validations: + required: true + - type: textarea + attributes: + label: Steps To Reproduce + description: Steps to reproduce the behavior. + placeholder: | + 1. In this environment... + 2. With this config... + 3. Run '...' + 4. See error... + validations: + required: false + - type: textarea + id: solution + attributes: + label: Possible Solution + description: | + Suggest a fix/reason for the bug + validations: + required: false + - type: textarea + id: context + attributes: + label: Additional Information/Context + description: | + Anything else that might be relevant for troubleshooting this bug. + Providing context helps us come up with a solution that is most useful + in the real world. + validations: + required: false + - type: input + id: actions-template-sync-version + attributes: + label: Template sync version Version + description: The template sync version you are running. + validations: + required: true diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/DOC_TEMPLATE.yml b/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/DOC_TEMPLATE.yml new file mode 100644 index 00000000..b1d39083 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/DOC_TEMPLATE.yml @@ -0,0 +1,29 @@ +--- +name: "📕 Documentation Issue" +description: Report an issue in the documentation +title: "[Docs]: " +labels: [docs] +assignees: [] +body: + - type: textarea + id: description + attributes: + label: Describe the documentation issue + description: A clear and concise description of the documentation issue. + validations: + required: true + - type: textarea + id: links + attributes: + label: Links + description: | + Include links to affected documentation page(s). + validations: + required: true + - type: checkboxes + id: ack + attributes: + label: Acknowledgements + options: + - label: I may be able to submit a pull-request to fix this issue. + required: false diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml b/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml new file mode 100644 index 00000000..9d4e600d --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml @@ -0,0 +1,40 @@ +--- +name: 🚀 Feature Request +description: Suggest an idea for this project +title: "[Feat]: " +labels: [feature] +assignees: [] +body: + - type: textarea + id: description + attributes: + label: Describe the feature + description: | + A clear and concise description of the feature you are proposing. + validations: + required: true + - type: textarea + id: use-case + attributes: + label: Use Case + description: | + Why do you need this feature? For example: "I'm always frustrated + when...", "I have a customer that needs..." + validations: + required: true + - type: textarea + id: solution + attributes: + label: Proposed Solution + description: | + Suggest how to implement the addition or change. Please include + prototype/workaround/sketch/reference implementation. + validations: + required: false + - type: checkboxes + id: ack + attributes: + label: Acknowledgements + options: + - label: I may be able to implement this feature request + required: false diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/PULL_REQUEST_TEMPLATE.md b/third_party/AndreasAugustin/actions-template-sync/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..1d9e498a --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +# Description + +Close # + + + +## Remark + +For automation please see [closing-issues-using-keywords]( + https://help.github.com/en/articles/closing-issues-using-keywords) diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/SECURITY.md b/third_party/AndreasAugustin/actions-template-sync/.github/SECURITY.md new file mode 100644 index 00000000..585a96b3 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/SECURITY.md @@ -0,0 +1,8 @@ +# Security Policy + +## Reporting a Vulnerability + +If you find a [security vulnerability advisory](https://github.com/AndreasAugustin/actions-template-sync/security/advisories/new) + +- click issues +- click report a vulnerability diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/dependabot.yml b/third_party/AndreasAugustin/actions-template-sync/.github/dependabot.yml new file mode 100644 index 00000000..61114fa9 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 +updates: +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" +- package-ecosystem: docker + directory: "/" + schedule: + interval: weekly + time: "04:00" + open-pull-requests-limit: 10 diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/labeler.yml b/third_party/AndreasAugustin/actions-template-sync/.github/labeler.yml new file mode 100644 index 00000000..ca008019 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/labeler.yml @@ -0,0 +1,10 @@ +# this file is for the labeler workflow job +# Documentation https://github.com/marketplace/actions/labeler +documentation: + - docs/**/* + - .github/* + - ./*.md + +ci: + - .dependabot/* + - .github/workflows/* diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/actions_template_sync.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/actions_template_sync.yml new file mode 100644 index 00000000..460248ef --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/actions_template_sync.yml @@ -0,0 +1,27 @@ +name: actions-template-sync + +on: + # cronjob trigger At 00:00 on day-of-month 1. https://crontab.guru/every-month + schedule: + - cron: "0 0 1 * *" + # manual trigger + workflow_dispatch: + +jobs: + repo-sync: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + - name: actions-template-sync + uses: AndreasAugustin/actions-template-sync@v2 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + source_repo_path: AndreasAugustin/template + upstream_branch: main # defaults to main + pr_labels: chore,📚 template-sync,example diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/gh_pages_mk_docs.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/gh_pages_mk_docs.yml new file mode 100644 index 00000000..d55e9fc6 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/gh_pages_mk_docs.yml @@ -0,0 +1,19 @@ +name: gh-pages-mk-docs +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: write +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.x + - run: pip install mkdocs-material + - run: mkdocs gh-deploy --force diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/lint.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/lint.yml new file mode 100644 index 00000000..7b0e9a43 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/lint.yml @@ -0,0 +1,20 @@ +name: Lint + +on: + push: + branches: + - "!main" + pull_request: + workflow_call: + workflow_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: markdownlint + run: make markdownlint + - name: prune + run: make prune diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/push_docker.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/push_docker.yml new file mode 100644 index 00000000..4d79a27e --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/push_docker.yml @@ -0,0 +1,99 @@ +name: push-docker + +on: + workflow_call: + inputs: + tag: + description: "The docker image tag" + required: true + type: string + secrets: + DOCKERHUB_USERNAME: + description: "The dockerhub username" + required: true + DOCKERHUB_TOKEN: + description: "The dockerhub token" + required: true + workflow_dispatch: + inputs: + tag: + description: "The docker image tag" + required: true + type: string + +jobs: + build_and_push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + strategy: + matrix: + variant: ["actions-template-sync"] + target: ["prod", "dev"] + + steps: + - name: checkout + uses: actions/checkout@v4 + - name: Login to DockerHub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GHCR + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + andyaugustin/${{ matrix.variant }} + ghcr.io/andreasaugustin/${{ matrix.variant }} + tags: | + type=semver,pattern={{raw}},value=${{ inputs.tag }}${{ matrix.target == 'dev' && '-dev' || '' }} + - name: Build ${{ matrix.variant }} + uses: docker/build-push-action@v6 + with: + context: . + target: ${{ matrix.target }} + load: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + - name: install container test tools + run: | + echo "Install container tools" + curl -LO https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 \ + && chmod +x container-structure-test-linux-amd64 \ + && sudo mv container-structure-test-linux-amd64 /usr/local/bin/container-structure-test + - name: test docker image + run: | + echo "Run tests" + container-structure-test test \ + --image andyaugustin/${{ matrix.variant }}:${{ inputs.tag }}${{ matrix.target == 'dev' && '-dev' || '' }}\ + --config docker-test-config.yml + container-structure-test test \ + --image ghcr.io/andreasaugustin/${{ matrix.variant }}:${{ inputs.tag }}${{ matrix.target == 'dev' && '-dev' || '' }}\ + --config docker-test-config.yml + - name: push ${{ matrix.variant }} + uses: docker/build-push-action@v6 + with: + context: . + target: ${{ matrix.target }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + - name: Docker Hub Description + uses: peter-evans/dockerhub-description@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + repository: andyAugustin/${{ matrix.variant }} + readme-filepath: ./docs/DOCKER.md + short-description: See https://github.com/${{ github.repository }} to have a look into the source code. diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release.yml new file mode 100644 index 00000000..3a2dfcf8 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release.yml @@ -0,0 +1,49 @@ +name: release + +on: + push: + branches: + - main + +jobs: + call_shellcheck: + uses: ./.github/workflows/shellcheck.yml + call_lint: + uses: ./.github/workflows/lint.yml + call_test_all: + uses: ./.github/workflows/test_all.yml + secrets: inherit + permissions: + contents: write + pull-requests: write + call_release_please: + needs: + - call_shellcheck + - call_lint + - call_test_all + permissions: + contents: write + pull-requests: write + uses: ./.github/workflows/release_please.yml + call_push_docker: + if: ${{ needs.call_release_please.outputs.release_created }} + needs: + - call_release_please + permissions: + contents: read + packages: write + uses: ./.github/workflows/push_docker.yml + with: + tag: ${{ needs.call_release_please.outputs.tag_name }} + secrets: inherit + call_release_test_docker_images: + if: ${{ needs.call_release_please.outputs.release_created }} + needs: + - call_push_docker + - call_release_please + permissions: + packages: read + uses: ./.github/workflows/release_test_docker_images.yml + with: + tag: ${{ needs.call_release_please.outputs.tag_name }} + secrets: inherit diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_please.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_please.yml new file mode 100644 index 00000000..64869d9a --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_please.yml @@ -0,0 +1,44 @@ +name: release-please + +on: + workflow_call: + outputs: + release_created: + description: "Set if the release has been created" + value: ${{ jobs.release_please.outputs.release_created }} + tag_name: + description: "The tag name" + value: ${{ jobs.release_please.outputs.tag_name }} + + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + release_please: + runs-on: ubuntu-latest + outputs: + release_created: ${{ steps.release.outputs.release_created }} + tag_name: ${{ steps.release.outputs.tag_name }} + steps: + - uses: googleapis/release-please-action@v4 + id: release + with: + release-type: simple + - uses: actions/checkout@v4 + - name: tag major and minor versions + if: ${{ steps.release.outputs.release_created }} + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + git remote add gh-token "https://${{ secrets.GITHUB_TOKEN }}@github.com/google-github-actions/release-please-action.git" + git tag -d v${{ steps.release.outputs.major }} || true + git tag -d v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true + git push origin :v${{ steps.release.outputs.major }} || true + git push origin :v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true + git tag -a v${{ steps.release.outputs.major }} -m "Release v${{ steps.release.outputs.major }}" + git tag -a v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} -m "Release v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}" + git push origin v${{ steps.release.outputs.major }} + git push origin v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_test_docker_images.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_test_docker_images.yml new file mode 100644 index 00000000..78a1bfa3 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/release_test_docker_images.yml @@ -0,0 +1,63 @@ +name: release-test-docker-images + +on: + workflow_call: + inputs: + tag: + description: "The docker image tag" + required: true + type: string + secrets: + DOCKERHUB_USERNAME: + description: "The dockerhub username" + required: true + DOCKERHUB_TOKEN: + description: "The dockerhub token" + required: true + workflow_dispatch: + inputs: + tag: + description: "The docker image tag" + required: true + type: string + +permissions: + packages: read + +jobs: + test-docker-images: + strategy: + matrix: + docker-image: + - ghcr.io/andreasaugustin/actions-template-sync + - andyaugustin/actions-template-sync + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + lfs: true + fetch-depth: 0 + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: pull image + run: | + docker pull ${{ matrix.docker-image }}:${{ inputs.tag }} + - name: run tests + run: | + echo "Install container tools" + curl -LO https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 \ + && chmod +x container-structure-test-linux-amd64 \ + && sudo mv container-structure-test-linux-amd64 /usr/local/bin/container-structure-test + echo "Run tests" + container-structure-test test \ + --image ${{ matrix.docker-image }}:${{ inputs.tag }} \ + --config docker-test-config.yml diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/shellcheck.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/shellcheck.yml new file mode 100644 index 00000000..ed48cb72 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/shellcheck.yml @@ -0,0 +1,18 @@ +name: shellcheck + +on: + push: + branches: + - "!main" + pull_request: + workflow_call: + workflow_dispatch: + +jobs: + shellcheck: + name: Shellcheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run shellcheck in container + run: make shellcheck diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test.yml new file mode 100644 index 00000000..194c6110 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test.yml @@ -0,0 +1,52 @@ +name: test + +on: + push: + # branches: + # - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + test-implementation-job: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + - name: Test action step + id: test + uses: ./ # Uses an action in the root directory + with: + source_repo_path: AndreasAugustin/template.git + is_dry_run: true + is_force_push_pr: true + - name: print output + env: + FORMER_OUTPUT_PR_BRANCH: ${{ steps.test.outputs.pr_branch }} + run: echo "pr_branch ${FORMER_OUTPUT_PR_BRANCH}" + + test-implementation-job-no-dry-run: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + - name: Test action step + id: test + uses: ./ # Uses an action in the root directory + with: + source_repo_path: AndreasAugustin/template.git + is_dry_run: false + is_force_push_pr: true + - name: print output + env: + FORMER_OUTPUT_PR_BRANCH: ${{ steps.test.outputs.pr_branch }} + run: echo "pr_branch ${FORMER_OUTPUT_PR_BRANCH}" diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_all.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_all.yml new file mode 100644 index 00000000..6ae73535 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_all.yml @@ -0,0 +1,53 @@ +name: test-all + +on: + push: + branches: + - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + call_test_hooks: + uses: ./.github/workflows/test_hooks.yml + secrets: inherit + permissions: + contents: write + pull-requests: write + # call_github_app_test_target_org: + # uses: ./.github/workflows/test_github_app_target_org.yml + # secrets: inherit + # permissions: + # contents: write + # pull-requests: write + # call_github_app_test: + # uses: ./.github/workflows/test_github_app.yml + # secrets: inherit + # permissions: + # contents: write + # pull-requests: write + call_test_ssh_gitlab: + uses: ./.github/workflows/test_ssh_gitlab.yml + secrets: inherit + permissions: + contents: write + pull-requests: write + call_test_ssh: + uses: ./.github/workflows/test_ssh.yml + secrets: inherit + permissions: + contents: write + pull-requests: write + call_test: + uses: ./.github/workflows/test.yml + secrets: inherit + permissions: + contents: write + pull-requests: write + call_test_steps: + uses: ./.github/workflows/test_steps.yml + secrets: inherit + permissions: + contents: write + pull-requests: write diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_github_app.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_github_app.yml new file mode 100644 index 00000000..c3e25692 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_github_app.yml @@ -0,0 +1,48 @@ +name: test-github_app + +on: + push: + # branches: + # - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + test-implementation-job: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: token-generation + uses: actions/create-github-app-token@v2 + id: source-app-token + with: + app-id: ${{ secrets.TEST_GITHUB_APP_ID }} + private-key: ${{ secrets.TEST_APP_PEM_FILE }} + owner: alexvanderberkel + repositories: private-test-repo + + - name: Checkout + # https://github.com/actions/checkout#usage + uses: actions/checkout@v4 + with: + token: ${{ steps.source-app-token.outputs.token }} + persist-credentials: false # Don't set this to true as otherwise the token will be stored in the local git config and the run will fail + + - name: Test action step + uses: ./ # Uses an action in the root directory + env: + MY_VAR: "bar" + with: + source_repo_path: alexvanderberkel/private-test-repo + source_gh_token: ${{ steps.source-app-token.outputs.token }} + # target_gh_token: ${{ github.token }} + upstream_branch: main + is_dry_run: false + is_allow_hooks: true + + + diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_hooks.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_hooks.yml new file mode 100644 index 00000000..f1b13033 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_hooks.yml @@ -0,0 +1,29 @@ +name: test-hooks + +on: + push: + # branches: + # - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + test-implementation-job: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + - name: Test action step + uses: ./ # Uses an action in the root directory + env: + MY_VAR: "bar" + with: + source_repo_path: AndreasAugustin/template.git + upstream_branch: main + is_dry_run: true + is_allow_hooks: true diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh.yml new file mode 100644 index 00000000..09406f17 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh.yml @@ -0,0 +1,27 @@ +name: test-ssh + +on: + push: + # branches: + # - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + test-implementation-job: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + - name: Test action step ssh + if: github.repository_owner == 'AndreasAugustin' + uses: ./ # Uses an action in the root directory + with: + source_repo_path: ${{ secrets.SOURCE_REPO_PATH_TEST }} # , should be within secrets + source_repo_ssh_private_key: ${{ secrets.SOURCE_REPO_SSH_PRIVATE_KEY }} # contains the private ssh key of the private repository + is_dry_run: true diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh_gitlab.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh_gitlab.yml new file mode 100644 index 00000000..a78ef422 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_ssh_gitlab.yml @@ -0,0 +1,29 @@ +name: test-ssh-gitlab + +on: + push: + # branches: + # - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + test-implementation-job: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + - name: Test action step ssh + if: github.repository_owner == 'AndreasAugustin' + uses: ./ # Uses an action in the root directory + with: + hostname: ${{ secrets.SOURCE_REPO_GITLAB_HOSTNAME }} + source_repo_path: ${{ secrets.SOURCE_REPO_GITLAB_PATH }} # , should be within secrets + source_repo_ssh_private_key: ${{ secrets.SOURCE_REPO_GITLAB_SSH_PRIVATE_KEY }} # contains the private ssh key of the private repository + is_dry_run: true + is_not_source_github: true diff --git a/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_steps.yml b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_steps.yml new file mode 100644 index 00000000..8a219ed3 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.github/workflows/test_steps.yml @@ -0,0 +1,47 @@ +name: test-steps + +on: + push: + # branches: + # - "!main" + # pull_request: + workflow_call: + workflow_dispatch: + +jobs: + test-implementation-job: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + + - name: Test action step first steps + uses: ./ # Uses an action in the root directory + with: + source_repo_path: AndreasAugustin/template.git + is_dry_run: true + is_force_push_pr: true + steps: "prechecks,pull" + + - name: in between step + run: | + echo "I can do whatever I want" + git status + + - name: Test action step next steps + uses: ./ # Uses an action in the root directory + id: test + with: + source_repo_path: AndreasAugustin/template.git + is_dry_run: true + is_force_push_pr: true + steps: "commit,push,pr" + + - name: print output + env: + FORMER_OUTPUT_PR_BRANCH: ${{ steps.test.outputs.pr_branch }} + run: echo "pr_branch ${FORMER_OUTPUT_PR_BRANCH}" diff --git a/third_party/AndreasAugustin/actions-template-sync/.gitignore b/third_party/AndreasAugustin/actions-template-sync/.gitignore new file mode 100644 index 00000000..c38c8c29 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.gitignore @@ -0,0 +1,6 @@ +.env +tmp* +TODO.md + +.venv/ + diff --git a/third_party/AndreasAugustin/actions-template-sync/.markdownlintignore b/third_party/AndreasAugustin/actions-template-sync/.markdownlintignore new file mode 100644 index 00000000..2468c074 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.markdownlintignore @@ -0,0 +1,2 @@ +node_modules/ +CHANGELOG.md diff --git a/third_party/AndreasAugustin/actions-template-sync/.markdownlintrc b/third_party/AndreasAugustin/actions-template-sync/.markdownlintrc new file mode 100644 index 00000000..876c16c4 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.markdownlintrc @@ -0,0 +1,4 @@ +{ + "default": true, + "MD013": { "line_length": 150, "tables": false } +} diff --git a/third_party/AndreasAugustin/actions-template-sync/.templatesyncignore b/third_party/AndreasAugustin/actions-template-sync/.templatesyncignore new file mode 100644 index 00000000..005f3ecc --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/.templatesyncignore @@ -0,0 +1,8 @@ +.all-contributorsrc +.github/dependabot.yml +README.md +Dockerfile +SECURITY.md +docker-compose.yml +Makefile +.github/workflows/* diff --git a/third_party/AndreasAugustin/actions-template-sync/CHANGELOG.md b/third_party/AndreasAugustin/actions-template-sync/CHANGELOG.md new file mode 100644 index 00000000..ec918891 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/CHANGELOG.md @@ -0,0 +1,267 @@ +# Changelog + +## [2.5.2](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.5.1...v2.5.2) (2025-07-16) + + +### Bug Fixes + +* **docs:** new markdownlint issue ([47e25cf](https://github.com/AndreasAugustin/actions-template-sync/commit/47e25cfd55b45f0ba5ef2f7bef611dfac766cdeb)) + +## [2.5.1](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.5.0...v2.5.1) (2025-02-17) + + +### Bug Fixes + +* **#608:** workaround ([#614](https://github.com/AndreasAugustin/actions-template-sync/issues/614)) ([fffd6ca](https://github.com/AndreasAugustin/actions-template-sync/commit/fffd6caf36570bf6f2099defe545cc8d4b9c625e)) + +## [2.5.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.4.2...v2.5.0) (2025-01-31) + + +### Features + +* **#598:** enable possibility to have source repository in other organisation ([3247499](https://github.com/AndreasAugustin/actions-template-sync/commit/32474992795a695d4a42779a591f418e9175e665)) + +## [2.4.2](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.4.1...v2.4.2) (2025-01-07) + + +### Bug Fixes + +* **#551:** fix issue with file deletion ([#596](https://github.com/AndreasAugustin/actions-template-sync/issues/596)) ([1641155](https://github.com/AndreasAugustin/actions-template-sync/commit/164115568a2f8a4ea67dda06f786a9c90624971d)) +* **#591:** add missing gh cli precheck ([#594](https://github.com/AndreasAugustin/actions-template-sync/issues/594)) ([574812a](https://github.com/AndreasAugustin/actions-template-sync/commit/574812a4ea91dcaa3ffe39ace616fd329b209e43)) + +## [2.4.1](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.4.0...v2.4.1) (2024-10-15) + + +### Bug Fixes + +* incorrect argument passing to git push ([#574](https://github.com/AndreasAugustin/actions-template-sync/issues/574)) ([44e59ba](https://github.com/AndreasAugustin/actions-template-sync/commit/44e59ba38bf03b73ddf96462365826b01cf7f1b8)) + +## [2.4.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.3.0...v2.4.0) (2024-10-15) + + +### Features + +* **#567:** Add the name of the .templatesyncignore file as a parameter ([#568](https://github.com/AndreasAugustin/actions-template-sync/issues/568)) ([03661a8](https://github.com/AndreasAugustin/actions-template-sync/commit/03661a8560de11c0fb0203642f69799f481286bd)) + +## [2.3.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.2.3...v2.3.0) (2024-10-14) + + +### Features + +* **#547:** :sparkles: add option to include git tags ([#561](https://github.com/AndreasAugustin/actions-template-sync/issues/561)) ([01f7623](https://github.com/AndreasAugustin/actions-template-sync/commit/01f7623dbfc8f73ccaf1635d64cb629a699acc9a)) + +## [2.2.3](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.2.2...v2.2.3) (2024-06-19) + + +### Bug Fixes + +* **#536:** :bug: issue with comments within .templatesyncignore ([#538](https://github.com/AndreasAugustin/actions-template-sync/issues/538)) ([aba0971](https://github.com/AndreasAugustin/actions-template-sync/commit/aba0971640d113cd858cfbb6b9eb2f4c2de09049)) + +## [2.2.2](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.2.1...v2.2.2) (2024-06-16) + + +### Bug Fixes + +* **#529:** :bug: edge case with branch cleanup and force push ([#534](https://github.com/AndreasAugustin/actions-template-sync/issues/534)) ([ab9498f](https://github.com/AndreasAugustin/actions-template-sync/commit/ab9498f63d0cf03e677228c6a2f6828adf8b4662)) + +## [2.2.1](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.2.0...v2.2.1) (2024-06-06) + + +### Bug Fixes + +* **#528:** :memo: small docs update ([4eb71ce](https://github.com/AndreasAugustin/actions-template-sync/commit/4eb71ce2acda4476ed387a8b42cd94846ca8474e)) + +## [2.2.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.1.0...v2.2.0) (2024-05-27) + + +### Features + +* **#523:** :sparkles: delete branches on pr cleanup ([#525](https://github.com/AndreasAugustin/actions-template-sync/issues/525)) ([d957348](https://github.com/AndreasAugustin/actions-template-sync/commit/d9573484779def3582a6d442502aaa69eaf674e9)) + +## [2.1.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.0.2...v2.1.0) (2024-04-23) + + +### Features + +* **#478:** :sparkles: possible to execute single steps ([#516](https://github.com/AndreasAugustin/actions-template-sync/issues/516)) ([6b9bd88](https://github.com/AndreasAugustin/actions-template-sync/commit/6b9bd8844d2a75ecf2f4d2688b7f847fd86cffa3)) + +## [2.0.2](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.0.1...v2.0.2) (2024-03-28) + + +### Bug Fixes + +* **#510:** :bug: issue with blank lines within .templatesyncignore ([#512](https://github.com/AndreasAugustin/actions-template-sync/issues/512)) ([814f456](https://github.com/AndreasAugustin/actions-template-sync/commit/814f4564aa1ce6d354dcf48a34ea5b7a670327a5)) + +## [2.0.1](https://github.com/AndreasAugustin/actions-template-sync/compare/v2.0.0...v2.0.1) (2024-03-18) + + +### Bug Fixes + +* **#507:** :bug: pr title and body internal variable substitution ([#508](https://github.com/AndreasAugustin/actions-template-sync/issues/508)) ([912b4e0](https://github.com/AndreasAugustin/actions-template-sync/commit/912b4e01a39729b00a1f928303f864294d6cbede)) + +## [2.0.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.12.0...v2.0.0) (2024-03-13) + + +### ⚠ BREAKING CHANGES + +* :sparkles: migrate from docker action to composite action ([#498](https://github.com/AndreasAugustin/actions-template-sync/issues/498)) + +### Features + +* :sparkles: migrate from docker action to composite action ([#498](https://github.com/AndreasAugustin/actions-template-sync/issues/498)) ([29d0434](https://github.com/AndreasAugustin/actions-template-sync/commit/29d04342d0bd6047538dd7f52a7e64a8ca2d4baa)) + +## [1.12.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.11.0...v1.12.0) (2024-03-13) + + +### Features + +* **#482:** :sparkles: add option to force push and pr ([#499](https://github.com/AndreasAugustin/actions-template-sync/issues/499)) ([cbef7ee](https://github.com/AndreasAugustin/actions-template-sync/commit/cbef7ee63378db46e59d89a09c055376dccf4817)) + +## [1.11.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.10.0...v1.11.0) (2024-03-11) + + +### Features + +* :sparkles: gpg sign with passphrase ([#460](https://github.com/AndreasAugustin/actions-template-sync/issues/460)) ([cec582e](https://github.com/AndreasAugustin/actions-template-sync/commit/cec582ee2fc98db86d2cb5335a33a2fdaa59f418)) + +## [1.10.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.9.0...v1.10.0) (2024-03-05) + + +### Features + +* **#467:** :sparkles: hooks now within action inputs ([#489](https://github.com/AndreasAugustin/actions-template-sync/issues/489)) ([0e55c08](https://github.com/AndreasAugustin/actions-template-sync/commit/0e55c08f95f9a83c60f809fa6b49785187ec7623)) + +## [1.9.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.8.1...v1.9.0) (2024-03-05) + + +### Features + +* :sparkles: Set token to the default provided by GitHub workflow ([#483](https://github.com/AndreasAugustin/actions-template-sync/issues/483)) ([c1e7561](https://github.com/AndreasAugustin/actions-template-sync/commit/c1e756148de0343df66fda1a2380382ef06c16d7)) +* **#477:** :sparkles: add input parameter for pr body ([#488](https://github.com/AndreasAugustin/actions-template-sync/issues/488)) ([481cc21](https://github.com/AndreasAugustin/actions-template-sync/commit/481cc21550d858dfc12c49f4dfb7605ac744a091)) + +## [1.8.1](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.8.0...v1.8.1) (2024-03-02) + + +### Bug Fixes + +* **#476:** :bug: output variable edge cases ([#479](https://github.com/AndreasAugustin/actions-template-sync/issues/479)) ([ab4153b](https://github.com/AndreasAugustin/actions-template-sync/commit/ab4153bb937a2d7ad996f0693977cb943443e8b3)) + +## [1.8.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.7.0...v1.8.0) (2024-02-29) + + +### Features + +* **#472:** :sparkles: define output ([#473](https://github.com/AndreasAugustin/actions-template-sync/issues/473)) ([a19cd8d](https://github.com/AndreasAugustin/actions-template-sync/commit/a19cd8d7c999cdf9bdc2a08818eb2878d1222cdf)) + +## [1.7.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.6.2...v1.7.0) (2024-02-29) + + +### Features + +* **#468:** :sparkles: enable usage of github env variables within hooks ([#469](https://github.com/AndreasAugustin/actions-template-sync/issues/469)) ([17d4603](https://github.com/AndreasAugustin/actions-template-sync/commit/17d4603da56b49e4b72c6531ba6d2db6dbcc3a31)) + +## [1.6.2](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.6.1...v1.6.2) (2024-02-25) + + +### Bug Fixes + +* :bug: try catch for edge cases ([#465](https://github.com/AndreasAugustin/actions-template-sync/issues/465)) ([95ce4e4](https://github.com/AndreasAugustin/actions-template-sync/commit/95ce4e4d5cc72b62970056977256a6592a10547c)) + +## [1.6.1](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.6.0...v1.6.1) (2024-02-25) + + +### Bug Fixes + +* **#461:** :bug: issue with pull request labels with emoji and space ([#462](https://github.com/AndreasAugustin/actions-template-sync/issues/462)) ([89b8d21](https://github.com/AndreasAugustin/actions-template-sync/commit/89b8d210b8454957a81dbbf5b81e6977708a25cd)) + +## [1.6.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.5.0...v1.6.0) (2024-02-22) + + +### Features + +* :sparkles: ([#204](https://github.com/AndreasAugustin/actions-template-sync/issues/204)) gpg sign ([#436](https://github.com/AndreasAugustin/actions-template-sync/issues/436)) ([99aefe5](https://github.com/AndreasAugustin/actions-template-sync/commit/99aefe5830f9ee249bbfbd90a85108f76e897c33)) + +## [1.5.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.4.0...v1.5.0) (2024-02-04) + + +### Features + +* :sparkles: ([#401](https://github.com/AndreasAugustin/actions-template-sync/issues/401)) add option to force file deletion ([#435](https://github.com/AndreasAugustin/actions-template-sync/issues/435)) ([e68941f](https://github.com/AndreasAugustin/actions-template-sync/commit/e68941ff0fc9695be3fe480ab739ebeb318dca0d)) + +## [1.4.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.3.0...v1.4.0) (2024-01-25) + + +### Features + +* allow for pruning of older PRs ([#438](https://github.com/AndreasAugustin/actions-template-sync/issues/438)) ([0e51714](https://github.com/AndreasAugustin/actions-template-sync/commit/0e51714bd42e4ce8223a641d7435c220a99aad51)) + +## [1.3.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.2.0...v1.3.0) (2024-01-18) + + +### Features + +* **hooks:** added precommit hook ([#439](https://github.com/AndreasAugustin/actions-template-sync/issues/439)) ([4a42410](https://github.com/AndreasAugustin/actions-template-sync/commit/4a42410a3c63b359844b20860359bc2f8ab4e6fa)) + +## [1.2.0](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.9...v1.2.0) (2024-01-06) + + +### Features + +* :construction_worker: ([#432](https://github.com/AndreasAugustin/actions-template-sync/issues/432)) support major/minor tags ([#433](https://github.com/AndreasAugustin/actions-template-sync/issues/433)) ([eb942cf](https://github.com/AndreasAugustin/actions-template-sync/commit/eb942cf9366ff4cfbcb6860f9392db555a4e5c11)) + +## [1.1.9](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.8...v1.1.9) (2023-12-30) + + +### Bug Fixes + +* github pat in documentation examples ([#423](https://github.com/AndreasAugustin/actions-template-sync/issues/423)) ([aea6128](https://github.com/AndreasAugustin/actions-template-sync/commit/aea6128ca5ae7e21f7ba687ead3f56326cce1b76)) + +## [1.1.8](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.7...v1.1.8) (2023-09-24) + + +### Bug Fixes + +* **ci:** :bug: issues within ci ([2793a56](https://github.com/AndreasAugustin/actions-template-sync/commit/2793a56cecdd0000c25e0a81972d78a45fbb4d97)) + +## [1.1.7](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.6...v1.1.7) (2023-09-24) + + +### Bug Fixes + +* **ci:** :bug: ([#388](https://github.com/AndreasAugustin/actions-template-sync/issues/388)) issues within ci ([8649015](https://github.com/AndreasAugustin/actions-template-sync/commit/8649015f18ab9855f8d3b93c50d67444438bb14f)) + +## [1.1.6](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.5...v1.1.6) (2023-09-24) + + +### Bug Fixes + +* **ci:** :bug: ([#388](https://github.com/AndreasAugustin/actions-template-sync/issues/388)) issues within ci ([dd57314](https://github.com/AndreasAugustin/actions-template-sync/commit/dd573140ec37a0e41ff179af7d9954a049c9eb93)) + +## [1.1.5](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.4...v1.1.5) (2023-09-24) + + +### Bug Fixes + +* **ci:** :bug: ([#388](https://github.com/AndreasAugustin/actions-template-sync/issues/388)) issues within ci ([e063b29](https://github.com/AndreasAugustin/actions-template-sync/commit/e063b29c03ebb93b4185b752f4d8dc61db3605df)) +* **ci:** :bug: ([#387](https://github.com/AndreasAugustin/actions-template-sync/issues/387)) issue with docker push ([#392](https://github.com/AndreasAugustin/actions-template-sync/issues/392)) ([a94785c](https://github.com/AndreasAugustin/actions-template-sync/commit/a94785c1d4150fac0168410757004e83f638caf1)) + +## [1.1.4](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.3...v1.1.4) (2023-09-24) + + +### Bug Fixes + +* **docs:** :bug: ([#387](https://github.com/AndreasAugustin/actions-template-sync/issues/387)) fix missing documentation about .templatesyncignore paths ([3130f5b](https://github.com/AndreasAugustin/actions-template-sync/commit/3130f5bc62a6f98ece2c209994283520fe3ca811)) + +## [1.1.3](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.2...v1.1.3) (2023-09-16) + + +### Bug Fixes + +* :bug: ([#380](https://github.com/AndreasAugustin/actions-template-sync/issues/380)) small fix related to remote file mode changes ([#383](https://github.com/AndreasAugustin/actions-template-sync/issues/383)) ([ff25f8c](https://github.com/AndreasAugustin/actions-template-sync/commit/ff25f8cbcd237716eeff23dc5616632c7663e99f)) + +## [1.1.2](https://github.com/AndreasAugustin/actions-template-sync/compare/v1.1.1...v1.1.2) (2023-09-03) + + +### Bug Fixes + +* :bug: ([#375](https://github.com/AndreasAugustin/actions-template-sync/issues/375)) fix edge case with .templatesyncignore ([#378](https://github.com/AndreasAugustin/actions-template-sync/issues/378)) ([1eede30](https://github.com/AndreasAugustin/actions-template-sync/commit/1eede30772357d6984d1757753a672da4119d356)) diff --git a/third_party/AndreasAugustin/actions-template-sync/CITATION.cff b/third_party/AndreasAugustin/actions-template-sync/CITATION.cff new file mode 100644 index 00000000..2c6dc413 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/CITATION.cff @@ -0,0 +1,26 @@ +# This CITATION.cff file was generated with cffinit. +# Visit https://bit.ly/cffinit to generate yours today! + +cff-version: 1.2.0 +title: github-action-template-sync +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: Andreas + family-names: Augustin + orcid: 'https://orcid.org/0009-0003-8658-2370' +repository-code: 'https://github.com/AndreasAugustin/actions-template-sync' +url: 'https://andreasaugustin.github.io/actions-template-sync/' +abstract: >- + Synchronise git repositories in an automated manner. + Different git providers like GitHub (enterprise), + GitLab,.. are supported as the source provider. This can + help you e.g. for migration from another git provider to + GitHub or if you want to mirror git repositories. +keywords: + - github + - repo-sync +license: MIT +version: v0.8.0 diff --git a/third_party/AndreasAugustin/actions-template-sync/Dockerfile b/third_party/AndreasAugustin/actions-template-sync/Dockerfile new file mode 100644 index 00000000..79c5e571 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/Dockerfile @@ -0,0 +1,71 @@ +######################################## +# prod image +####################################### +FROM alpine:3.22.0 AS prod + +ARG GH_CLI_VER=2.44.1 + +# TODO(anau) change user +ARG GITHUB_URL="https://github.com/AndreasAugustin/actions-template-sync" + +# https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys +LABEL org.opencontainers.image.url="${GITHUB_URL}" +LABEL org.opencontainers.image.documentation="${GITHUB_URL}/README.md" +LABEL org.opencontainers.image.source="${GITHUB_URL}" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.authors="andyAugustin" +LABEL org.opencontainers.image.title="actions-template-sync image" +LABEL org.opencontainers.image.description="contains actions-template-sync" + +# install packages +RUN apk add --update --no-cache bash git curl musl openssh git-lfs yq gnupg + +RUN wget https://github.com/cli/cli/releases/download/v${GH_CLI_VER}/gh_${GH_CLI_VER}_linux_386.tar.gz -O ghcli.tar.gz +RUN tar --strip-components=1 -xf ghcli.tar.gz + +ADD src/*.sh /bin/ +RUN chmod +x /bin/entrypoint.sh \ + && chmod +x /bin/sync_template.sh \ + && chmod +x /bin/sync_common.sh \ + && chmod +x /bin/gpg_no_tty.sh + +RUN mkdir -p /root/.ssh \ + && ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts + +ENTRYPOINT ["/bin/bash", "/bin/entrypoint.sh"] +####################################### +# image for dev build environment +###################################### +FROM prod AS dev + +# install packages +RUN apk add --update --no-cache make zsh tmux vim tig + +# Make zsh your default shell for tmux +RUN echo "set-option -g default-shell /bin/zsh" >> /root/.tmux.conf + +# install oh-my-zsh +RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" + +WORKDIR /app + +ENTRYPOINT ["/bin/zsh"] + +####################################### +# image for creating the documentation +###################################### +FROM node:24.4.0-alpine AS docs + +# install packages +RUN apk add --update --no-cache bash make git zsh curl tmux + +# Make zsh your default shell for tmux +RUN echo "set-option -g default-shell /bin/zsh" >> /root/.tmux.conf + +# install oh-my-zsh +RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" + +# install quality gate +RUN npm install -g markdownlint-cli + +WORKDIR /app diff --git a/third_party/AndreasAugustin/actions-template-sync/LICENSE b/third_party/AndreasAugustin/actions-template-sync/LICENSE new file mode 100644 index 00000000..325b8d7d --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 andy Augustin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/AndreasAugustin/actions-template-sync/Makefile b/third_party/AndreasAugustin/actions-template-sync/Makefile new file mode 100644 index 00000000..6a91414c --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/Makefile @@ -0,0 +1,38 @@ +SHELL := /bin/bash +.DEFAULT_GOAL := help + +########################### +# VARIABLES +########################### + +########################### +# MAPPINGS +########################### + +########################### +# TARGETS +########################### + +.PHONY: help +help: ## help target to show available commands with information + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: markdownlint +markdownlint: ## Validate markdown files + docker compose run docs markdownlint . + +.PHONY: zsh +zsh: ## open dev container with build environment + docker compose run --service-ports dev + +.PHONY: prod +prod: ## run the prod docker image with bash + docker compose run prod + +.PHONY: prune +prune: ## delete the whole environment + docker compose down -v --rmi all --remove-orphans + +.Phony: shellcheck +shellcheck: ## run shellcheck + docker compose run shellcheck -x src/*.sh diff --git a/third_party/AndreasAugustin/actions-template-sync/README.md b/third_party/AndreasAugustin/actions-template-sync/README.md new file mode 100644 index 00000000..80c80048 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/README.md @@ -0,0 +1,862 @@ +# actions-template-sync + +[![All Contributors](https://img.shields.io/badge/all_contributors-38-orange.svg?style=flat-square)](#contributors-) + + + [![actions-template-sync](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/actions_template_sync.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/actions_template_sync.yml) + +[![Lint](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/lint.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/lint.yml) + +[![shellcheck](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/shellcheck.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/shellcheck.yml) + +[![test](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test.yml) + +[![test-hooks](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test_hooks.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test_hooks.yml) + +[![test-ssh](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test_ssh.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test_ssh.yml) + +[![test-ssh-gitlab](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test_ssh_gitlab.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/test_ssh_gitlab.yml) + +[![push-docker](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/push_docker.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/push_docker.yml) + +[![gh-pages-mk-docs](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/gh_pages_mk_docs.yml/badge.svg)](https://github.com/AndreasAugustin/actions-template-sync/actions/workflows/gh_pages_mk_docs.yml) + +## abstract + +Synchronise git repositories in an automated manner. Different git providers like GitHub (enterprise), GitLab,.. are supported as the source provider. +This can help you e.g. for migration from another git provider to GitHub or if you want to mirror git repositories. + +### History + +It is possible to create repositories within Github with +[GitHub templates](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository). +This is a nice approach to have some boilerplate within your repository. +Over time, the template repository will get some code changes. +The problem is that the already created repositories won't know about those changes. +This GitHub action will help you to keep track of the template changes. +The initial author of this repository faced that issue several times and decided to write a GitHub action to face that issue. +Because of the nice community, several feature requests helped to go on with the development of the action. Now several other features are supported. + +## Features + +This action is creating a pull request with the latest changes within the target repo whenever it runs with following exceptions + +* there is already an open PR created with the latest changes of the source repository. + * if there are new changes and a PR is already open, a new PR will be created (option to clean up older PRs) +* related new changes are ignored within the `.templatesyncignore` file +* the source repository is fully included within the target repository + +```mermaid +flowchart LR + github_source("fa:fa-github GitHub source repository [private|public]") + gitlab_source("fa:fa-gitlab GitLab source repository [private|public]") + any_source("fa:fa-git Any git provider [private|public]") + github_target{{"fa:fa-github GitHub target repository [private|public]"}} + github_source --> |"ssh | PAT | github app"| github_target + gitlab_source --> |"ssh"| github_target + any_source --> |"ssh"| github_target +``` + +* Sync other public or private repository (e.g. template repositories) with the current repository +* Ignore files and folders from syncing using a `.templatesyncignore` file +* many configuration options +* different lifecycle hooks are supported. This opens the possibility to inject custom code into the workflow with a yaml definition file. +* different git provider like GitLab, Gittea,.. as source are supported (with ssh). + See [.github/workflows/test_ssh_gitlab.yml](.github/workflows/test_ssh_gitlab.yml) for an example. +* It is not necessarily needed that source and target repository have the same base history. + Because of that reason, it is possible to merge 2 totally different repositories with the help of the action. + +## Usage + +Usage changes depending on whether the template repository is public or private, regardless of the visibility of the current repository. + +### Public template repository + +Add this configuration to a GitHub action in the current repository: + +```yaml +# File: .github/workflows/template-sync.yml + +on: + # cronjob trigger + schedule: + - cron: "0 0 1 * *" + # manual trigger + workflow_dispatch: +jobs: + repo-sync: + runs-on: ubuntu-latest + # https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs + permissions: + contents: write + pull-requests: write + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + # https://github.com/actions/checkout#usage + # uncomment if you use submodules within the repository + # with: + # submodules: true + + - name: actions-template-sync + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_repo_path: + upstream_branch: # defaults to main + pr_labels: ,[,...] # defaults to template_sync +``` + +You will receive a pull request within your repository if there are some changes available in the template. + +### Private template repository + +If your current repository was created from a private template, there are several possibilities. + +#### 1. Using a GitHub app + +You can create and use a [GitHub App][github-app] to handle access to the private template repository. +To generate a token for your app you can use a separate action like [tibdex/github-app-token][github-app-token]. +You have to set up the checkout step with the generated token as well. + +```yaml +jobs: + repo-sync: + runs-on: ubuntu-latest + + steps: + - name: Generate token to read from source repo # see: https://github.com/tibdex/github-app-token + id: generate_token + # https://github.com/tibdex/github-app-token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} + + - name: Checkout + # https://github.com/actions/checkout#usage + uses: actions/checkout@v4 + with: + # submodules: true + token: ${{ steps.generate_token.outputs.token }} + + - name: actions-template-sync + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_gh_token: ${{ steps.generate_token.outputs.token }} + source_repo_path: + upstream_branch: # defaults to main + pr_labels: ,[,...] # defaults to template_sync +``` + +#### 2. Using SSH + +You have various options to use ssh keys with GitHub. +An example is [deployment keys][deployment-keys]. For our use case, write permissions are not needed. +Within the current repository, where the GitHub action is enabled, add a secret +(e.q. `SOURCE_REPO_SSH_PRIVATE_KEY`) with the content of your private SSH key. +Make sure that the read permissions of that secret fulfill your use case. +Set the optional `source_repo_ssh_private_key` input parameter. +It is also possible to use a different git provider, e.g. GitLab. + +```yaml +jobs: + repo-sync: + runs-on: ubuntu-latest + # https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs + permissions: + contents: write + pull-requests: write + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + # https://github.com/actions/checkout#usage + uses: actions/checkout@v4 + with: + # submodules: true + token: ${{ secrets.GITHUB_TOKEN }} + + - name: actions-template-sync + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_gh_token: ${{ secrets.GITHUB_TOKEN }} + source_repo_path: ${{ secrets.SOURCE_REPO_PATH }} # , should be within secrets + upstream_branch: ${{ secrets.TARGET_BRANCH }} # # defaults to main + pr_labels: ,[,...] # defaults to template_sync + source_repo_ssh_private_key: ${{ secrets.SOURCE_REPO_SSH_PRIVATE_KEY }} # contains the private ssh key of the private repository +``` + +#### 3. Using a PAT + +:warning: when the source repository is private using PATs, also the target repository must be private. +Else it won't work. + +[Personal access token][github-pat] is an alternative to using passwords for authentication to GitHub. +You can add a kind of password to your GitHub account. The PAT needs a scope. +We need different scopes for the source and target repo. + +##### a. Source repo + +The workflow needs read access to the source repo. + +You need to set the scopes to read the source repo. + +###### Fine grained source repo + +* `contents` -> read +* `metadata` -> read + +###### Classic source repo + +* `repo` -> all +* `read:org` + +![pat-scopes](docs/assets/pat_needed_scopes_source_repo.png) + +###### General source repo + +Furthermore, you need to set the access within the source repository to allow GitHub actions within the target repository. +As mentioned before (you can see the note in the image) you need to set the target repository to private. +settings -> actions -> general. + +![pat-source-repo-access](docs/assets/pat_needed_access_source_repo.png) + +##### b. Target repo + +###### Fine grained target repo + +* `contents` -> write +* `metadata` -> read +* `pull requests` -> write + +If you are automatically adding reviewers you also need + +* `organisation:members` read permissions to the PAT token. + +![pat-scopes-fine-grained](docs/assets/pat_fine_grained_needed_scopes.png) + +###### Classic target repo + +When the action detects any changes, it will create a new branch and will push the updates to this branch. +When no files are changed in the `.github/workflows` directory, this works well with the default `${{ github.token }}` token. +This token does however not have `workflow` scope and can therefore not make any changes to these files. +For this purpose a token must be created with the following scope as depicted in the figure below. + +* `workflow` -> will also enable `repo` +* `admin:read` + ![pat-scopes](docs/assets/pat_needed_scopes_target_repo.png) + +example workflow definition +:warning: to the checkout action you need to add the parameter `persist-credentials: false` or you will most likely face an issue (#557 #627) + +```yml +name: actions-template-sync + +on: + # cronjob trigger At 00:00 on day-of-month 1. https://crontab.guru/every-month + schedule: + - cron: "0 0 1 * *" + # manual trigger + workflow_dispatch: + +jobs: + test-implementation-job: + + runs-on: ubuntu-latest + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + with: + # submodules: true + token: ${{ secrets.CUSTOM_GITHUB_PAT }} + persist-credentials: false # needed see #557 and #627 + + - name: Test action step PAT + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_gh_token: ${{ secrets.CUSTOM_GITHUB_PAT }} + source_repo_path: ${{ secrets.SOURCE_REPO_PATH }} # , should be within secrets +``` + +### Action Inputs + +| Variable | Description | Required | Default | +|-----------------------------|---------------------------------------------------------------------------------------------------------------|----------|-----------------------------------------------------------------------| +| github_token | :warning: [Deprecated] please use `source_gh_token` instead to have a declarative name. Token for the repo. Can be passed in using `${{ secrets.GITHUB_TOKEN }}` | `true` | `${{ github.token }}` | +| source_gh_token | `[optional]` used for the source github repo token. Can be passed in using `${{ secrets.GITHUB_TOKEN }}` | `false` | `${{ github.token }}` | +| target_gh_token | `[optional]` used for the source github repo token. Can be passed in using `${{ secrets.GITHUB_TOKEN }}` | `false` | `${{ github.token }}` | +| source_repo_path | Repository path of the template | `true` | | +| upstream_branch | The target branch | `false` | The remote's default (usually `main`) | +| source_repo_ssh_private_key | `[optional]` private ssh key for the source repository. [see](#private-template-repository) | `false` | | +| pr_branch_name_prefix | `[optional]` the prefix of branches created by this action | `false` | `chore/template_sync` | +| pr_title | `[optional]` the title of PRs opened by this action. Must be already created. | `false` | `upstream merge template repository` | +| pr_body | `[optional]` the body of PRs opened by this action. | `false` | `Merge ${SOURCE_REPO} ${TEMPLATE_GIT_HASH}` | +| pr_labels | `[optional]` comma separated list. [pull request labels][pr-labels]. | `false` | `sync_template` | +| pr_reviewers | `[optional]` comma separated list of pull request reviewers. | `false` | | +| pr_commit_msg | `[optional]` commit message in the created pull request | `false` | `chore(template): merge template changes :up:` | +| hostname | `[optional]` the hostname of the repository | `false` | `github.com` | +| is_git_lfs | `[optional]` set to `true` if you want to enalbe git lfs | `false` | `false` | +| is_dry_run | `[optional]` set to `true` if you do not want to push the changes and not want to create a PR | `false` | | +| is_allow_hooks | `[optional]` set to `true` if you want to enable lifecycle hooks. Use this with caution! | `false` | `false` | +| hooks | `[optional]` please check the lifecycle hooks section below | `false` | | +| is_force_push_pr | `[optional]` set to `true` if you want to force push and pr update. Needs further permissions (see below) | `false` | `false` | +| is_pr_cleanup | `[optional]` set to `true` if you want to cleanup older PRs targeting the same branch. Use this with caution! | `false` | `false` | +| is_keep_branch_on_pr_cleanup | `[optional]` set to `true` if you want to keep the branch when pr is cleanup. Only makes sense together with `is_pr_cleanup` | `false` | `false` | +| is_not_source_github | `[optional]` set to `true` if the source git provider is not GitHub | `false` | `false` | +| is_force_deletion | `[optional]` set to `true` if you want to force delete files which are deleted within the source repository even if they contain changes. You need to also adjust `git_remote_pull_params` (see below for details) | `false` | `false` | +| git_user_name | `[optional]` set the committer git user.name | `false` | `${GITHUB_ACTOR}` | +| git_user_email | `[optional]` set the committer git user.email | `false` | `github-action@actions-template-sync.noreply.${SOURCE_REPO_HOSTNAME}` | +| git_remote_pull_params | `[optional]` set remote pull parameters | `false` | `--allow-unrelated-histories --squash --strategy=recursive -X theirs` | +| gpg_private_key | `[optional]` set if you want to sign commits | `false` | | +| gpg_passphrase | `[optional]` set if your optional gpg private key has a passphrase | `false` | | +| steps | `[optional] add the steps you want to execute within the action` | `false` | all steps will be executed | +| template_sync_ignore_file_path | `[optional] set the path to the ignore file.` | false |`.templatesyncignore` | +| is_with_tags | `[optional]` set to `true` if tags should be synced | `false` | `false` | + +### Action Outputs + +> Properties that are available after the action executed. + +| output | description | +| ------ | ----------- | +| pr_branch | The name of the branch used for the pull request | +| template_git_hash | The template source repository git hash | + +**Remarks** Please consider following edge cases + +* **pr_branch** + * If PR branch already exists (e.g. after a 2nd run) the action won't update the branch but will still output the branch name + * If the remote repository already contains the source repository changes the action will exit and the output variable will be undefined + * If there are no changes the action will exit and the output variable will be undefined + +### Change the target branch + +Per default the action is using the default branch as the target. To change this behaviour just add it to the checkout action + +```yaml + - name: Checkout + uses: actions/checkout@v4 + with: + ref: # defaults to the default branch +``` + +### Docker + +There are docker images available. Please checkout [How to use docker](docs/DOCKER.md) for details. + +* [dockerhub andyaugustin/actions-template-sync][dockerhub-repo] +* [github andreasaugustin/actions-template-sync][github-repo] + +### Example + +This repo uses this [template][template] and this action from the [marketplace][marketplace]. +See the definition within [self-usage][self-usage]. + +If you look for a more detailed guide you can have a look at + +* [Dev.to][devto-example] +* [GitHub][github-example] +* :heart: [nice blog post][dotdc-blog] + +### Trigger + +You can use all [triggers][action-triggers] which are supported for GitHub actions + +## Ignore Files + +Create a `.templatesyncignore` file. Just like writing a `.gitignore` file, follow the [glob pattern][glob-pattern] +in defining the files and folders that should be excluded from syncing with the template repository. + +It can also be stored inside `.github` folder. + +The `template_sync_ignore_file_path` parameter allows you to specify a path to an ignore file. This variable defaults to `.templatesyncignore`. +Changing this allows you to support template sync with more than one repository using different ignore files. + +The action will look for the path specified within `.` or `.github/` + +_Note: It is not possible to sync also the `.templatesyncignore` itself. Any changes from the template repository will be restored automatically._ + +**Remark** reading the [gitglossary][git-glossary] (_pathspec_ section) you see a slight difference to the `.gitignore` file +when you like to disable files you need to use `:!`. +E.g. when you like to disable the sync for all files with exceptions, you need to do smth like + +```txt +:!newfile-1.txt +* +``` + +## Force Push and PR + +If you set the input `is_force_push_pr` to `true` you are able to react to e.g. metadata changes within the workflow definition file. +Please note that you need to add permissions for `repository-projects: read`. Compare the needed scope with [gh pr edit][github-gh-cli-pr-edit] + +```yaml + permissions: + contents: write + pull-requests: write + repository-projects: read +``` + +## Sign commits + +It is recommended to [sign your commits][devto-sign-commits]. This action is able to sign commits. + +First, [generate a GPG key][github-create-gpg-key] and export the GPG private key as an ASCII armored version to your clipboard: + +```bash +# macOS +gpg --armor --export-secret-key jon@doe.example | pbcopy + +# Ubuntu (assuming GNU base64) +gpg --armor --export-secret-key jon@doe.example -w0 | xclip + +# Arch +gpg --armor --export-secret-key jon@doe.example | xclip -selection clipboard -i + +# FreeBSD (assuming BSD base64) +gpg --armor --export-secret-key jon@doe.example | xclip +``` + +:warning: the gpg username and email must match the `git_user_name` and `git_user_email` parameters. +Paste your clipboard as a [secret][github-create-secret] named `GPG_PRIVATE_KEY` for example. +If your key has a password, create another secret named `GPG_PASSPHRASE`. + +```yaml +# File: .github/workflows/template-sync.yml + +on: + # cronjob trigger + schedule: + - cron: "0 0 1 * *" + # manual trigger + workflow_dispatch: +jobs: + repo-sync: + runs-on: ubuntu-latest + # https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs + permissions: + contents: write + pull-requests: write + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + + - name: actions-template-sync + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_gh_token: ${{ secrets.GITHUB_TOKEN }} + source_repo_path: + git_user_name: # add the gpg username + git_user_email: # add the gpg email + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + # uncomment if your key has a passphrase + # gpg_passphrase: ${{ secrets.GPG_PASSPHRASE }} + +``` + +## Lifecycle actions + +The action has different phases which are executed in the following order + +* **preparation** prepare and configure git related things + * init git + * auth related (ssh or github auth) + * [optional] gpg setup +* **prechecks** run some prechecks + * skipped if `is_force_push_pr` parameter is set to `true` + * check if the sync branch is already existing in target repository + * check if new changes of the source repository are already within history +* **pull** pull the changes from the remote repository into the action runtime +* **commit** commit the changes within the action runtime +* **push** + * if `is_force_push_pr` is set to true then a force push will be executed +* **pr** + * eventual create registered labels (:ninja: emojis are supported) + * create a new PR + * if `is_force_push_pr` is set to true then the PR will be created or edited + * [optional] **cleanup** eventual cleanup older PRs of the action +* set **github action outputs** + +If `is_dry_run` parameter is set to true then all stages modifying the github state are not run (e.g. push, cleanup and pr). + +It is possible to run a subset of the mentioned lifecycle actions. +**preparation** and **github action outputs** will be run every time. + +:warning: Advanced feature. Use with care (possibly set `is_dry_run: true` configuration parameter for testing purposes) + +e.g. + +```yaml +# File: .github/workflows/test_steps.yml + +on: + # cronjob trigger + schedule: + - cron: "0 0 1 * *" + # manual trigger + workflow_dispatch: +jobs: + repo-sync: + runs-on: ubuntu-latest + # https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs + permissions: + contents: write + pull-requests: write + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + + - name: actions-template-sync first steps + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_repo_path: + steps: "prechecks,pull" # order matters + + - name: in between step + run: | + echo "I can do whatever I want" + git status + + - name: actions-template-sync next steps + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_repo_path: + steps: "commit,push,pr" # order matters + +``` + +## Lifecycle hooks + +Different lifecycle hooks are supported. You need to enable the functionality with the option `is_allow_hooks` and set it to `true` +:warning: use this functionality with caution. You can use one of the available docker images to test it out. **With great power comes great responsibility**. + +In addition, you need either a configuration file with the name `templatesync.yml` within the root of the target repository +or you set the hooks input parameter within the action definition with a related yaml string + +The following hooks are supported (please check [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for a better understanding of the lifecycles). + +* `prepull` is executed before the code is pulled from the source repository +* `precommit` is executed before the code is commited +* `prepush` is executed before the push is executed, right after the commit +* `precleanup` is executed before older PRs targeting the same branch are closed +* `prepr` is executed before the PR is done + +**Remark** If you need to install aditional tools just install them in an additional step upfront the action invokation. +If using the docker image the underlying OS is defined by an Alpine container. + +### Example for the hooks input parameter + +```yml +- name: Test action step + uses: AndreasAugustin/actions-template-sync@v2 + env: + MY_VAR: "foo" # possible to define envrionment variables + with: + source_repo_path: AndreasAugustin/template.git + upstream_branch: main + is_dry_run: true + is_allow_hooks: true + hooks: > + prepull: + commands: + - echo 'hi, we are within the prepull phase' + - echo 'maybe you want to do adjustments on the local code' +``` + +### Schema and example for the `templatesync.yml` + +**Remark** It is possible to use environment variables within the github action definition usable within the command configuration, e.g. + +```yml +- name: Test action step + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_repo_path: AndreasAugustin/template.git + upstream_branch: main + is_dry_run: true + is_allow_hooks: true +``` + +Please not the double quotes within the following `prepull echo` command + +```yml +hooks: + prepull: + commands: + - echo "hi, we are within the prepull phase ${MY_VAR}" + - echo 'maybe you want to do adjustments on the local code' + precommit: + commands: + - echo 'hi, we are within the precommit phase' + - echo 'maybe you want to add further changes before the code is committed' + prepush: + commands: + - echo 'hi, we are within the prepush phase' + - echo 'maybe you want to add further changes and commits' + precleanup: + commands: + - echo 'hi, we are within the precleanup phase' + - echo 'maybe you want to interact with older PRs before they are closed' + prepr: + commands: + - echo 'hi, we are within the prepr phase' + - echo 'maybe you want to change the code a bit and do another push before creating the pr' +``` + +## Labels creation + +By default, generated PRs will be labeled with the `template_sync` label. +If that label doesn't exist in your repository, it will be created automatically unless you specify your own existing labels. +Associating a label with the generated PRs helps keeping track of them and allows for features like automatic PR cleanup. + +## Pull request cleanup + +Depending on your way of working, you may end up with multiple pull requests related to template syncing pointing to the same branch. +If you want to avoid this situation, you can instruct this action to clean up older PRs (search based on labels defined with the `pr_labels` config parameter). + +:warning: this feature will close all pull requests with labels configured with `pr_labels` config parameter. + +## Force deletion + +This feature will force delete files if those are deelted within the source repository. + +:warning: it is highly related to the `git_remote_pull_params` config parameter and won't work with the default. +You need to change the default one e.g. to `git_remote_pull_params: --allow-unrelated-histories --strategy=recursive --no-edit`. + +## GHES and custom runners + +Some notes if you use GitHub Enterprise Server (GHES) and/or custom runners. +The action script is based on bash. That means your runner must be able to run bash scripts. +Furthermore you need to have the following command line tools installed: + +* ssh +* [GitHub cli][gh-cli] +* git +* optional (dependent the features you are using) + * [git lfs][git-lfs] if you are using the lfs functionality + * [yq][yq] if you are using the hook functionality + * gpg if you are using the git signing functionality + +Furthermore most likely you have a custom domain name. Therefore you should configure the `hostname` GitHub action parameter. + +### Remark + +:whale: There is also a docker image available which has all needed tools installed. This is helpful e.g. if you are not able to use a remote action. +The idea is to use the [docker action][action-docker] + +* [GitHub registry][github-repo] +* [Dockerhub registry][dockerhub-repo] + +## Troubleshooting + +* The error message `refusing to allow a GitHub App to create or update workflow '.github/workflows/.yml' without 'workflows' permission)` +is indicating that the PAT in the `target_gh_token` does not have the correct permissions. +This happens because the template repository is trying to overwrite some files inside `.github/workflows/`. + + Currently `GITHUB_TOKEN` can't be given `workflow` permission. + You can grant our workflow with `workflow` permission using a PAT following the steps below: + + 1. [Create a PAT][github-create-pat] with these repository permissions granted: `workflow`. + + 2. Copy the generated token and [create a new secret for your target repository][github-create-secret]. + + 3. Configure the `actions-template-sync` step to use the freshly generated token in `target_gh_token` like this: + + ```yaml + # File: .github/workflows/template-sync.yml + + on: + # cronjob trigger + schedule: + - cron: "0 0 1 * *" + # manual trigger + workflow_dispatch: + jobs: + repo-sync: + runs-on: ubuntu-latest + # https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs + permissions: + contents: write + pull-requests: write + + steps: + # To use this repository's private action, you must check out the repository + - name: Checkout + uses: actions/checkout@v4 + with: + # submodules: true + persist-credentials: false # needed + + - name: actions-template-sync + uses: AndreasAugustin/actions-template-sync@v2 + with: + source_gh_token: ${{ secrets.GITHUB_TOKEN }} + target_gh_token: ${{ secrets. }} + source_repo_path: + upstream_branch: # defaults to main + pr_labels: ,[,...] # optional, no default + ``` + + :warning: you need to add `persist-credentials: false` to the checkout action + +* pull request create failed: GraphQL: GitHub Actions is not permitted to create or approve pull requests (createPullRequest) + + Open your project `Settings > Actions > General` and select the checkbox `Allow GitHub Actions to create and approve pull requests` +under the `Workflow permissions` section. + +## Release update notes + +* `v2` + * `git lfs` is no default anymore. Enable with `is_git_lfs` parameter. + * infrastructure change: now using [composite action][action-composite] instead of [docker action][action-docker] + to be more flexible to combine more actions (file system permissions). + * local `git config` now instead of global `git config --global` in respect to be more flexible in chaining actions. +* :warning: starting with version `v1` (`v1.0.0`) the `upstream_branch` variable default is not `main` anymore. It is now set to the remote default branch. +* starting with version v0.5.2-draft the `templateversionrc` file is not needed anymore. You can delete that file from the target repositories. + +## Debug + +You must create a secret named `ACTIONS_STEP_DEBUG` with the value `true` to see the debug messages set by this command in the log. +For more information, see "[Enabling debug logging.][enabling-debug-logging]" + +## Comparison with other tools + +There are other great tools available within GitHub. Here you can find a comparison. + +| **feature** | **actions-template-sync** |[github-sync][other-repo-sync]| [git-repo-sync][other-git-repo-sync] | [action-template-repository-sync][other-action-template-repository-sync] | +| ----------- | ------------------------- | -------------------------- | ------------------------------------ | --------------------------------- | +| GitHub action | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | +| hooks | :heavy_check_mark: | :x: | :x: | :x: | +| available docker image | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | +| sync between private and public repo | :heavy_check_mark: `PAT,ssh,Github app` | :heavy_check_mark: `PAT,ssh` |:x: local repos | :heavy_check_mark: `PAT` | +| sync between 2 private repos | :heavy_check_mark: `PAT,ssh,Github app` | :heavy_check_mark: `PAT,ssh` | :x: local repos | :heavy_check_mark: `PAT` | +| sync between 2 public repos | :heavy_check_mark: | :heavy_check_mark: | :x: local repos | :heavy_check_mark: | +| two way sync | :x: | :heavy_check_mark: | :x: | :x: | +| Sync from a third-party repo to a Github repo | :heavy_check_mark: | :heavy_check_mark: | :x: local repos | :x: | +| dry run | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | +| ignore files | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | +| creates a PR | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | +| sign commits | :heavy_check_mark: | :x: | :x: | :x: | +| docker images available | :heavy_check_mark: | :x: | :x: | :x: | +| remarks | The action is placed within the target repositories | The action is placed within the target repositories | CLI meant for local use | The action will be based within the base repository with a list of dependent repositories | + +## DEV + +The development environment targets are located in the [Makefile](Makefile) + +```bash +make help +``` + +:ninja: contributiong of any kind are welcome. Please checkout the [contributing guidelines](.github/CONTRIBUTING.md). + +For some architectural notes please have a look at the [docs](./docs/README.md) + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
andy Augustin
andy Augustin

📖 💻 👀 🛡️ 🤔 💬 💡 🖋 📝 🚧 🚇 📦 ⚠️
Ugo Pattacini
Ugo Pattacini

📖
Jose Gabrielle Rivera
Jose Gabrielle Rivera

💻
P.D. Rittenhouse
P.D. Rittenhouse

🤔
Daniel Boll
Daniel Boll

🐛
albertschwarzkopf
albertschwarzkopf

🤔
Akul Pillai
Akul Pillai

🛡️
Stefan Riembauer
Stefan Riembauer

🤔
Fabrizio Cacicia
Fabrizio Cacicia

🛡️ 🐛
Justin Tunis
Justin Tunis

🤔 💻 🐛
Michael Matos
Michael Matos

🐛
Gavin Williams
Gavin Williams

🤔
Marc Siebeneicher
Marc Siebeneicher

🤔 💻 🐛 📖
Luís Henrique A. Schünemann
Luís Henrique A. Schünemann

🤔 📖 💻
George
George

💬 📖 🤔
Pedro Rivero
Pedro Rivero

🤔
Eleanor Bronson
Eleanor Bronson

🤔
Marvin Osswald
Marvin Osswald

📖
David Calvert
David Calvert

📖 🐛 💻 🚧 📝
Andy Airey
Andy Airey

🐛 👀
Surya Asriadie
Surya Asriadie

🐛
jellllly420
jellllly420

🤔 💬 📖
Shaun Tabone
Shaun Tabone

💻
Kevin AUDE
Kevin AUDE

🤔 💻
Jakob
Jakob

👀
Kevin Deldycke
Kevin Deldycke

🐛 🤔 💻
Jessica Scheick
Jessica Scheick

🐛
Gaspar Melsion
Gaspar Melsion

🤔
Ken Harding
Ken Harding

💻 🐛
Jakob Drachmann Havtorn
Jakob Drachmann Havtorn

🤔
Brian
Brian

📖
MuriloChianfa
MuriloChianfa

📖
David Snyder
David Snyder

🔬
Jonathan Østrup
Jonathan Østrup

🤔 💻
Nat Welch
Nat Welch

🐛 💻
Pepijn Boer
Pepijn Boer

🐛 📖
Alex
Alex

💻 🤔 👀 ⚠️
yuhengshen
yuhengshen

🐛 💻
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind are welcome! + +[enabling-debug-logging]: https://docs.github.com/en/actions/managing-workflow-runs/enabling-debug-logging +[deployment-keys]: https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys +[action-triggers]: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +[action-composite]: https://docs.github.com/en/actions/creating-actions/creating-a-composite-action +[action-docker]: https://docs.github.com/en/actions/creating-actions/creating-a-docker-container-action +[template]: https://github.com/AndreasAugustin/template +[marketplace]: https://github.com/marketplace/actions/actions-template-sync +[self-usage]: https://github.com/AndreasAugustin/actions-template-sync/blob/main/.github/workflows/actions_template_sync.yml +[pr-labels]: https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels +[devto-example]: https://dev.to/andreasaugustin/github-actions-template-sync-1g9k +[devto-sign-commits]: https://dev.to/andreasaugustin/git-how-and-why-to-sign-commits-35dn +[github-example]: https://github.com/AndreasAugustin/teaching/blob/main/docs/git/git_action_sync.md +[github-app]: https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps +[glob-pattern]: https://en.wikipedia.org/wiki/Glob_(programming) +[github-app-token]: https://github.com/tibdex/github-app-token +[dockerhub-repo]: https://hub.docker.com/r/andyaugustin/actions-template-sync +[github-repo]: https://github.com/AndreasAugustin/actions-template-sync/pkgs/container/actions-template-sync +[github-pat]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token +[other-repo-sync]: https://github.com/repo-sync/github-sync +[other-git-repo-sync]: https://github.com/it3xl/git-repo-sync +[other-action-template-repository-sync]: https://github.com/ahmadnassri/action-template-repository-sync +[git-glossary]: https://git-scm.com/docs/gitglossary +[dotdc-blog]: https://0xdc.me/blog/github-templates-and-repository-sync/ +[github-create-pat]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token +[github-create-secret]: https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository +[github-create-gpg-key]: https://docs.github.com/en/authentication/managing-commit-signature-verification/generating-a-new-gpg-key +[github-gh-cli-pr-edit]: https://cli.github.com/manual/gh_pr_edit +[gh-cli]: https://github.com/cli/cli +[yq]: https://github.com/mikefarah/yq +[git-lfs]: https://github.com/git-lfs/git-lfs diff --git a/third_party/AndreasAugustin/actions-template-sync/action.yml b/third_party/AndreasAugustin/actions-template-sync/action.yml new file mode 100644 index 00000000..a4029472 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/action.yml @@ -0,0 +1,137 @@ +name: "actions-template-sync" +description: "Synchronises changes of the template repository" +author: "AndreasAugustin" +branding: + icon: cloud + color: green +inputs: + source_gh_token: + description: 'GitHub Token for the repo to be synced from. Can be passed in using $\{{ secrets.GITHUB_TOKEN }}' + required: false + default: ${{ github.token }} + target_gh_token: + description: 'GitHub Token for the repo to be synced to. Can be passed in using $\{{ secrets.GITHUB_TOKEN }}' + required: false + default: ${{ github.token }} + github_token: + deprecationMessage: 'please use source_gh_token instead to have a declarative name' + description: 'GitHub Token for the repo to be synced from. Can be passed in using $\{{ secrets.GITHUB_TOKEN }}' + required: false + source_repo_path: + description: "Repository path of the template" + required: true + upstream_branch: + description: "The target branch" + source_repo_ssh_private_key: + description: "[optional] private ssh key for the source repository. E.q. useful if using a private template repository." + pr_branch_name_prefix: + description: "[optional] the prefix of branches created by this action" + default: "chore/template_sync" + pr_title: + description: "[optional] the title of PRs opened by this action" + default: "upstream merge template repository" + pr_body: + description: "[optional] the body of PRs opened by this action" + pr_labels: + description: "[optional] comma separated list of pull request labels" + default: "template_sync" + pr_reviewers: + description: "[optional] comma separated list of pull request reviewers" + pr_commit_msg: + description: "[optional] the commit message of the template merge" + default: "chore(template): merge template changes :up:" + hostname: + description: "[optional] the hostname of the GitHub repository" + default: "github.com" + is_dry_run: + description: "[optional] set to true if you do not want to push the changes and not want to create a PR" + is_allow_hooks: + description: "[optional] set to true if you want to allow hooks. Use this functionality with caution!" + default: "false" + hooks: + description: "[optional] define the hooks as yaml string input" + is_force_push_pr: + description: "[optional] set to true if you want to force push and pr update" + default: "false" + is_pr_cleanup: + description: "[optional] set to true if you want to cleanup older PRs targeting the same branch." + default: "false" + is_keep_branch_on_pr_cleanup: + description: "[optional] set to true if you want to keep the branch when pr is cleanup" + default: "false" + is_not_source_github: + description: "[optional] set to true if the source repository is not a github related repository. Useful e.q. if the source is GitLab" + default: "false" + is_force_deletion: + description: "[optional] set to true if you want to force delete files which are deleted within the source repository even if they contain changes" + default: "false" + is_git_lfs: + description: "[optional] set to true if you want to enable git lfs" + default: "false" + git_user_name: + description: "[optional] set the committer git user.name for the merge commit" + git_user_email: + description: "[optional] set the committer git user.email for the merge commit" + git_remote_pull_params: + description: "[optional] set the pull parameters for the remote repository" + gpg_private_key: + description: "[optional] set the gpg private key if you want to sign your commits" + gpg_passphrase: + description: "[optional] set if your private gpg key has a password" + steps: + description: "[optional] set the steps to execute within the action" + template_sync_ignore_file_path: + description: "[optional] set the path to the ignore file" + default: ".templatesyncignore" + is_with_tags: + description: "[optional] set to true if tags should be synced" + default: "false" +outputs: + pr_branch: + description: "The name of the PR branch" + value: ${{ steps.sync.outputs.pr_branch }} + template_git_hash: + description: "The git hash of the template source repository" + value: ${{ steps.sync.outputs.template_git_hash }} +runs: + using: "composite" + # image: "src/Dockerfile" + steps: + - name: github sync + run: ${{github.action_path}}/src/entrypoint.sh + # working-directory: src/ + shell: bash + id: sync + env: + SOURCE_GH_TOKEN: ${{ inputs.source_gh_token}} + TARGET_GH_TOKEN: ${{ inputs.target_gh_token }} + # GITHUB_TOKEN is deprecated and will be removed soon + GITHUB_TOKEN: ${{ inputs.github_token }} + # + SOURCE_REPO_PATH: ${{ inputs.source_repo_path }} + UPSTREAM_BRANCH: ${{ inputs.upstream_branch }} + SSH_PRIVATE_KEY_SRC: ${{ inputs.source_repo_ssh_private_key }} + PR_BRANCH_NAME_PREFIX: ${{ inputs.pr_branch_name_prefix }} + PR_TITLE: ${{ inputs.pr_title }} + PR_BODY: ${{ inputs.pr_body }} + PR_LABELS: ${{ inputs.pr_labels }} + PR_REVIEWERS: ${{ inputs.pr_reviewers }} + PR_COMMIT_MSG: ${{ inputs.pr_commit_msg }} + HOSTNAME: ${{ inputs.hostname }} + IS_DRY_RUN: ${{ inputs.is_dry_run }} + IS_ALLOW_HOOKS: ${{ inputs.is_allow_hooks }} + HOOKS: ${{ inputs.hooks }} + IS_FORCE_PUSH_PR: ${{ inputs.is_force_push_pr }} + IS_GIT_LFS: ${{ inputs.is_git_lfs }} + IS_PR_CLEANUP: ${{ inputs.is_pr_cleanup}} + IS_KEEP_BRANCH_ON_PR_CLEANUP: ${{ inputs.is_keep_branch_on_pr_cleanup }} + IS_NOT_SOURCE_GITHUB: ${{ inputs.is_not_source_github }} + IS_FORCE_DELETION: ${{ inputs.is_force_deletion }} + GIT_USER_NAME: ${{ inputs.git_user_name }} + GIT_USER_EMAIL: ${{ inputs.git_user_email }} + GIT_REMOTE_PULL_PARAMS: ${{ inputs.git_remote_pull_params }} + GPG_PRIVATE_KEY: ${{ inputs.gpg_private_key }} + GPG_PASSPHRASE: ${{ inputs.gpg_passphrase }} + STEPS: ${{ inputs.steps }} + TEMPLATE_SYNC_IGNORE_FILE_PATH: ${{ inputs.template_sync_ignore_file_path }} + IS_WITH_TAGS: ${{ inputs.is_with_tags }} diff --git a/third_party/AndreasAugustin/actions-template-sync/docker-compose.yml b/third_party/AndreasAugustin/actions-template-sync/docker-compose.yml new file mode 100644 index 00000000..08f372e8 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/docker-compose.yml @@ -0,0 +1,30 @@ +services: + dev: + build: + context: . + target: dev + volumes: + - .:/app/ + - ~/.gitconfig:/root/.gitconfig:ro + environment: + - SSH_PRIVATE_KEY_SRC + + docs: + build: + context: . + target: docs + volumes: + - .:/app/ + + shellcheck: + image: koalaman/shellcheck:v0.7.2 + volumes: + - .:/app/ + working_dir: /app/ + + prod: + build: + context: . + target: prod + tty: true + entrypoint: ["/bin/bash"] diff --git a/third_party/AndreasAugustin/actions-template-sync/docker-test-config.yml b/third_party/AndreasAugustin/actions-template-sync/docker-test-config.yml new file mode 100644 index 00000000..5da537ab --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/docker-test-config.yml @@ -0,0 +1,6 @@ +schemaVersion: '2.0.0' +commandTests: + - name: "gh is installed" + command: "which" + args: ["gh"] + expectedOutput: ["/bin/gh"] diff --git a/third_party/AndreasAugustin/actions-template-sync/docs/ARCHITECTURE.md b/third_party/AndreasAugustin/actions-template-sync/docs/ARCHITECTURE.md new file mode 100644 index 00000000..843f0ddc --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/docs/ARCHITECTURE.md @@ -0,0 +1,93 @@ +# Architecture + +## abstract + +within this section you will find some information about the code flow + +## Code + +The architecture and logic within the code: + +```mermaid +flowchart TD +Exit[Exit] +Start[Start] +GitHubActionEnv{"fa:fa-github Read GitHubAction env"} + +style Start fill:#f9f,stroke:#333,stroke-width:4px +style Exit fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5 + +EnvCheckEntry{Required environment variables exists} +SshCheckEntry{SSH private key defined} +SshConfigureEntry[Configure ssh related variables] +GitConfigureEntry[Configure git global settings] + +EnvCheckSync{Required environment variables exists} +SshConfigureSync[Eventually configure SSH variables] +SetVariablesSync[Set the needed variables, e.q. with reading remote repository] +CheckCommitLocalExistent{"Check if source commit hash is present in target repo"} +GitCheckoutSync["fa:fa-code-branch Create git branch "] +GitPullSync["Pull from remote repository"] +CheckIgnoreFileExistsSync{"Check if .templatesyncignore file exists\n(First inside .github folder, then in root)"} +ResetChangesSync["Reset the changes listed within the ignore file"] +GitCommitSync["fa:fa-code-commit Commit the changes"] + +CheckIsDryRun{"Check if is_dry_run is set to true"} +GitPushSync["Push the changes to GitHub"] +GitPullRequestSync["fa:fa-code-pull-request Create a pull request on GitHub"] +Hook{{"hooks, prepull | precommit | prepush | prepr"}} + +subgraph githubactions["fa:fa-github GitHubActions"] + +Start --> GitHubActionEnv +GitHubActionEnv -->|issues| Exit + + +end + +subgraph entry["entrypoint.sh"] + +GitHubActionEnv -->|all fine| EnvCheckEntry +EnvCheckEntry -->|do not exist| Exit +EnvCheckEntry -->|exist| SshCheckEntry + +SshCheckEntry -->|is defined| SshConfigureEntry +SshCheckEntry -->|is not defined| GitConfigureEntry +SshConfigureEntry --> GitConfigureEntry + +end + + +subgraph sync["sync_template.sh"] +GitConfigureEntry --> EnvCheckSync + +EnvCheckSync -->|do not exist| Exit +EnvCheckSync -->|do exist| SshConfigureSync +SshConfigureSync --> SetVariablesSync + +subgraph compareVersion["Compare the sync version"] +SetVariablesSync --> CheckCommitLocalExistent +CheckCommitLocalExistent -->|commit hash already in target history| Exit +end + +subgraph git["Git Actions"] +CheckCommitLocalExistent -->|commit hash not in target history| GitCheckoutSync +GitCheckoutSync --> GitPullSync +GitPullSync --> CheckIgnoreFileExistsSync +CheckIgnoreFileExistsSync -->|does not exist| GitCommitSync +CheckIgnoreFileExistsSync -->|exists| ResetChangesSync +ResetChangesSync --> GitCommitSync +end + +subgraph github["GitHub Actions"] +GitCommitSync --> CheckIsDryRun +CheckIsDryRun -->|is true| Exit +CheckIsDryRun -->|is not true| GitPushSync +GitPushSync --> GitPullRequestSync +GitPullRequestSync --> Exit + +end + +end + +``` diff --git a/third_party/AndreasAugustin/actions-template-sync/docs/DOCKER.md b/third_party/AndreasAugustin/actions-template-sync/docs/DOCKER.md new file mode 100644 index 00000000..29b7bf24 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/docs/DOCKER.md @@ -0,0 +1,15 @@ +# DOCKER + +## abstract + +If you want to test things out or if you want to build your own action (e.g. in on prem environments) you are able to use docker images. + +- [github registry][github-repo] +- [dockerhub registry][dockerhub-repo] + +## Use the image + +TODO + +[dockerhub-repo]: https://hub.docker.com/r/andyaugustin/actions-template-sync +[github-repo]: https://github.com/AndreasAugustin/actions-template-sync/pkgs/container/actions-template-sync diff --git a/third_party/AndreasAugustin/actions-template-sync/docs/README.md b/third_party/AndreasAugustin/actions-template-sync/docs/README.md new file mode 100644 index 00000000..388074fb --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/docs/README.md @@ -0,0 +1,19 @@ +# Docs + +## abstract + +Within this section you can find some more detailed doumentation. + +```mermaid +flowchart LR + github_source("fa:fa-github GitHub source repository [private|public]") + gitlab_source("fa:fa-gitlab GitLab source repository [private|public]") + any_source("fa:fa-git Any git provider [private|public]") + github_target{{"fa:fa-github GitHub target repository [private|public]"}} + github_source --> |"ssh | PAT | github app"| github_target + gitlab_source --> |"ssh"| github_target + any_source --> |"ssh"| github_target +``` + +- [architecture](./ARCHITECTURE.md) +- [how to use the docker images](./DOCKER.md) diff --git a/third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_fine_grained_needed_scopes.png b/third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_fine_grained_needed_scopes.png new file mode 100644 index 0000000000000000000000000000000000000000..41b089038501e8577540484b22790939978941dc GIT binary patch literal 59675 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 literal 0 HcmV?d00001 diff --git a/third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_access_source_repo.png b/third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_access_source_repo.png new file mode 100644 index 0000000000000000000000000000000000000000..67cdbd84a1a142d5f870a5f90224fc1f6328d6c6 GIT binary patch literal 42293 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 literal 0 HcmV?d00001 diff --git a/third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_scopes_source_repo.png b/third_party/AndreasAugustin/actions-template-sync/docs/assets/pat_needed_scopes_source_repo.png new file mode 100644 index 0000000000000000000000000000000000000000..44380e251e49f30ce15cf167c17de28ecf0be869 GIT binary patch literal 74518 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

87)?&1_bN{1xx#=)y9 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 Oz-4M;X!ySp4^jpn#g7@7q6r!V3PZNIBFkUZYh0 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/dev/null; then + err "Missing variable 'ssh_private_key_src'."; + exit 1; + fi + + if [[ -z "${source_repo_hostname}" ]]; then + err "Missing variable 'source_repo_hostname'."; + exit 1; + fi + + # exporting SRC_SSH_PRIVATEKEY_ABS_PATH to be used later + export SRC_SSH_PRIVATEKEY_ABS_PATH="${src_ssh_file_dir}/${src_ssh_private_key_file_name}" + + debug "We are using SSH within a private source repo" + mkdir -p "${src_ssh_file_dir}" + # use cat <<< instead of echo to swallow output of the private key + cat <<< "${ssh_private_key_src}" | sed 's/\\n/\n/g' > "${SRC_SSH_PRIVATEKEY_ABS_PATH}" + chmod 600 "${SRC_SSH_PRIVATEKEY_ABS_PATH}" + + # adjusting outer variable source repo prefix + SOURCE_REPO_PREFIX="git@${source_repo_hostname}:" + + echo "::endgroup::" +} + +####################################### +# doing the gpg setup. +# Arguments: +# gpg_private_key +# git_user_email +####################################### +function gpg_setup() { + echo "::group::gpg setup" + info "start prepare gpg" + + local gpg_private_key=$1 + local git_user_email=$2 + + if [[ -z "${gpg_private_key}" ]] &>/dev/null; then + err "Missing variable 'gpg_private_key'."; + exit 1; + fi + + if [[ -z "${git_user_email}" ]]; then + err "Missing variable 'git_user_email'."; + exit 1; + fi + + echo -e "${gpg_private_key}" | gpg --import --batch + for fpr in $(gpg --list-key --with-colons "${git_user_email}" | awk -F: '/fpr:/ {print $10}' | sort -u); do echo -e "5\ny\n" | gpg --no-tty --command-fd 0 --expert --edit-key "$fpr" trust; done + + KEY_ID="$(gpg --list-secret-key --with-colons "${git_user_email}" | awk -F: '/sec:/ {print $5}')" + git config user.signingkey "${KEY_ID}" + git config commit.gpgsign true + git config gpg.program "${SCRIPT_DIR}/gpg_no_tty.sh" + + info "done prepare gpg" + echo "::endgroup::" +} + + +####################################### +# doing the git setup. +# Arguments: +# git_user_email +# git_user_name +# source_repo_hostname +####################################### +function git_init() { + echo "::group::git init" + info "set git global configuration" + + local git_user_email=$1 + local git_user_name=$2 + local source_repo_hostname=$3 + + git config user.email "${git_user_email}" + git config user.name "${git_user_name}" + git config pull.rebase false + git config --add safe.directory /github/workspace + + if [[ "${IS_GIT_LFS}" == 'true' ]]; then + info "enable git lfs." + git lfs install + fi + + if [[ "${IS_NOT_SOURCE_GITHUB}" == 'true' ]]; then + info "the source repository is not located within GitHub." + mkdir -p "${HOME}"/.ssh + ssh-keyscan -t rsa "${source_repo_hostname}" >> "${HOME}"/.ssh/known_hosts + else + info "the source repository is located within GitHub." + fi + echo "::endgroup::" +} + +####################################### +# doing the login to the source repository using gh cli +# Arguments: +# source_repo_hostname +####################################### +function gh_login_src_github() { + echo "::group::login src github" + local source_repo_hostname=$1 + # GITHUB_TOKEN is deprecated and can be removed in the future + if [[ -n "${SOURCE_GH_TOKEN}" ]] || [[ -n "${GITHUB_TOKEN}" ]] &>/dev/null; then + ################################ + if [[ -n "${GITHUB_TOKEN}" ]] &>/dev/null; then + warn "github_token parameter is deprecated please use source_gh_token." + info "setting SOURCE_GH_TOKEN" + export SOURCE_GH_TOKEN="${GITHUB_TOKEN}" + unset GITHUB_TOKEN + fi + ############################### + if [[ -z "${SOURCE_GH_TOKEN}" ]] &>/dev/null; then + err "Missing input 'source_gh_token: \${{ secrets.GITHUB_TOKEN }}'."; + exit 1; + fi + info "source server url: ${source_repo_hostname}" + info "logging out" + gh auth logout --hostname "${source_repo_hostname}" || debug "not logged in" + info "login to the source git repository" + gh auth login --git-protocol "https" --hostname "${source_repo_hostname}" --with-token <<< "${SOURCE_GH_TOKEN}" + gh auth status + gh auth setup-git --hostname "${source_repo_hostname}" + gh auth status --hostname "${source_repo_hostname}" + else + info "default token to be used" + gh auth setup-git --hostname "${source_repo_hostname}" + gh auth status --hostname "${source_repo_hostname}" + fi + echo "::endgroup::" +} + +################################################### +# Logic +################################################### + +git_init "${GIT_USER_EMAIL}" "${GIT_USER_NAME}" "${SOURCE_REPO_HOSTNAME}" + +# Forward to /dev/null to swallow the output of the private key +if [[ -n "${SSH_PRIVATE_KEY_SRC}" ]] &>/dev/null; then + ssh_setup "${SSH_PRIVATE_KEY_SRC}" "${SOURCE_REPO_HOSTNAME}" +else + gh_login_src_github "${SOURCE_REPO_HOSTNAME}" +fi + +export SOURCE_REPO="${SOURCE_REPO_PREFIX}${SOURCE_REPO_PATH}" + +if [[ -n "${GPG_PRIVATE_KEY}" ]] &>/dev/null; then + gpg_setup "${GPG_PRIVATE_KEY}" "${GIT_USER_EMAIL}" +fi + +# shellcheck source=src/sync_template.sh +source "${SCRIPT_DIR}/sync_template.sh" diff --git a/third_party/AndreasAugustin/actions-template-sync/src/gpg_no_tty.sh b/third_party/AndreasAugustin/actions-template-sync/src/gpg_no_tty.sh new file mode 100644 index 00000000..63d1c85c --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/src/gpg_no_tty.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +if [[ -n "${GPG_PASSPHRASE}" ]] &>/dev/null; then + gpg --pinentry-mode loopback --batch --yes --passphrase "${GPG_PASSPHRASE}" "$@" <&0 +else + gpg --pinentry-mode loopback --yes --batch "$@" <&0 +fi + +exit $? diff --git a/third_party/AndreasAugustin/actions-template-sync/src/sync_common.sh b/third_party/AndreasAugustin/actions-template-sync/src/sync_common.sh new file mode 100644 index 00000000..3a26f993 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/src/sync_common.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +set -e +# set -u +# set -x + +####################################### +# write a message to STDERR. +# Arguments: +# message to print. +####################################### +function err() { + echo "::error::[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2; +} + +####################################### +# write a debug message. +# Arguments: +# message to print. +####################################### +function debug() { + echo "::debug::$*"; +} + +####################################### +# write a warn message. +# Arguments: +# message to print. +####################################### +function warn() { + echo "::warn::$*"; +} + +####################################### +# write a info message. +# Arguments: +# message to print. +####################################### +function info() { + echo "::info::$*"; +} + +####################################### +# Executes commands defined within yml file or env variable +# Arguments: +# hook -> the hook to use +# +####################################3# +function cmd_from_yml() { + local FILE_NAME="templatesync.yml" + local HOOK=$1 + local YML_PATH_SUFF=".${HOOK}.commands" + + if [ "$IS_ALLOW_HOOKS" != "true" ]; then + debug "execute cmd hooks not enabled" + else + info "execute cmd hooks enabled" + + if ! [ -x "$(command -v yq)" ]; then + err "yaml query yq is not installed. 'https://mikefarah.gitbook.io/yq/'"; + exit 1; + fi + + if [[ -n "${HOOKS}" ]]; then + debug "hooks input variable is set. Using the variable" + echo "${HOOKS}" > "tmp.${FILE_NAME}" + YML_PATH="${YML_PATH_SUFF}" + else + cp ${FILE_NAME} "tmp.${FILE_NAME}" + YML_PATH=".hooks${YML_PATH_SUFF}" + fi + + readarray cmd_Arr < <(yq "${YML_PATH} | .[]" "tmp.${FILE_NAME}") + + rm "tmp.${FILE_NAME}" + + for key in "${cmd_Arr[@]}"; do echo "${key}" | bash; done + fi +} diff --git a/third_party/AndreasAugustin/actions-template-sync/src/sync_template.sh b/third_party/AndreasAugustin/actions-template-sync/src/sync_template.sh new file mode 100644 index 00000000..908348b6 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/src/sync_template.sh @@ -0,0 +1,607 @@ +#!/usr/bin/env bash + +set -e +# set -u +# set -x + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +# shellcheck source=src/sync_template.sh +source "${SCRIPT_DIR}/sync_common.sh" + +############################################ +# Prechecks +############################################ + +if [[ -z "${PR_COMMIT_MSG}" ]]; then + err "Missing env variable 'PR_COMMIT_MSG'"; + exit 1; +fi + +if [[ -z "${SOURCE_REPO}" ]]; then + err "Missing env variable 'SOURCE_REPO'"; + exit 1; +fi + +if ! [ -x "$(command -v gh)" ]; then + err "github-cli gh is not installed. 'https://github.com/cli/cli'"; + exit 1; +fi + +if [[ -z "${TEMPLATE_SYNC_IGNORE_FILE_PATH}" ]]; then + err "Missing env variable 'TEMPLATE_SYNC_IGNORE_FILE_PATH'"; + exit 1; +fi + +if [[ -z "${GITHUB_SERVER_URL}" ]]; then + err "Missing env variable 'GITHUB_SERVER_URL' of the target github server. E.g. https://github.com" +fi + +info "prechecks passed" +######################################################## +# Variables +######################################################## + +if [[ -z "${UPSTREAM_BRANCH}" ]]; then + UPSTREAM_BRANCH="$(git remote show origin | awk '/HEAD branch/ {print $NF}')" + info "Missing env variable 'UPSTREAM_BRANCH' setting to remote default ${UPSTREAM_BRANCH}"; +fi + +if [[ -n "${SRC_SSH_PRIVATEKEY_ABS_PATH}" ]]; then + debug "using ssh private key for private source repository" + export GIT_SSH_COMMAND="ssh -i ${SRC_SSH_PRIVATEKEY_ABS_PATH}" +fi + +TEMPLATE_SYNC_IGNORE_FILE_PATH="${TEMPLATE_SYNC_IGNORE_FILE_PATH:-".templatesyncignore"}" +IS_WITH_TAGS="${IS_WITH_TAGS:-"false"}" +IS_FORCE_PUSH_PR="${IS_FORCE_PUSH_PR:-"false"}" +IS_KEEP_BRANCH_ON_PR_CLEANUP="${IS_KEEP_BRANCH_ON_PR_CLEANUP:-"false"}" +GIT_REMOTE_PULL_PARAMS="${GIT_REMOTE_PULL_PARAMS:---allow-unrelated-histories --squash --strategy=recursive -X theirs}" + +TEMPLATE_REMOTE_GIT_HASH=$(git ls-remote "${SOURCE_REPO}" HEAD | awk '{print $1}') +SHORT_TEMPLATE_GIT_HASH=$(git rev-parse --short "${TEMPLATE_REMOTE_GIT_HASH}") +LOCAL_CURRENT_GIT_HASH=$(git rev-parse HEAD) # need to be run before a pull to get the current local git hash + +info "current git hash: ${LOCAL_CURRENT_GIT_HASH}" + +export TEMPLATE_GIT_HASH=${SHORT_TEMPLATE_GIT_HASH} +export PR_BRANCH="${PR_BRANCH_NAME_PREFIX}_${TEMPLATE_GIT_HASH}" +: "${PR_BODY:="Merge ${SOURCE_REPO} ${TEMPLATE_GIT_HASH}"}" +: "${PR_TITLE:-"upstream merge template repository"}" + +# for some reasons the substitution is not working as expected +# so we substitute manually +# shellcheck disable=SC2016 +PR_BODY=${PR_BODY//'${TEMPLATE_GIT_HASH}'/"${TEMPLATE_GIT_HASH}"} +# shellcheck disable=SC2016 +PR_BODY=${PR_BODY//'${SOURCE_REPO}'/"${SOURCE_REPO}"} + +# shellcheck disable=SC2016 +PR_TITLE=${PR_TITLE//'${TEMPLATE_GIT_HASH}'/"${TEMPLATE_GIT_HASH}"} +# shellcheck disable=SC2016 +PR_TITLE=${PR_TITLE//'${SOURCE_REPO}'/"${SOURCE_REPO}"} + +debug "TEMPLATE_GIT_HASH ${TEMPLATE_GIT_HASH}" +debug "PR_BRANCH ${PR_BRANCH}" +debug "PR_BODY ${PR_BODY}" + +# Check if the Ignore File exists inside .github folder or if it doesn't exist at all +if [[ -f ".github/${TEMPLATE_SYNC_IGNORE_FILE_PATH}" || ! -f "${TEMPLATE_SYNC_IGNORE_FILE_PATH}" ]]; then + debug "using ignore file as in .github folder" + TEMPLATE_SYNC_IGNORE_FILE_PATH=".github/${TEMPLATE_SYNC_IGNORE_FILE_PATH}" +fi + +info "variables done" + +##################################################### +# Functions +##################################################### + +####################################### +# doing the login to the source repository using gh cli +# Arguments: +# github_server url +####################################### +function gh_login_target_github() { + echo "::group::login target github" + local github_server_url=$1 + + if [[ -n "${TARGET_GH_TOKEN}" ]]; then + target_repo_hostname=$(echo "${github_server_url}" | cut -d '/' -f 3) + info "target server url: ${target_repo_hostname}" + info "logging out of the target if logged in" + gh auth logout --hostname "${target_repo_hostname}" || debug "not logged in" + # unset GITHUB_TOKEN + info "login to the target git repository" + gh auth login --git-protocol "https" --hostname "${target_repo_hostname}" --with-token <<< "${TARGET_GH_TOKEN}" || warn "login with target token somehow did not work. Please consider using the \'target_github_token\` parameter." + gh auth setup-git --hostname "${target_repo_hostname}" + gh auth status --hostname "${target_repo_hostname}" + fi + + echo "::endgroup::" +} + +####################################### +# set the gh action outputs if run with github action. +# Arguments: +# pr_branch +# template_git_hash +####################################### +function set_github_action_outputs() { + echo "::group::set gh action outputs" + + local pr_branch=$1 + local template_git_hash=$2 + + info "set github action outputs" + + if [[ -z "${GITHUB_RUN_ID}" ]]; then + info "env var 'GITHUB_RUN_ID' is empty -> no github action workflow" + else + # https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter + echo "pr_branch=${pr_branch}" >> "$GITHUB_OUTPUT" + echo "template_git_hash=${template_git_hash}" >> "$GITHUB_OUTPUT" + fi + echo "::endgroup::" +} + +####################################### +# Check if the branch exists remote. +# Arguments: +# pr_branch +####################################### +function check_branch_remote_existing() { + + local branch_to_check=$1 + + info "check if the remote branch ${branch_to_check} exists. Exit if so" + + git ls-remote --exit-code --heads origin "${branch_to_check}" || branch_does_not_exist=true + + if [[ "${branch_does_not_exist}" != true ]]; then + warn "Git branch '${branch_to_check}' exists in the remote repository" + set_github_action_outputs "${branch_to_check}" + exit 0 + fi +} + +####################################### +# Check if the commit is already in history. +# exit 0 if so +# Arguments: +# template_remote_git_hash +####################################### +function check_if_commit_already_in_hist_graceful_exit() { + info "check if commit already in history" + + local template_remote_git_hash=$1 + + git cat-file -e "${template_remote_git_hash}" || commit_not_in_hist=true + if [ "${commit_not_in_hist}" != true ] ; then + warn "repository is up to date!" + exit 0 + fi +} + +########################################## +# check if there are staged files. +# exit if not +########################################## +function check_staged_files_available_graceful_exit() { + if git diff --quiet && git diff --staged --quiet; then + info "nothing to commit" + exit 0 + fi +} + +####################################### +# force source file deletion if they had been deleted +# Arguments: +# local_current_git_hash +####################################### +function force_delete_files() { + info "force delete files" + warn "force file deletion is enabled. Deleting files which are deleted within the target repository" + local local_current_git_hash=$1 + + info "current git hash: ${local_current_git_hash}" + + files_to_delete=$(git log --diff-filter D --pretty="format:" --name-only "${local_current_git_hash}"..HEAD | sed '/^$/d') + warn "files to delete: ${files_to_delete}" + if [[ -n "${files_to_delete}" ]]; then + echo "${files_to_delete}" | xargs rm + fi +} + +####################################### +# cleanup older prs based on labels. +# Arguments: +# upstream_branch +# pr_labels +# is_keep_branch_on_pr_cleanup +# local_branch_name +####################################### +function cleanup_older_prs () { + info "cleanup older prs" + + local upstream_branch=$1 + local pr_labels=$2 + local is_keep_branch_on_pr_cleanup=$3 + local local_branch_name=$4 + + if [[ -z "${pr_labels}" ]]; then + warn "env var 'PR_LABELS' is empty. Skipping older prs cleanup" + return 0 + fi + + older_prs=$(gh pr list \ + --base "${upstream_branch}" \ + --state open \ + --label "${pr_labels}" \ + --json number,headRefName \ + --jq '.[]') + + for older_pr in $older_prs + do + branch_name=$(echo "$older_pr" | jq -r .headRefName) + pr_number=$(echo "$older_pr" | jq -r .number) + + if [ "$branch_name" == "$local_branch_name" ] ; then + warn "local branch name equals remote pr branch name ${local_branch_name}. Skipping pr cleanup for this branch" + continue + fi + + if [ "$is_keep_branch_on_pr_cleanup" == true ] ; then + gh pr close -c "[actions-template-sync] :construction_worker: automatically closed because there is a new open PR. Branch is kept alive" "$pr_number" + debug "Closed PR #${older_pr} but kept the branch" + else + gh pr close -c "[actions-template-sync] :construction_worker: automatically closed because there is a new open PR" -d "$pr_number" + debug "Closed PR #${older_pr}" + fi + done +} + +################################## +# pull source changes +# Arguments: +# source_repo +# git_remote_pull_params +################################## +function pull_source_changes() { + info "pull changes from source repository" + local source_repo=$1 + local git_remote_pull_params=$2 + + eval "git pull ${source_repo} --tags ${git_remote_pull_params}" || pull_has_issues=true + + info "finished pulling from the source." + info "logging out from source ${SOURCE_REPO_HOSTNAME}." + + if [ "$pull_has_issues" == true ] ; then + warn "There had been some git pull issues." + warn "Maybe a merge issue." + warn "We go on but it is likely that you need to fix merge issues within the created PR." + fi + + gh_login_target_github "${GITHUB_SERVER_URL}" +} + +####################################### +# eventual create labels (if they are not existent). +# Arguments: +# pr_labels +####################################### +function eventual_create_labels () { + local pr_labels=$1 + info "eventual create labels ${pr_labels}" + + if [[ -z "${pr_labels}" ]]; then + info "'pr_labels' is empty. Skipping labels check" + retun 0 + fi + + readarray -t labels_array < <(awk -F',' '{ for( i=1; i<=NF; i++ ) print $i }' <<<"${pr_labels}") + for label in "${labels_array[@]}" + do + search_result=$(gh label list \ + --search "${label}" \ + --limit 1 \ + --json name \ + --template '{{range .}}{{printf "%v" .name}}{{"\n"}}{{end}}') + + if [ "${search_result}" = "${label##[[:space:]]}" ]; then + info "label '${label##[[:space:]]}' was found in the repository" + else + if gh label create "${label}"; then + info "label '${label}' was missing and has been created" + else + warn "label creation did not work. For any reason the former check sometimes is failing" + fi + fi + done +} + +############################## +# push the changes +# Arguments: +# branch +# is_force +# is_with_tags +############################## +function push () { + info "push changes" + + + local branch=$1 + local is_force=$2 + local is_with_tags=$3 + + args=(--set-upstream origin "${branch}") + + if [ "$is_force" == true ] ; then + warn "forcing the push." + args+=(--force) + fi + + if [ "$is_with_tags" == true ] ; then + warn "include tags." + args+=(--tags) + fi + + git push "${args[@]}" + +} + +#################################### +# creates a pr +# Arguments: +# title +# body +# branch +# labels +# reviewers +################################### +function create_pr() { + info "create pr" + local title=$1 + local body=$2 + local branch=$3 + local labels=$4 + local reviewers=$5 + + gh pr create \ + --title "${title}" \ + --body "${body}" \ + --base "${branch}" \ + --label "${labels}" \ + --reviewer "${reviewers}" || create_pr_has_issues=true + + if [ "$create_pr_has_issues" == true ] ; then + warn "Creating the PR failed." + warn "Eventually it is already existent." + return 1 + fi + return 0 +} + +#################################### +# creates or edits a pr if already existent +# Arguments: +# title +# body +# upstream_branch +# labels +# reviewers +################################### +function create_or_edit_pr() { + info "create pr or edit the pr" + local title=$1 + local body=$2 + local upstream_branch=$3 + local labels=$4 + local reviewers=$5 + local pr_branch=$6 + + create_pr "${title}" "${body}" "${upstream_branch}" "${labels}" "${reviewers}" || gh pr edit \ + --title "${title}" \ + --body "${body}" \ + --add-label "${labels}" \ + --add-reviewer "${reviewers}" +} + +######################################### +# restore the .templatesyncignore file +# Arguments: +# template_sync_ignore_file_path +########################################### +function restore_templatesyncignore_file() { + info "restore the ignore file" + local template_sync_ignore_file_path=$1 + if [ -s "${template_sync_ignore_file_path}" ]; then + git reset "${template_sync_ignore_file_path}" + git checkout -- "${template_sync_ignore_file_path}" || warn "not able to checkout the former .templatesyncignore file. Most likely the file was not present" + fi +} + +######################################### +# reset all files within the .templatesyncignore file +# Arguments: +# template_sync_ignore_file_path +########################################### +function handle_templatesyncignore() { + info "handle .templatesyncignore" + local template_sync_ignore_file_path=$1 + # we are checking the ignore file if it exists or is empty + # -s is true if the file contains whitespaces + if [ -s "${template_sync_ignore_file_path}" ]; then + debug "unstage files from template sync ignore ${template_sync_ignore_file_path}" + tr -d '\r' < "${template_sync_ignore_file_path}" | sed '/^[[:blank:]]*#/d;s/#.*//' | awk NF | xargs -r git reset -- + + debug "clean untracked files" + git clean -df + + debug "discard all unstaged changes" + git checkout -- . + fi +} + +######################################################## +# Logic +####################################################### + +function arr_prechecks() { + info "prechecks" + echo "::group::prechecks" + if [ "${IS_FORCE_PUSH_PR}" == "true" ]; then + warn "skipping prechecks because we force push and pr" + return 0 + fi + check_branch_remote_existing "${PR_BRANCH}" + + check_if_commit_already_in_hist_graceful_exit "${TEMPLATE_REMOTE_GIT_HASH}" + + echo "::endgroup::" +} + + +function arr_checkout_branch_and_pull() { + info "checkout branch and pull" + cmd_from_yml "prepull" + + echo "::group::checkout branch and pull" + + debug "create new branch from default branch with name ${PR_BRANCH}" + git checkout -b "${PR_BRANCH}" + debug "pull changes from template" + + pull_source_changes "${SOURCE_REPO}" "${GIT_REMOTE_PULL_PARAMS}" + + restore_templatesyncignore_file "${TEMPLATE_SYNC_IGNORE_FILE_PATH}" + + if [ "$IS_FORCE_DELETION" == "true" ]; then + force_delete_files "${LOCAL_CURRENT_GIT_HASH}" + fi + + echo "::endgroup::" +} + + +function arr_commit() { + info "commit" + + cmd_from_yml "precommit" + + echo "::group::commit changes" + + git add . + + handle_templatesyncignore "${TEMPLATE_SYNC_IGNORE_FILE_PATH}" + + check_staged_files_available_graceful_exit + + git commit --signoff -m "${PR_COMMIT_MSG}" + + echo "::endgroup::" +} + + +function arr_push() { + info "push" + + echo "::group::push" + if [ "$IS_DRY_RUN" == "true" ]; then + warn "dry_run option is set to on. skipping push" + return 0 + fi + cmd_from_yml "prepush" + push "${PR_BRANCH}" "${IS_FORCE_PUSH_PR}" "${IS_WITH_TAGS}" + echo "::endgroup::" +} + +function arr_prepare_pr_create_pr() { + info "prepare_pr_create_pr" + if [ "$IS_DRY_RUN" == "true" ]; then + warn "dry_run option is set to on. skipping labels check, cleanup older PRs, push and create pr" + return 0 + fi + echo "::group::check for missing labels" + + eventual_create_labels "${PR_LABELS}" + + echo "::endgroup::" + + echo "::group::cleanup older PRs" + if [ "$IS_PR_CLEANUP" != "false" ]; then + if [[ -z "${PR_LABELS}" ]]; then + warn "env var 'PR_LABELS' is empty. Skipping older prs cleanup" + else + cmd_from_yml "precleanup" + cleanup_older_prs "${UPSTREAM_BRANCH}" "${PR_LABELS}" "${IS_KEEP_BRANCH_ON_PR_CLEANUP}" "${PR_BRANCH}" + fi + else + warn "is_pr_cleanup option is set to off. Skipping older prs cleanup" + fi + + echo "::endgroup::" + + echo "::group::create PR" + + cmd_from_yml "prepr" + if [ "$IS_FORCE_PUSH_PR" == true ] ; then + create_or_edit_pr "${PR_TITLE}" "${PR_BODY}" "${UPSTREAM_BRANCH}" "${PR_LABELS}" "${PR_REVIEWERS}" + else + create_pr "${PR_TITLE}" "${PR_BODY}" "${UPSTREAM_BRANCH}" "${PR_LABELS}" "${PR_REVIEWERS}" + fi + + + echo "::endgroup::" +} + +declare -A cmd_arr +declare -a orders; + +cmd_arr["prechecks"]=arr_prechecks; orders+=("prechecks") +cmd_arr["pull"]=arr_checkout_branch_and_pull; orders+=("pull") +cmd_arr["commit"]=arr_commit; orders+=("commit") +cmd_arr["push"]=arr_push; orders+=("push") +cmd_arr["pr"]=arr_prepare_pr_create_pr; orders+=("pr") + +if [[ -z "${STEPS}" ]]; then + info "no steps provided. Default is to execute all." + for key in "${orders[@]}"; + do + debug "execute cmd ${key}" + ${cmd_arr[${key}]} + done +else + info "steps provided." + readarray -t steps < <(awk -F',' '{ for( i=1; i<=NF; i++ ) print $i }' <<<"${STEPS}") + # check if steps are supported + not_supported_steps="" + for step in "${steps[@]}"; + do + matched=false + for key in "${orders[@]}"; + do + debug "execute cmd ${key}" + if [[ "${step}" == "${key}" ]]; then + matched=true; + fi + done + if [[ "$matched" == 'false' ]]; then + not_supported_steps="${not_supported_steps} $step" + fi + done + if [[ -z "${not_supported_steps}" ]]; then + for step in "${steps[@]}"; + do + debug "execute cmd ${step}" + ${cmd_arr[${step}]} + done + else + err "following steps are not supported ${not_supported_steps}" + exit 1 + fi +fi + +set_github_action_outputs "${PR_BRANCH}" "${TEMPLATE_GIT_HASH}" diff --git a/third_party/AndreasAugustin/actions-template-sync/templatesync.yml b/third_party/AndreasAugustin/actions-template-sync/templatesync.yml new file mode 100644 index 00000000..da280480 --- /dev/null +++ b/third_party/AndreasAugustin/actions-template-sync/templatesync.yml @@ -0,0 +1,11 @@ +# validate + +hooks: + prepull: + commands: + - echo "foo ${MY_VAR}" + - echo 'hi, we are within the prepull phase' + prepush: + commands: + - echo 'hi, we are within the prepush phase' + - echo 'maybe you want to add further changes and commits' diff --git a/tools/third_party_sync/repos.lock.json b/tools/third_party_sync/repos.lock.json index 25979bfb..38019b0e 100644 --- a/tools/third_party_sync/repos.lock.json +++ b/tools/third_party_sync/repos.lock.json @@ -1,3 +1,11 @@ { - "repositories": {} + "repositories": { + "actions-template-sync": { + "published_at": "2025-07-16T19:52:05Z", + "resolved_commit": "8ec19a5f2721ffb81ff809aa340ddf75e6a85ea6", + "resolved_release": "v2.5.2", + "source": "release", + "tarball_url": "https://api.github.com/repos/AndreasAugustin/actions-template-sync/tarball/v2.5.2" + } + } }