Skip to content
You're viewing an older version of this GitHub Action. Do you want to see the latest version instead?
clock

GitHub Action

Copilot License Management

v1.2

Copilot License Management

clock

Copilot License Management

Automations to manage copilot licenses. Cleanup inactive, rollouts, reporting

Installation

Copy and paste the following snippet into your .yml file.

              

- name: Copilot License Management

uses: austenstone/[email protected]

Learn more about this action in austenstone/copilot-license-cleanup

Choose a version

Copilot License Cleanup

Run this action on a schedule to automatically remove inactive Copilot licenses. It also creates a report as a job summary and csv.

Usage

Create a workflow (eg: .github/workflows/copilot-license-cleanup.yml). See Creating a Workflow file.

PAT(Personal Access Token)

You will need to create a PAT(Personal Access Token) that has manage_billing:copilot access. If you are specifying an 'enterprise' rather than individual organizations you must also include the read:org and read:enterprise scopes.

Add this PAT as a secret TOKEN so we can use it for input github-token, see Creating encrypted secrets for a repository.

Organizations

If your organization has SAML enabled you must authorize the PAT, see Authorizing a personal access token for use with SAML single sign-on.

Example

name: Cleanup Copilot Licenses
on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * *'

jobs:
  copilot:
    name: Copilot Seats
    runs-on: ubuntu-latest
    steps:
      - uses: austenstone/[email protected]
        with:
          github-token: ${{ secrets.TOKEN }}

Example Auto remove

      - uses: austenstone/[email protected]
        with:
          github-token: ${{ secrets.TOKEN }}
          remove: true
          remove-from-team: true

Example Custom days before inactive

      - uses: austenstone/[email protected]
        with:
          github-token: ${{ secrets.TOKEN }}
          remove: true
          remove-from-team: true
          inactive-days: 10

Example Specifying multiple organizations:

      - uses: austenstone/[email protected]
        with:
          github-token: ${{ secrets.TOKEN }}
          organization: exampleorg1, demoorg2, myorg3

Example specifying a GitHub Enterprise (to run on all organizations in the enterprise):

      - uses: austenstone/[email protected]
        with:
          github-token: ${{ secrets.TOKEN }}
          enterprise: octodemo

Example uploading inactive users JSON artifact

      - uses: austenstone/[email protected]
        id: copilot
        with:
          github-token: ${{ secrets.TOKEN }}
      - name: Save inactive seats JSON to a file
        run: |
          echo '${{ steps.copilot.outputs.inactive-seats }}' | jq . > inactive-seats.json
      - name: Upload inactive seats JSON as artifact
        uses: actions/upload-artifact@v4
        with:
          name: inactive-seats-json
          path: inactive-seats.json
Job summary example

➡️ Inputs

Various inputs are defined in action.yml:

Name Description Default
github‑token Token to use to authorize. ${{ github.token }}
organization The organization(s) to use for the action (comma separated) ${{ github.repository_owner }}
enterprise (optional) All organizations in this enterprise (overrides organization) null
remove Whether to remove inactive users false
remove-from-team Whether to remove inactive users from their assigning team false
inactive‑days The number of days to consider a user inactive 90
job-summary Whether to output a summary of the job true
csv Whether to output a CSV of inactive users false

⬅️ Outputs

Name Description
inactive-seats JSON array of inactive seats
inactive-seat-count The number of inactive seats
removed-seats The number of seats removed
seat-count The total number of seats

How does it work?

We're simply leveraging the GitHub Copilot API. First we fetch all the Copilot seats and filter them to only inactive seats. Then if the seat is assigned directly we remove it but if it's assigned through a team we remove the user from the team. Those inactive users are reported as a CSV and a job summary table.

Further help

To get more help on the Actions see documentation.