@@ -64,6 +64,11 @@ jobs:
|
||||
node-version-file: 'package.json'
|
||||
cache: npm
|
||||
|
||||
# Currently we only need this to run dependencies in
|
||||
# src/workflows/check-canary-slots.js
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Clone docs-early-access
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
|
||||
@@ -23,9 +23,7 @@ You can set up a {% data variables.product.prodname_copilot %} subscription for
|
||||
* **For an organization**, you can set up a subscription to {% data variables.product.prodname_copilot_for_business %}, then grant access to members.
|
||||
* **For an enterprise on {% data variables.product.prodname_ghe_cloud %}**, you can set up a subscription to {% data variables.product.prodname_copilot_for_business %} or {% data variables.product.prodname_copilot_enterprise %}, then allow organizations to grant access to members.
|
||||
|
||||
A free subscription for {% data variables.product.prodname_copilot %} is available to verified students, teachers, and maintainers of popular open-source repositories on {% data variables.product.company_short %}. If you meet the criteria as an open source maintainer, you will be automatically notified when you visit the {% data variables.product.prodname_copilot %} subscription page. As a student, if you receive the {% data variables.product.prodname_student_pack %}, you will also be offered a free subscription when you visit the {% data variables.product.prodname_copilot %} subscription page. For more information about the {% data variables.product.prodname_student_pack %}, see "[AUTOTITLE](/free-pro-team@latest/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-global-campus-for-students/apply-to-github-global-campus-as-a-student)."
|
||||
|
||||
{% data reusables.billing.billing-info %}
|
||||
> [!NOTE] A free subscription for {% data variables.product.prodname_copilot %} is available to verified students, teachers, and maintainers of popular open-source repositories on {% data variables.product.company_short %}. See "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/getting-free-access-to-copilot-as-a-student-teacher-or-maintainer)."
|
||||
|
||||
## About billing for {% data variables.product.prodname_copilot_for_individuals %}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ For more information, see "[AUTOTITLE](/copilot/about-github-copilot/github-copi
|
||||
|
||||
* _Sign up for a subscription to {% data variables.product.prodname_copilot_for_individuals %}_. You can <a href="https://github.com/github-copilot/signup?ref_cta=Copilot+trial&ref_loc=about+github+copilot&ref_page=docs" target="_blank"><span>try {% data variables.product.prodname_copilot %} for free</span></a> with a one-time 30-day trial. After the free trial, you will need a paid subscription for continued use.
|
||||
* _If you are a member of an organization or enterprise_ that has a subscription to {% data variables.product.prodname_copilot %}, you can request access to {% data variables.product.prodname_copilot_short %} by going to [https://github.com/settings/copilot](https://github.com/settings/copilot) and requesting access under "Get Copilot from an organization."
|
||||
* _If you are a verified student, teacher, or maintainer of a popular open source project_, {% data variables.product.prodname_copilot %} is free to use. See "[AUTOTITLE](/billing/managing-billing-for-github-copilot/about-billing-for-github-copilot)."
|
||||
* _If you are a verified student, teacher, or maintainer of a popular open source project_, {% data variables.product.prodname_copilot %} is free to use. See "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/getting-free-access-to-copilot-as-a-student-teacher-or-maintainer)."
|
||||
|
||||
**As an organization owner or enterprise admin**, you can purchase a subscription to {% data variables.product.prodname_copilot_for_business %} or {% data variables.product.prodname_copilot_enterprise %} for your organization or enterprise, and allow organizations to grant access to members. For more information, see "[AUTOTITLE](/copilot/about-github-copilot/)"
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
title: Getting free access to Copilot as a student, teacher, or maintainer
|
||||
shortTitle: Get free access
|
||||
intro: 'Learn how to use {% data variables.product.prodname_copilot_short %} for free as a student, teacher, or open-source maintainer.'
|
||||
versions:
|
||||
feature: copilot
|
||||
type: how_to
|
||||
topics:
|
||||
- Copilot
|
||||
---
|
||||
|
||||
## About free {% data variables.product.prodname_copilot_short %} access
|
||||
|
||||
There are three ways to qualify for free access to {% data variables.product.prodname_copilot_for_individuals %}:
|
||||
|
||||
* **As a verified student on {% data variables.product.prodname_education %}.** To learn about becoming a verified student, see "[AUTOTITLE](/free-pro-team@latest/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-education-for-students/apply-to-github-education-as-a-student)."
|
||||
* **As a verified teacher on {% data variables.product.prodname_education %}.** To learn about becoming a verified teacher, see "[AUTOTITLE](/free-pro-team@latest/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-education-for-teachers/apply-to-github-education-as-a-teacher)."
|
||||
* **As a maintainer of a popular open-source repository.** To determine if you are an eligible maintainer, see "[Accessing {% data variables.product.prodname_copilot %} for free](#accessing-github-copilot-for-free)."
|
||||
|
||||
{% data variables.product.company_short %} reevaluates your eligibility every month.
|
||||
|
||||
> [!NOTE] If you do not meet the previous criteria, you can still <a href="https://github.com/github-copilot/signup?ref_cta=Copilot+trial&ref_loc=about+github+copilot&ref_page=docs" target="_blank"><span>try {% data variables.product.prodname_copilot %} for free</span></a> with a one-time 30-day trial. After the free trial, you will need a paid subscription for continued use.
|
||||
|
||||
## Accessing {% data variables.product.prodname_copilot %} for free
|
||||
|
||||
1. In the upper-right corner of any page, click your profile photo, then click **{% octicon "copilot" aria-hidden="true" %} Your {% data variables.product.prodname_copilot_short %}**.
|
||||
1. If you qualify for free access to {% data variables.product.prodname_copilot_short %}, you will see a page titled "{% data variables.product.prodname_copilot_for_individuals %}" informing you that you are eligible. Click **Get access to {% data variables.product.prodname_copilot %}**.
|
||||
1. On the page that appears, configure the {% data variables.product.prodname_copilot_short %} use policies to meet your needs, then click **Save and complete**.
|
||||
@@ -7,6 +7,7 @@ versions:
|
||||
topics:
|
||||
- Copilot
|
||||
children:
|
||||
- /getting-free-access-to-copilot-as-a-student-teacher-or-maintainer
|
||||
- /subscribing-to-copilot-as-an-individual-user
|
||||
- /installing-github-copilot-extensions-for-your-personal-account
|
||||
- /managing-copilot-policies-as-an-individual-subscriber
|
||||
@@ -14,4 +15,3 @@ children:
|
||||
- /canceling-your-copilot-trial-as-an-individual-user
|
||||
- /canceling-copilot-as-an-individual-user
|
||||
---
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ There are a few ways that you can get access to {% data variables.product.prodna
|
||||
|
||||
* _Sign up for a subscription to {% data variables.product.prodname_copilot_for_individuals %}_. You can <a href="https://github.com/github-copilot/signup?ref_cta=Copilot+trial&ref_loc=about+github+copilot&ref_page=docs" target="_blank"><span>try {% data variables.product.prodname_copilot %} for free</span></a> with a one-time 30-day trial. After the free trial, you will need a paid subscription for continued use.
|
||||
* _If you are a member of an organization or enterprise_ that has a subscription to {% data variables.product.prodname_copilot %}, you can request access to {% data variables.product.prodname_copilot_short %} by going to [https://github.com/settings/copilot](https://github.com/settings/copilot) and requesting access under "Get Copilot from an organization."
|
||||
* _If you are a verified student, teacher, or maintainer of a popular open source project_, {% data variables.product.prodname_copilot %} is free to use. See "[AUTOTITLE](/billing/managing-billing-for-github-copilot/about-billing-for-github-copilot)."
|
||||
* _If you are a verified student, teacher, or maintainer of a popular open source project_, {% data variables.product.prodname_copilot %} is free to use. See "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/getting-free-access-to-copilot-as-a-student-teacher-or-maintainer)."
|
||||
|
||||
## 2. Install the {% data variables.product.prodname_copilot_short %} extension for your IDE
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ Once you are a verified {% data variables.product.prodname_global_campus %} stud
|
||||
* Discover student-created repositories from {% data variables.product.prodname_community_exchange %}. For more information, see "[AUTOTITLE](/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-global-campus-for-students/about-github-community-exchange)."
|
||||
|
||||
{% data variables.product.prodname_global_campus %} students also receive the following {% data variables.product.prodname_dotcom %} benefits.
|
||||
* **{% data variables.product.prodname_copilot %}**: Verified students receive a free subscription for {% data variables.product.prodname_copilot %}. You will be automatically notified about the free subscription when you visit the {% data variables.product.prodname_copilot %} subscription page in your account settings. For more information about subscribing to and using {% data variables.product.prodname_copilot %}, see "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/subscribing-to-copilot-as-an-individual-user)."
|
||||
* **{% data variables.product.prodname_copilot %}**: Verified students receive a free subscription for {% data variables.product.prodname_copilot %}. See "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/getting-free-access-to-copilot-as-a-student-teacher-or-maintainer)."
|
||||
* **{% data variables.product.prodname_github_codespaces %}**: {% data reusables.education.student-codespaces-benefit %} For more information on getting started with {% data variables.product.prodname_github_codespaces %}, see "[AUTOTITLE](/codespaces/overview)."
|
||||
|
||||
{% note %}
|
||||
|
||||
@@ -29,7 +29,7 @@ Before applying for an individual discount, check if your learning community is
|
||||
* Stay in the know on what the student community is interested in by rewatching recent [Campus TV](https://www.twitch.tv/githubeducation) episodes. Campus TV is created by {% data variables.product.prodname_dotcom %} and student community leaders and can be watched live or on demand.
|
||||
* Request a {% data variables.product.prodname_dotcom %} swag bag with educational materials and goodies for your students.
|
||||
|
||||
A free subscription for {% data variables.product.prodname_copilot %} is available to verified teachers with {% data variables.product.prodname_education %}. You will be automatically notified about the free subscription when you visit the {% data variables.product.prodname_copilot %} subscription page in your account settings. For more information about subscribing to and using {% data variables.product.prodname_copilot %}, see "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/subscribing-to-copilot-as-an-individual-user)" and "[AUTOTITLE](/copilot/about-github-copilot/what-is-github-copilot)."
|
||||
A free subscription for {% data variables.product.prodname_copilot %} is available to verified teachers with {% data variables.product.prodname_education %}. See "[AUTOTITLE](/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/getting-free-access-to-copilot-as-a-student-teacher-or-maintainer)."
|
||||
|
||||
## Further reading
|
||||
|
||||
|
||||
@@ -60,5 +60,5 @@
|
||||
"2022-11-28"
|
||||
]
|
||||
},
|
||||
"sha": "bd6097760dede8c78b9e98d7ecc48df3629fda5b"
|
||||
"sha": "a48c6511928cb3036021dcad2c1542814c6ce122"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -197323,7 +197323,9 @@
|
||||
},
|
||||
"base": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"uid": {
|
||||
"type": [
|
||||
@@ -197351,7 +197353,9 @@
|
||||
},
|
||||
"user_groups": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"admin_group": {
|
||||
"type": [
|
||||
|
||||
@@ -197499,7 +197499,9 @@
|
||||
},
|
||||
"base": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"uid": {
|
||||
"type": [
|
||||
@@ -197527,7 +197529,9 @@
|
||||
},
|
||||
"user_groups": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"admin_group": {
|
||||
"type": [
|
||||
|
||||
@@ -44,5 +44,5 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"sha": "bd6097760dede8c78b9e98d7ecc48df3629fda5b"
|
||||
"sha": "a48c6511928cb3036021dcad2c1542814c6ce122"
|
||||
}
|
||||
@@ -2368,6 +2368,22 @@
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -3989,6 +4005,22 @@
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -5611,6 +5643,22 @@
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -7245,6 +7293,22 @@
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -211872,6 +211936,22 @@
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4639,6 +4639,22 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_validity_checks",
|
||||
@@ -6276,6 +6292,22 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_validity_checks",
|
||||
@@ -7914,6 +7946,22 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_validity_checks",
|
||||
@@ -9564,6 +9612,22 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_validity_checks",
|
||||
@@ -214207,6 +214271,22 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_non_provider_patterns",
|
||||
"description": "",
|
||||
"childParamsGroups": [
|
||||
{
|
||||
"type": "string",
|
||||
"name": "status",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"enabled",
|
||||
"disabled"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"name": "secret_scanning_validity_checks",
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"sha": "bd6097760dede8c78b9e98d7ecc48df3629fda5b"
|
||||
"sha": "a48c6511928cb3036021dcad2c1542814c6ce122"
|
||||
}
|
||||
@@ -1,28 +1,51 @@
|
||||
#!/usr/bin/env node
|
||||
import { execSync } from 'child_process'
|
||||
import yaml from 'js-yaml'
|
||||
|
||||
const slotName = process.env.SLOT_NAME
|
||||
const appServiceName = process.env.APP_SERVICE_NAME
|
||||
const resourceGroupName = process.env.RESOURCE_GROUP_NAME
|
||||
const url = process.env.CANARY_BUILD_URL
|
||||
const expectedSHA = process.env.EXPECTED_SHA
|
||||
const waitDuration = parseInt(process.env.CHECK_INTERVAL, 10) || 10000
|
||||
const curlConnectTimeoutSeconds = parseInt(process.env.CURL_CONNECT_TIMEOUT_SECONDS || '5', 10)
|
||||
const maxWaitingTimeSeconds = parseInt(process.MAX_WAITING_TIME || 10 * 60 * 1000, 10)
|
||||
|
||||
function getBuildSha() {
|
||||
console.log(`Fetching ${url}`)
|
||||
function getBuildSha(slot, appService, resourceGroup) {
|
||||
console.log('Getting Canary App Service Docker config')
|
||||
const t0 = Date.now()
|
||||
let config
|
||||
try {
|
||||
const o = execSync(`curl --connect-timeout ${curlConnectTimeoutSeconds} ${url}`, {
|
||||
encoding: 'utf8',
|
||||
})
|
||||
console.log(`Fetched ${url}. Took ${Date.now() - t0}ms`)
|
||||
return o.toString().trim()
|
||||
config = JSON.parse(
|
||||
execSync(
|
||||
`az webapp config container show --show-multicontainer-config --slot ${slot} -n ${appService} -g ${resourceGroup}`,
|
||||
{ encoding: 'utf8' },
|
||||
),
|
||||
)
|
||||
} catch (err) {
|
||||
console.log(`Error fetching build sha from ${url}`)
|
||||
console.log('Error getting the Canary App Service Slot config')
|
||||
return null
|
||||
}
|
||||
|
||||
// The config is an array of objects. One of the objects
|
||||
// contains a copy of the Docker compose configuration file
|
||||
// pushed to the slot (see src/workflows/docker-compose.prod.tmpl.yaml).
|
||||
// The value key contains the stringified YAML file, so we
|
||||
// need to parse it to JSON to extract the image sha.
|
||||
const dockerComposeYaml = config.find(
|
||||
(obj) => obj.name === 'DOCKER_CUSTOM_IMAGE_NAME_DECODED',
|
||||
).value
|
||||
|
||||
let dockerComposeConfig
|
||||
try {
|
||||
dockerComposeConfig = yaml.load(dockerComposeYaml)
|
||||
} catch (err) {
|
||||
console.log('Error loading the YAML configuration data from the Canary App Service Slot config')
|
||||
return null
|
||||
}
|
||||
// The image key looks like this:
|
||||
// `ghdocsprod.azurecr.io/github/docs-internal:d7ee70f225a0f10f293ffdd2d43931acf02c6751`
|
||||
const sha = dockerComposeConfig.services['ghdocs-prod'].image.split(':')[1]
|
||||
console.log(`Fetched Canary App Service Slot configuration}. Took ${Date.now() - t0}ms`)
|
||||
return sha
|
||||
}
|
||||
|
||||
function getStatesForSlot(slot, appService, resourceGroup) {
|
||||
@@ -38,7 +61,7 @@ let attempts = 0
|
||||
async function doCheck() {
|
||||
attempts++
|
||||
console.log('Attempt:', attempts)
|
||||
const buildSha = getBuildSha()
|
||||
const buildSha = getBuildSha(slotName, appServiceName, resourceGroupName)
|
||||
console.log('Canary build SHA:', buildSha || '*unknown/failed*', 'Expected SHA:', expectedSHA)
|
||||
|
||||
const states = getStatesForSlot(slotName, appServiceName, resourceGroupName)
|
||||
|
||||
Reference in New Issue
Block a user