diff --git a/.github/branch_protection_settings/README.md b/.github/branch_protection_settings/README.md deleted file mode 100644 index 1b149bc91ee5..000000000000 --- a/.github/branch_protection_settings/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Branch Protection Settings - -This directory is mean to store a dump of the branch protections rules we have set in this repo. They are used by a workflow to compare against what is actually in settings in order to alert to changes. diff --git a/.github/branch_protection_settings/main.json b/.github/branch_protection_settings/main.json deleted file mode 100644 index 58480c3339dd..000000000000 --- a/.github/branch_protection_settings/main.json +++ /dev/null @@ -1,250 +0,0 @@ -{ - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection", - "required_status_checks": { - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/required_status_checks", - "strict": true, - "contexts": [ - "automated-pipelines", - "github-apps", - "graphql", - "events", - "landings", - "rest", - "search", - "webhooks", - "local-dev", - "check-links", - "shielding", - "observability", - "pageinfo", - "redirects", - "ghes-releases", - "content-render", - "assets", - "languages", - "learning-track", - "release-notes", - "color-schemes", - "content-linter", - "lint-content", - "playwright-tests (playwright-rendering)", - "archives", - "versions", - "audit-logs", - "changelogs", - "data-directory", - "early-access", - "fixtures", - "frame", - "products", - "workflows", - "lint-code", - "secret-scanning", - "pagelist", - "docs-internal-docker-image / docs-internal-docker-image", - "docs-internal-docker-security / docs-internal-docker-security", - "docs-internal-moda-config-bundle / docs-internal-moda-config-bundle" - ], - "contexts_url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/required_status_checks/contexts", - "checks": [ - { "context": "automated-pipelines", "app_id": 15368 }, - { "context": "github-apps", "app_id": 15368 }, - { "context": "graphql", "app_id": 15368 }, - { "context": "events", "app_id": 15368 }, - { "context": "landings", "app_id": 15368 }, - { "context": "rest", "app_id": 15368 }, - { "context": "search", "app_id": 15368 }, - { "context": "webhooks", "app_id": 15368 }, - { "context": "local-dev", "app_id": 15368 }, - { "context": "check-links", "app_id": 15368 }, - { "context": "shielding", "app_id": 15368 }, - { "context": "observability", "app_id": 15368 }, - { "context": "pageinfo", "app_id": 15368 }, - { "context": "redirects", "app_id": 15368 }, - { "context": "ghes-releases", "app_id": 15368 }, - { "context": "content-render", "app_id": 15368 }, - { "context": "assets", "app_id": 15368 }, - { "context": "languages", "app_id": 15368 }, - { "context": "learning-track", "app_id": 15368 }, - { "context": "release-notes", "app_id": 15368 }, - { "context": "color-schemes", "app_id": 15368 }, - { "context": "content-linter", "app_id": 15368 }, - { "context": "lint-content", "app_id": 15368 }, - { "context": "playwright-tests (playwright-rendering)", "app_id": 15368 }, - { "context": "archives", "app_id": 15368 }, - { "context": "versions", "app_id": 15368 }, - { "context": "audit-logs", "app_id": 15368 }, - { "context": "changelogs", "app_id": 15368 }, - { "context": "data-directory", "app_id": 15368 }, - { "context": "early-access", "app_id": 15368 }, - { "context": "fixtures", "app_id": 15368 }, - { "context": "frame", "app_id": 15368 }, - { "context": "products", "app_id": 15368 }, - { "context": "workflows", "app_id": 15368 }, - { "context": "lint-code", "app_id": 15368 }, - { "context": "secret-scanning", "app_id": 15368 }, - { "context": "pagelist", "app_id": 15368 }, - { - "context": "docs-internal-docker-image / docs-internal-docker-image", - "app_id": 15368 - }, - { - "context": "docs-internal-docker-security / docs-internal-docker-security", - "app_id": 15368 - }, - { - "context": "docs-internal-moda-config-bundle / docs-internal-moda-config-bundle", - "app_id": 15368 - } - ] - }, - "restrictions": { - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/restrictions", - "users_url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/restrictions/users", - "teams_url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/restrictions/teams", - "apps_url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/restrictions/apps", - "users": [], - "teams": [ - { - "name": "docs", - "id": 325922, - "node_id": "MDQ6VGVhbTMyNTkyMg==", - "slug": "docs", - "description": "We're the Docs Team! We work in /docs and /docs-internal and publish docs.github.com. ", - "privacy": "closed", - "notification_setting": "notifications_enabled", - "url": "https://api.github.com/organizations/9919/team/325922", - "html_url": "https://github.com/orgs/github/teams/docs", - "members_url": "https://api.github.com/organizations/9919/team/325922/members{/member}", - "repositories_url": "https://api.github.com/organizations/9919/team/325922/repos", - "permission": "pull", - "parent": null - } - ], - "apps": [ - { - "id": 87537, - "client_id": "Iv1.cd3d51f97fa3c962", - "slug": "github-heaven", - "node_id": "MDM6QXBwODc1Mzc=", - "owner": { - "login": "github", - "id": 9919, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", - "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/github", - "html_url": "https://github.com/github", - "followers_url": "https://api.github.com/users/github/followers", - "following_url": "https://api.github.com/users/github/following{/other_user}", - "gists_url": "https://api.github.com/users/github/gists{/gist_id}", - "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/github/subscriptions", - "organizations_url": "https://api.github.com/users/github/orgs", - "repos_url": "https://api.github.com/users/github/repos", - "events_url": "https://api.github.com/users/github/events{/privacy}", - "received_events_url": "https://api.github.com/users/github/received_events", - "type": "Organization", - "user_view_type": "public", - "site_admin": false - }, - "name": "GitHub Heaven", - "description": "Heaven operates deployments across the seven kingdoms of GitHub.", - "external_url": "https://heaven.githubapp.com", - "html_url": "https://github.com/apps/github-heaven", - "created_at": "2020-11-04T22:59:24Z", - "updated_at": "2023-09-15T14:16:20Z", - "permissions": { - "actions": "write", - "checks": "read", - "contents": "write", - "deployments": "write", - "emails": "read", - "issues": "write", - "metadata": "read", - "pull_requests": "write", - "statuses": "read", - "workflows": "write" - }, - "events": ["push"] - }, - { - "id": 87541, - "client_id": "Iv1.4e183513562e11aa", - "slug": "github-heaven-staging", - "node_id": "MDM6QXBwODc1NDE=", - "owner": { - "login": "github", - "id": 9919, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", - "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/github", - "html_url": "https://github.com/github", - "followers_url": "https://api.github.com/users/github/followers", - "following_url": "https://api.github.com/users/github/following{/other_user}", - "gists_url": "https://api.github.com/users/github/gists{/gist_id}", - "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/github/subscriptions", - "organizations_url": "https://api.github.com/users/github/orgs", - "repos_url": "https://api.github.com/users/github/repos", - "events_url": "https://api.github.com/users/github/events{/privacy}", - "received_events_url": "https://api.github.com/users/github/received_events", - "type": "Organization", - "user_view_type": "public", - "site_admin": false - }, - "name": "GitHub Heaven (Staging)", - "description": "Staging version of Heaven, GitHub's deployment app.", - "external_url": "https://heaven-pe1-iad.githubapp.com", - "html_url": "https://github.com/apps/github-heaven-staging", - "created_at": "2020-11-05T00:12:16Z", - "updated_at": "2023-09-15T14:16:33Z", - "permissions": { - "actions": "write", - "checks": "read", - "contents": "write", - "deployments": "write", - "emails": "read", - "issues": "write", - "metadata": "read", - "pull_requests": "write", - "repository_hooks": "read", - "statuses": "read", - "workflows": "write" - }, - "events": ["push"] - } - ] - }, - "required_pull_request_reviews": { - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/required_pull_request_reviews", - "dismiss_stale_reviews": false, - "require_code_owner_reviews": true, - "require_last_push_approval": false, - "required_approving_review_count": 1, - "dismissal_restrictions": { - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/dismissal_restrictions", - "users_url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/dismissal_restrictions/users", - "teams_url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/dismissal_restrictions/teams", - "users": [], - "teams": [], - "apps": [] - } - }, - "required_signatures": { - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/required_signatures", - "enabled": false - }, - "enforce_admins": { - "url": "https://api.github.com/repos/github/docs-internal/branches/main/protection/enforce_admins", - "enabled": false - }, - "required_linear_history": { "enabled": false }, - "allow_force_pushes": { "enabled": false }, - "allow_deletions": { "enabled": false }, - "block_creations": { "enabled": true }, - "required_conversation_resolution": { "enabled": false }, - "lock_branch": { "enabled": false }, - "allow_fork_syncing": { "enabled": false } -} diff --git a/.github/workflows/alert-changed-branch-protections.yml b/.github/workflows/alert-changed-branch-protections.yml deleted file mode 100644 index 81126ecea660..000000000000 --- a/.github/workflows/alert-changed-branch-protections.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Alert Changed Branch Protections - -on: - branch_protection_rule: - workflow_dispatch: - schedule: - - cron: '20 16 * * 3' # Run every Wednesday at 16:20 UTC / 8:20 PST - pull_request: - paths: - - .github/workflows/alert-changed-branch-protections.yml - - .github/branch_protection_settings/*.json - -permissions: - contents: write - -jobs: - check-branch-protections: - runs-on: ubuntu-latest - if: github.repository == 'github/docs-internal' - - strategy: - matrix: - # List of branches we want to monitor for protection changes - branch: [main] - - steps: - - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Fetch branch protections - id: fetch - env: - GH_TOKEN: ${{ secrets.DOCS_BOT_PAT_WORKFLOW }} - run: | - # Fetch branch protections and store them in a file - gh api /repos/GitHub/docs-internal/branches/${{ matrix.branch }}/protection \ - > .github/branch_protection_settings/${{ matrix.branch }}.json - - - name: Format fetched settings with prettier for comparison - id: format - run: | - npx prettier --write .github/branch_protection_settings/${{ matrix.branch }}.json - - - name: Compare branch protections - id: compare - run: | - git diff --quiet .github/branch_protection_settings/${{ matrix.branch }}.json \ - || echo "diff_failed=true" >> $GITHUB_ENV - - - name: Create a pull request to update branch protection settings - if: ${{ env.diff_failed == 'true' }} - env: - GITHUB_TOKEN: ${{ secrets.DOCS_BOT_PAT_READPUBLICKEY }} - run: | - echo "Set git config" - git config --global user.name "docs-bot" - git config --global user.email "77750099+docs-bot@users.noreply.github.com" - - echo "Check out a new branch" - xbranch=update-branch-protection-settings-$(date +%s) - git checkout -b $xbranch - - echo "Commit changes" - git commit -am "Update branch protection settings" - - echo "Push changes" - git push origin $xbranch - - echo "Create pull request" - gh pr create \ - --title "Update branch protection settings" \ - --body "Branch protections have changed." \ - --head $xbranch \ - --base main - - echo "Define pr_url" - echo "pr_url=$(gh pr view --json url --jq .url)" >> $GITHUB_ENV - - - uses: ./.github/actions/slack-alert - if: ${{ env.diff_failed == 'true' }} - with: - slack_channel_id: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} - slack_token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} - message: "Branch protections have changed. I've created a pull request to update them. Please review and merge, or revert the change in the GitHub UI. ${{ env.pr_url }}" - color: purple diff --git a/.github/workflows/move-content.yml b/.github/workflows/move-content.yml index c3104d122f67..2588bc36f4bd 100644 --- a/.github/workflows/move-content.yml +++ b/.github/workflows/move-content.yml @@ -34,8 +34,8 @@ jobs: # These must be set to something before running the move-content # script because it depends on executing `git mv ...` # and `git commit ...` - git config --global user.name any-body - git config --global user.email "any-body@example.com" + git config --global user.name "docs-bot" + git config --global user.email "77750099+docs-bot@users.noreply.github.com" - name: Move hello-world.md to hello-wurld.md env: diff --git a/.github/workflows/validate-github-github-docs-urls.yml b/.github/workflows/validate-github-github-docs-urls.yml index 914f78fb1561..3f5ddcedb215 100644 --- a/.github/workflows/validate-github-github-docs-urls.yml +++ b/.github/workflows/validate-github-github-docs-urls.yml @@ -59,6 +59,9 @@ jobs: run: | npm run validate-github-github-docs-urls -- generate-new-json checks.json github/config/docs-urls.json + git config --global user.name "docs-bot" + git config --global user.email "77750099+docs-bot@users.noreply.github.com" + cd github git status git diff @@ -117,7 +120,8 @@ jobs: GITHUB_TOKEN: ${{ secrets.DOCS_BOT_PAT_WRITEORG_PROJECT }} ISSUE_NUMBER: ${{ github.event.pull_request.number }} REPOSITORY: ${{ github.repository }} - run: npm run validate-github-github-docs-urls -- post-pr-comment checks.json --changed-files $CHANGED_FILES + run: | + npm run validate-github-github-docs-urls -- post-pr-comment checks.json --changed-files $CHANGED_FILES - uses: ./.github/actions/slack-alert if: ${{ failure() && github.event_name == 'schedule' }} diff --git a/.gitignore b/.gitignore index 195648462472..72a376a8d960 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ external-link-checker-db.json # Automated content source rest-api-description semmle-code +models-gateway .installed.package-lock.json assets/images/help/writing/unordered-list-rendered (1).png diff --git a/Dockerfile b/Dockerfile index 181ac9c423c5..465d6191ee28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ # --------------------------------------------------------------- # To update the sha: # https://github.com/github/gh-base-image/pkgs/container/gh-base-image%2Fgh-base-noble -FROM ghcr.io/github/gh-base-image/gh-base-noble:20250407-184504-g7b9deed09 AS base +FROM ghcr.io/github/gh-base-image/gh-base-noble:20250416-142458-gcbbd448ce AS base # Install curl for Node install and determining the early access branch # Install git for cloning docs-early-access & translations repos diff --git a/content/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/managing-support-entitlements-for-your-enterprise.md b/content/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/managing-support-entitlements-for-your-enterprise.md index 585d3f5a7188..6c6fbbd49b0d 100644 --- a/content/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/managing-support-entitlements-for-your-enterprise.md +++ b/content/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/managing-support-entitlements-for-your-enterprise.md @@ -20,6 +20,12 @@ Enterprise owners and billing managers automatically have a support entitlement. * **{% data variables.product.premium_support_plan %}, {% data variables.product.standard_support_plan %}:** Up to 20 members * **{% data variables.product.premium_plus_support_plan %}:** Up to 40 members +> [!NOTE] The level of support that members of your enterprise receive when submitting a ticket is determined by their support entitlement status: +> * If your enterprise has a Premium or Premium Plus plan and the user has a support entitlement, their ticket will receive Premium Support, which includes expedited response times and prioritized handling. +> * If the user does not have a support entitlement, their ticket will still be addressed by our Enterprise Support team, but without Premium Support features such as priority selection and guaranteed Premium SLAs. +> +> If a user is unsure of their entitlement status, they can contact their organization's Enterprise Support administrator. + ## Adding a support entitlement to an enterprise member To add a support entitlement to a user, the user must already be a member of an organization that is owned by your enterprise. diff --git a/content/site-policy/privacy-policies/github-subprocessors.md b/content/site-policy/privacy-policies/github-subprocessors.md index f36690ec7e80..f4277285a86f 100644 --- a/content/site-policy/privacy-policies/github-subprocessors.md +++ b/content/site-policy/privacy-policies/github-subprocessors.md @@ -27,7 +27,7 @@ If you have questions about this list, please contact us at | --------------------------- | ------------------------------------------------------------------------------ | ----------------------- | ------------------ | | Amazon Web Services (AWS) | Cloud Hosted Infrastructure and Data Hosting | United States | United States | | Anthropic PBC | AI Inference and AI Services | United States | United States | -| Azure (Microsoft) | Cloud Hosted Infrastructure and Data Hosting | United States, France,
Switzerland, and Japan | United States | +| Azure (Microsoft) | Cloud Hosted Infrastructure and Data Hosting | United States, Australia,
Brazil, Canada, France,
Japan, Norway, Spain,
Sweden, Switzerland,
United Kingdom | United States | | Azure Cognitive Services | Customer support ticketing analysis | United States | United States | | Cloudflare | Content delivery service | United States | United States | | Fastly | Content delivery service | United States | United States | @@ -36,7 +36,7 @@ If you have questions about this list, please contact us at | GitHub Canada ULC | GitHub Subsidiary | Canada | Canada | | GitHub Germany GmbH | GitHub Subsidiary | Germany | Germany | | GitHub India Pty Ltd | GitHub Subsidiary | India | India | -| Google Cloud Platform (GCP) | Cloud Hosted Infrastructure | United States | United States | +| Google Cloud Platform (GCP) | Cloud Hosted Infrastructure | United States, Belgium | United States | | Microsoft | Technical Services | United States | United States | | Moveworks | Customer support ticketing analysis | United States | United States | | NexMo (aka Vonage) | SMS notification provider for 2 Factor Authentication | United States | United States | diff --git a/src/graphql/data/fpt/schema.docs.graphql b/src/graphql/data/fpt/schema.docs.graphql index 065f92a6965b..dbf1eaaea2d2 100644 --- a/src/graphql/data/fpt/schema.docs.graphql +++ b/src/graphql/data/fpt/schema.docs.graphql @@ -64812,7 +64812,7 @@ input UpdateIssueIssueTypeInput { """ The ID of the issue type to update on the issue """ - issueTypeId: ID @possibleTypes(concreteTypes: ["IssueType"]) + issueTypeId: ID } """ diff --git a/src/graphql/data/fpt/schema.json b/src/graphql/data/fpt/schema.json index d9790ed5b32c..22136ff992d6 100644 --- a/src/graphql/data/fpt/schema.json +++ b/src/graphql/data/fpt/schema.json @@ -109396,8 +109396,7 @@ "type": "ID", "id": "id", "kind": "scalars", - "href": "/graphql/reference/scalars#id", - "isDeprecated": false + "href": "/graphql/reference/scalars#id" } ] }, diff --git a/src/graphql/data/ghec/schema.docs.graphql b/src/graphql/data/ghec/schema.docs.graphql index 065f92a6965b..dbf1eaaea2d2 100644 --- a/src/graphql/data/ghec/schema.docs.graphql +++ b/src/graphql/data/ghec/schema.docs.graphql @@ -64812,7 +64812,7 @@ input UpdateIssueIssueTypeInput { """ The ID of the issue type to update on the issue """ - issueTypeId: ID @possibleTypes(concreteTypes: ["IssueType"]) + issueTypeId: ID } """ diff --git a/src/graphql/data/ghec/schema.json b/src/graphql/data/ghec/schema.json index d9790ed5b32c..22136ff992d6 100644 --- a/src/graphql/data/ghec/schema.json +++ b/src/graphql/data/ghec/schema.json @@ -109396,8 +109396,7 @@ "type": "ID", "id": "id", "kind": "scalars", - "href": "/graphql/reference/scalars#id", - "isDeprecated": false + "href": "/graphql/reference/scalars#id" } ] }, diff --git a/src/graphql/scripts/build-changelog.js b/src/graphql/scripts/build-changelog.js index 2542a5ffcf23..2681394f59c3 100644 --- a/src/graphql/scripts/build-changelog.js +++ b/src/graphql/scripts/build-changelog.js @@ -287,6 +287,7 @@ const CHANGES_TO_IGNORE = [ ChangeType.DirectiveArgumentDescriptionChanged, ChangeType.DirectiveArgumentDefaultValueChanged, ChangeType.DirectiveArgumentTypeChanged, + ChangeType.DirectiveUsageArgumentDefinitionRemoved, ChangeType.EnumValueDescriptionChanged, ChangeType.EnumValueDeprecationReasonChanged, ChangeType.EnumValueDeprecationReasonAdded, diff --git a/src/learning-track/middleware/learning-track.ts b/src/learning-track/middleware/learning-track.ts index 92b80d0f3218..83a5e590885e 100644 --- a/src/learning-track/middleware/learning-track.ts +++ b/src/learning-track/middleware/learning-track.ts @@ -176,9 +176,20 @@ async function indexOfLearningTrackGuide( ) { let guideIndex = -1 + const renderOpts = { textOnly: true } for (let i = 0; i < trackGuidePaths.length; i++) { // Learning track URLs may have Liquid conditionals. - const renderedGuidePath = await renderContent(trackGuidePaths[i], context, { textOnly: true }) + let renderedGuidePath = '' + try { + renderedGuidePath = await renderContent(trackGuidePaths[i], context, renderOpts) + } catch { + const englishFallbackContext = { ...context, currentLanguage: 'en' } + renderedGuidePath = await renderContent( + trackGuidePaths[i], + englishFallbackContext, + renderOpts, + ) + } if (!renderedGuidePath) continue diff --git a/src/secret-scanning/data/public-docs.yml b/src/secret-scanning/data/public-docs.yml index 0746f8f70691..7186e25a4f63 100644 --- a/src/secret-scanning/data/public-docs.yml +++ b/src/secret-scanning/data/public-docs.yml @@ -720,6 +720,28 @@ hasPushProtection: true hasValidityCheck: false isduplicate: false +- provider: Bitrise + supportedSecret: Bitrise Personal Access Token + secretType: bitrise_personal_access_token + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: true + hasPushProtection: true + hasValidityCheck: false + isduplicate: false +- provider: Bitrise + supportedSecret: Bitrise Workspace API Token + secretType: bitrise_workspace_api_token + versions: + fpt: '*' + ghec: '*' + isPublic: true + isPrivateWithGhas: true + hasPushProtection: true + hasValidityCheck: false + isduplicate: false - provider: Brevo supportedSecret: Sendinblue API Key secretType: sendinblue_api_key diff --git a/src/secret-scanning/lib/config.json b/src/secret-scanning/lib/config.json index 416abec6a7c8..486bc9dd320e 100644 --- a/src/secret-scanning/lib/config.json +++ b/src/secret-scanning/lib/config.json @@ -1,5 +1,5 @@ { - "sha": "7d6e6d0c21cf0c446584d4d7e3ef1766820a77a6", - "blob-sha": "db4351256cd9d9235a1958bea56834856b94cc7c", + "sha": "e49a548729d691e0e214b82372bd178ccd7931cc", + "blob-sha": "7cf165540a1d973e8f7c24d34d2616a6a31ffa51", "targetFilename": "code-security/secret-scanning/introduction/supported-secret-scanning-patterns" } \ No newline at end of file