{"id":33126,"url":"https://github.com/Alliedium/awesome-github-actions","name":"awesome-github-actions","description":"Discover a collection of GitHub Actions workflow examples that will supercharge your development process. Level up your projects with the efficiency and reliability of GitHub Actions, saving time and ensuring high-quality code","projects_count":30,"last_synced_at":"2026-07-29T11:00:17.949Z","repository":{"id":176967252,"uuid":"655671820","full_name":"Alliedium/awesome-github-actions","owner":"Alliedium","description":"Discover a collection of GitHub Actions workflow examples that will supercharge your development process. Level up your projects with the efficiency and reliability of GitHub Actions, saving time and ensuring high-quality code","archived":false,"fork":false,"pushed_at":"2024-02-15T09:19:51.000Z","size":1497,"stargazers_count":20,"open_issues_count":0,"forks_count":16,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-07-10T11:05:34.401Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Alliedium.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-06-19T11:10:42.000Z","updated_at":"2026-02-15T21:02:02.000Z","dependencies_parsed_at":"2024-01-13T15:14:30.073Z","dependency_job_id":"4f9a4905-2992-4e08-ba88-a36818365494","html_url":"https://github.com/Alliedium/awesome-github-actions","commit_stats":null,"previous_names":["alliedium/awesome-github-actions"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Alliedium/awesome-github-actions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alliedium%2Fawesome-github-actions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alliedium%2Fawesome-github-actions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alliedium%2Fawesome-github-actions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alliedium%2Fawesome-github-actions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Alliedium","download_url":"https://codeload.github.com/Alliedium/awesome-github-actions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alliedium%2Fawesome-github-actions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36029680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-29T02:00:04.910Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"created_at":"2024-01-13T12:58:47.810Z","updated_at":"2026-07-29T11:00:17.950Z","primary_language":null,"list_of_lists":false,"displayable":true,"categories":["References","Example 02: Event triggers","Example 07a: [Self-hosted runners for multiple jobs](./README_SELFHOSTED_RUNNERS.md)","[Ignite migration tool](https://github.com/Alliedium/ignite-migration-tool)","Example 03: Actions"],"sub_categories":["Install Nektos Act on Ubuntu Jammy"],"readme":"# Awesome GitHub Actions\n\nThis repository serves as a comprehensive collection of GitHub Actions workflow examples. \nIt provides a variety of workflow configurations that demonstrate different use cases and \nbest practices for automating CI/CD processes using GitHub Actions. Each \nexample includes a name for the workflow, a list of trigger events, and a set of jobs. Each \njob contains a list of steps that execute in order when the job runs. These steps may access\n environment variables, conditions, expressions, and secrets to perform various actions, \n such as checking out the source repository, running scripts, and setting up a `tmate` session\n for debugging purposes. Examples cover different areas of functionality, such as job \n matrix, parallel jobs, job ordering, context variables, expression evaluation, outputting \n variables, and event triggers.\n\n## GitHub Actions\nGitHub Actions is a CI/CD platform for automatic build, test, and deployment. GitHub Actions allows you to run workflows when a `push`, `pull request`, or other `event` happens in your repository. You can use virtual machines provided by GitHub or manage your own runners in your own infrastructure.\nWorkflow is a process that runs one or more jobs. They can be run either in parallel or in sequential order. \nWorkflow basics:\n- One or more `events` that will trigger the workflow. `Event` is a specific activity in a repository.\n- One or more `jobs`, each of which will execute on a `runner` machine and run a series of one or more `steps`. By default, every job is independent\n- Each `step` can either run a script that you define or run an `action`, which is a reusable extension that can simplify your workflow\n- Each `Runner` is a newly-provisioned virtual machine. GitHub provides Ubuntu Linux, MS Windows, and macOS runners. You can host your runner as well. Every runner executes a single job. \n  \nWorkflow files are `yaml` files and are placed in the `.github/workflows` directory in your repository on GitHub. \n\n## Examples \n **Note** **_By default, all workflows will be executed on the `ubuntu-latest ` image unless otherwise specified_**\n\n## Example 01: Hello world! \n\n*_Get familiar with basic workflow syntax_*\n\nThis example workflow prints `current path`, `Hello world`, followed by `Step 1…`, `Step 2…`, `Step 3…`, and finally `Goodbye`.\n\n   **Elements of current workflow:**\n1. Name of workflow (optional element)\n   ```yaml\n   name: hello-world-example\n   ```\n2. The `on` section defines what event triggers the workflow. Here, the trigger event is `push`. \nThe optional parameter `paths` allows to run a workflow based on what files or directories are changed.\n\n   ```yaml\n    on:\n      push:\n        paths:\n          - '.github/workflows/01-hello-world.yml'\n   ```\n3. Job. The job name is `say-hello`.\nThe keyword `runs-on` configures the job to run on the latest version of an Ubuntu Linux runner.\n   ```yaml\n    jobs:\n      say-hello:\n        runs-on: ubuntu-latest\n   ```\n\n4. `Steps` are a list of commands to run. The `uses` keyword specifies the action used in this job: `actions/checkout` version`v2`. \n   This is an action that checks out your repository onto the runner. \n   You should use the `checkout action` any time your workflow will run against the repository's code.\n   The Next step sets the option `working-directory` to the indicated path and prints the current path.\n   ```yaml\n            steps:\n              - uses: actions/checkout@v3\n       \n              - name: Print current path\n                working-directory: ./01-hello-world\n                run: pwd\n   ```\n5. Pipe `|` is used to start multiple strings in a `yaml` file\n   ```yaml      \n      - name: Do stuff\n        run: |\n          echo \"Step 1...\"\n          echo \"Step 2...\"\n          echo \"Step 3...\"\n          echo \"Step 4...\"\n   ```\n\n## Example 02: Event triggers \n\n*_This example demonstrates how to trigger workflow on different events_*\n\nThe `on` section defines what event triggers the workflow. List of events you can see [here](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows). \nOptionally, you may include/exclude `branches`, `tags`, or `paths` that trigger workflow by indicating their name or pattern to match. \nYou may define multiple events and options for them to customize your workflow run. Also, it is possible to set a schedule to run your workflow,\nspecified with [POSIX cron syntax](https://crontab.guru/).\n\n  ```yaml\n  on: \n    push:\n       branches: \n         - '02-develop'\n         - '02-foo/*'\n         - '02-foo/**'\n         - '!02-foo/*/456' #except\n       tags:\n         - '*'\n       paths:\n         - '.github/workflows/02-event-triggers.yml'\n    pull_request:\n      branches:\n        - '02-develop'\n      paths:\n        - '.github/workflows/02-event-triggers.yml'\n    schedule:\n      - cron: '*/15 * * * *'\n   ```\nStep prints the event name that triggered it.:\n   ```yaml\n         - name: Event\n           run: echo \"Triggered by $GITHUB_EVENT_NAME\"\n   ```\n\n## Example 03: Actions\n\n*_This example demonstrates the usage of different actions type in one workflow_*\n\nActions reduce number of steps by providing reusable `code` for common tasks, such as checkout to gitHub repository or installing node. \nTo run an action include keyword `uses` pointing to a GitHub repo with the pattern `{owner}/{repo}@{ref}` or `{owner}/{repo}/{path}@{ref}`. A `ref` can be a branch, tag or SHA. Some actions have required or optional parameters.\nGitHub officially supports many common [actions](https://github.com/actions).\n\nExample of usage of the different actions in workflow:\n   ```yaml\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-node@v3\n        with:\n          node-version: '15.8.0'\n   ```\n\nIn these steps : \n- [actions/checkout](https://github.com/actions/checkout) checks out your repo into the working directory at the event that triggered workflow (e.g., branch push) \n- [actions/setup-node](https://github.com/actions/setup-node) sets up your workflow with a specific node version, and makes node and npm available in the following steps.\n\n## Example 04: Environment variables\n\n*_Using environment variables in different contexts_* \n\nEnvironment variables can be:\n* default. Find the list of default variables [here](https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables) and defined by the user.\n* or custom for:\n  * **a single workflow**. Use the `env` key within the workflow file to create a variable for a single workflow. The scope of the variables can be: the entire workflow, job, or a specific step. The variable's scope is limited to the element in which it is defined.\n  * **multiple workflows**. Variables and secrets can be created at different levels: [organization](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-an-organization), [repository](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository) and [environment](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-an-environment) levels.\n\nJob:\n```yaml\njobs:\n  use-env-vars:\n    runs-on: ubuntu-latest\n    env:\n      VIDI: 'I saw'\n```\nStep:\n```yaml\n    steps:\n   ...\n      - name: Show me the vars\n        run: echo \"$VENI, $VIDI, $VICI\"\n        env:\n          VICI: 'I conquered'\n```\nAlso, you can set new environment variables by adding it to GITHUB_ENV. The variable will be available in next steps.\n```yaml\n      - name: Create env var\n        run: echo \"foo=bar\" \u003e\u003e $GITHUB_ENV\n```\nGet values of the environment variables:\n```yaml\n      - name: Useful default vars\n        run: |\n          echo \"Workflow name:  $GITHUB_WORKFLOW\"\n          echo \"Workspace:      $GITHUB_WORKSPACE\"\n          echo \"Event:          $GITHUB_EVENT_NAME\"\n          echo \"SHA:            $GITHUB_SHA\"\n          echo \"Ref:            $GITHUB_REF\"\n```\nGet list of all environment variables:\n```yaml\n      - name: Show env variables list\n        run: env\n```\n\n## Example 05: Parallel jobs\n\n_*Running jobs in parallel*_\n\nMultiple jobs are running in parallel by default and have a particular runner:\n```yaml\njobs:\n  job-a:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo \"Doing work\"\n  job-b:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n```\n\n## Example 06: Job ordering\n\n_*By default, all jobs are running in parallel. To force job ordering use the `needs` keyword*_\n\nIt is possible to wait for one or more jobs:\n```yaml\n  job3:\n    runs-on: ubuntu-latest\n    needs: job1\n    steps:\n      - run: echo \"job1 done, running job3\"\n  job4:\n    runs-on: ubuntu-latest\n    needs: [job2, job3]\n    steps:\n      - run: echo \"job2 \u0026 job3 done, running job4\"\n```\n`job5` will run even if `job1` will fail\n```yaml\n  job5:\n    runs-on: ubuntu-latest\n    if: ${{ always() }}\n    needs: job1\n    steps:\n      - run: echo \"job1 completed with status ${{ needs.job1.result }}, running job5\n```\nThe diagram of the job running sequence is provided\n```mermaid\n%%{init: {'flowchart': {\"curve\":\"linear\"} } }%%\ngraph LR\nA[job1] --\u003e |on success| C[job3]\nB[job2] \u0026 C[job3] --\u003e |on success| D[job4]\nA[job1] --\u003e |always| E[job5]\n```\n\n## Example 07: Job matrix \n\n_*You can run multiple jobs with different configurations by using a job matrix. Jobs defined by matrix run in parallel by default*_ \n\nThe `matrix` keyword is how you define a job matrix. Each user-defined key is a matrix parameter. Here we’ve defined two parameters: `os`, for the \nrunner's OS, and `node`, to indicate the node version. Each value of the parameters from the list is used in a `cartesian product` to create jobs. \nThis section defines a 2 x 3 matrix of 6 jobs, each with a different combination of `os` and `node`. The `exclude` keyword prevents jobs with\nspecific configurations from running. The `include` allows you to add new jobs to the matrix. Note that the `include` rules are always \nevaluated after the `exclude` rules.\n```yaml\n  my-job:\n    strategy:\n      matrix:\n        os: [ubuntu-18.04, ubuntu-22.04]\n        node: [14, 16, 18]\n        exclude:\n        - os: ubuntu-18.04\n          node: 14\n```\n\n## Example 07a: [Self-hosted runners for multiple jobs](./README_SELFHOSTED_RUNNERS.md)\n\nA `runner` is a server that runs your workflows when they're triggered. Each runner can run a single job at a time. GitHub provides Ubuntu Linux, Microsoft Windows, and macOS runners to run your workflows; each workflow run executes in a fresh, newly-provisioned virtual machine. If you need a different operating system or require a specific hardware configuration, you can host your [own runners](https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).\nA self-hosted runner is a system that you deploy and manage to execute jobs from GitHub Actions on GitHub.com.\n\n## Example 08: Outputs\n\nOutput data can be shared between `jobs` and `steps`.\nCreate outputs for a step by writing to stdout in the format of \u003cname\u003e=\u003cvalue\u003e:\n\n   ```yaml\n      - name: Do Work\n        run: |\n          echo \"FAV_NUMBER=3\" \u003e\u003e $GITHUB_OUTPUT\n          echo \"FAV_COLOR=blue\" \u003e\u003e $GITHUB_OUTPUT\n        id: abc\n   ```\nA step can have multiple outputs. Steps that create outputs must have a unique `id`.\nUse the steps context variable and step `id` to get the value `${{steps.\u003cstep_id\u003e.outputs.\u003cstep_output_name\u003e}}`:\n```yaml\n      - name: Read output\n        run: |\n          echo \"${{steps.abc.outputs.FAV_NUMBER}}\"\n          echo \"${{steps.abc.outputs.FAV_COLOR}}\"\n```\nCreate outputs for a job that will be available to other jobs that need it (see Job Ordering).\nYou can include output from steps that ran for the job.\n```yaml\n    job1:\n    outputs:\n      fav-animal: tiger\n      fav-number: ${{steps.abc.outputs.FAV_NUMBER}}\n```\nUse context expressions to grab outputs from a job included in needs\n`needs: \u003cjob_name\u003e`, to address output `${{needs.\u003cjob_name\u003e.outputs.\u003cjob_output_name\u003e}}`:\n  ```yaml\n     job2:\n       runs-on: ubuntu-latest\n       needs: job1\n       steps:\n         - run: |\n            echo \"${{needs.job1.outputs.fav-animal}}\"\n            echo \"${{needs.job1.outputs.fav-number}}\"\n   ```\n\n## Example 09: Context\n\n_*`Contexts` are a way to access information about workflow runs, variables, runner environments, jobs, and steps. Each context is an object that contains properties, which can be strings or other objects. Context variables are accessible outside the run commands.*_\n\nUsing values of the `matrix` context:\n```yaml\n        env:\n          GREETING: ${{ matrix.greeting }}\n```\nAccessing value of the secret `USERNAME` defined in the GitHub:\n```yaml\n        env:\n          A_SECRET: ${{ secrets.USERNAME }}\n```\nUsing event name in expression:\n```yaml\n        if: ${{ github.event_name == 'pull_request' }}\n```\n\n## Example 10: Expressions\n\n_*Workflows support evaluating expressions,comparisons and simple functions.*_\n\nString comparison:\n```yaml\n      - name: Print if 'Hello'\n        if: ${{ matrix.greeting == 'Hello' }}\n        run: echo \"greeting is Hello\"\n      - name: Print if starts with 'He'\n        if: ${{ startsWith(matrix.greeting, 'He') }}\n        run: echo \"greeting starts with He\"\n      - name: Print if ends with 'y'\n        if: ${{ endsWith(matrix.greeting, 'y') }}\n        run: echo \"greeting ends with y\"\n      - name: Print if contains 'ow'\n        if: ${{ contains(matrix.greeting, 'ow') }}\n        run: echo \"greeting contains ow\"\n```\nFormatting:\n```yaml\n      - name: Print formatted greeting\n        run: |\n          echo \"${{ format('{0} says {1}', github.actor, matrix.greeting) }}\"\n```\nWorking with `JSON`:\n```yaml\n      - name: To JSON\n        run: echo 'Job context is ${{ toJSON(job) }}'\n      - name: From JSON\n        env: ${{ fromJSON('{\"FAVORITE_FRUIT\":\"APPLE\", \"FAVORITE_COLOR\":\"BLUE\"}') }}\n        run: echo \"I would like a ${FAVORITE_COLOR} ${FAVORITE_FRUIT}\"\n```\nRunning basing on previous results:\n```yaml\n      - name: Success\n        if: ${{ success() }}\n        run: echo \"Still running...\"\n      - name: Always\n        if: ${{ always() }}\n        run: echo \"You will always see this\"\n      - name: Cancelled\n        if: ${{ cancelled() }}\n        run: echo \"You canceled the workflow\"\n      - name: Failure\n        if: ${{ failure() }}\n        run: echo \"Something went wrong...\"\n```\n\n## Example 11: `Tmate` terminal\n\n_*The `Tmate` session will be started after fail on the previous step. Use this failing workflow for training*_\n\nThe workflow will fail on the following step because `npm` is not installed and no node action is used in this workflow. \n\n```yaml\n      - name: Run tests\n        working-directory: ./11-tmate\n        run: npm test\n```\nOpen the `tmate` session using the HTTP link from your workflow logs. \nIf `tmate` is [installed](./README_SELFHOSTED_RUNNERS.md#7-debugging-running-workflow) on your machine you may also connect to the session throw terminal. The command is provided in your logs as well.\n\n![tmate.png](./images/tmate.png)\n\nRun npm install:\n\n```shell\n   npm ci\n```\n\nand check if tests will pass:\n\n```shell\n   npm test\n```\n\ncontinue workflow run by creating a file:\n\n```shell\ntouch /continue\n```\n\n## Example 12: Postgres service\nThis example workflow configures a `PostgreSQL` service container, and automatically maps port `5432` in the service container to a _randomly_ chosen available port on the `host`. The `job context` is used to access the number of the port that was assigned on the host.        \n**Create a secret at the repository level with the name `POSTGRES_PASSWORD`**      \n```yaml\njobs:\n  postgres-job:\n    runs-on: ubuntu-latest\n    services:\n      postgres:\n        image: postgres\n        env:\n          POSTGRES_PASSWORD: postgres\n        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5\n        ports:\n          # Maps TCP port 5432 in the service container to a randomly chosen available port on the host.\n          - 5432\n```\n\n## Example 13: Get secret value\nGet a value of the secret with the name `NEW_SECRET`. If the secret does not exist value will be empty. Please create a secret with the same name or replace name with the one of an existing secret\n```yaml\n    steps:\n      - name: Echo secret's value\n        run: |\n          echo \"Masked: \"\n          echo ${{ secrets.NEW_SECRET }}    \n          echo \"Unmasked: \"\n          echo ${{ secrets.NEW_SECRET }} | sed 's/./\u0026 /g'\n```\n## Nektos Act\n### Install Nektos Act on Ubuntu Jammy\n\n```shell\nsudo apt install act\n```\nTo install `Nektos Act` on other OS follow the instructions from [section](https://github.com/nektos/act#installation-through-package-managers)\n\nTo run the following commands you should clone a GitHub project with existing GitHub Actions workflows and go to its directory. You can use the current project, too.\n\n1. View all jobs that are triggered by pull_request event\n```shell\nact -l\n```\n2. View all jobs triggered by events, e.g. by the `pull_request`\n```shell\nact \u003cevent-name\u003e -l\n```\n```shell\nact pull_request -l\n```\nor in the certain workflow file, e.g. in `main.yaml`\n```shell\nact \u003cfile-name\u003e -l\n```\n```shell\nact main.yaml -l\n```\n3. Run a job with a specific name:\n```shell\nact -j \u003cjob-name\u003e \n```\n4. You may also explicitly indicate the workflow and job to run using flags `--workflow`and `--job`, respectively, flag `--verbosity` enables additional logging.\n```shell\nact --workflows .github/workflows/main.yml --verbose --job my-job\n```\n5. Use an alternative environment to run your workflows. `runner-image-name` - should be the same as in the workflow `yaml` file\n```shell\nact -P \u003crunner-image-name\u003e=\u003cimage-to-be-used\u003e\n```\n```shell\nact -P ubuntu-latest=catthehacker/ubuntu:act-20.04\n```\n6. If your workflow file has a `tmate` section (See Example 11) you may access it using docker commands\n```shell\nwatch docker ps\n```\ncopy the first three symbols of the container's ID \u003cXYZ\u003e and run the command    \n```shell\ndocker exec -it \u003cXYZ\u003e sh\n```\n\n## [Ignite migration tool](https://github.com/Alliedium/ignite-migration-tool)\n\n1. [About project](https://github.com/Alliedium/ignite-migration-tool/blob/main/README.md)\n2. [Apache Ignite Migration Tool CI/CD](https://github.com/Alliedium/ignite-migration-tool/blob/main/README_CI.md)\n3. [Apache Ignite Migration Tool CI/CD GPG](https://github.com/Alliedium/ignite-migration-tool/blob/main/README_GPG.md)\n\n\n## References\n#### GitHub Actions\n1. [GitHub Actions workflows](https://docs.github.com/en/actions/using-workflows/about-workflows)\n2. [GitHub Actions workflows basics, examples and a quick tutorial](https://codefresh.io/learn/github-actions/github-actions-workflows-basics-examples-and-a-quick-tutorial/)\n3. [Trigger a workflow](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow)\n4. [Job environments](https://docs.github.com/en/actions/using-jobs/using-environments-for-jobs)\n5. [Expressions in GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/expressions)\n6. [GitHub Actions contexts](https://docs.github.com/en/actions/learn-github-actions/contexts)\n7. [GitHub Actions variables](https://docs.github.com/en/actions/learn-github-actions/variables)\n8. [GitHub Actions common actions](https://github.com/actions)\n9. [Good security practices for using GitHub Actions features](https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions)\n10. [Encrypted secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets)\n11. [Outputs for jobs](https://docs.github.com/en/actions/using-jobs/defining-outputs-for-jobs)\n12. [Output commands](https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/)\n13. [Tmate actions](https://github.com/mxschmitt/action-tmate)\n14. [Job services](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idservices)\n\n#### Act\n15. [Act](https://github.com/nektos/act)\n16. [GitHub Actions on your local machine](https://dev.to/ken_mwaura1/run-github-actions-on-your-local-machine-bdm)\n17. [Debug GitHub Actions locally with act](https://everyday.codes/tutorials/debug-github-actions-locally-with-act/)\n\n#### Tools\n18. [Lastversion tool](https://github.com/dvershinin/lastversion)","projects_url":"https://awesome.ecosyste.ms/api/v1/lists/alliedium%2Fawesome-github-actions/projects"}