diff --git a/content/actions/managing-workflow-runs/reviewing-deployments.md b/content/actions/managing-workflow-runs/reviewing-deployments.md
index 85600eb39f..3df0e34763 100644
--- a/content/actions/managing-workflow-runs/reviewing-deployments.md
+++ b/content/actions/managing-workflow-runs/reviewing-deployments.md
@@ -13,7 +13,7 @@ versions:
Jobs that reference an environment configured with required reviewers will wait for an approval before starting. While a job is awaiting approval, it has a status of "Waiting". If a job is not approved within 30 days, the workflow run will be automatically canceled.
-For more information about environments and required approvals, see "[Environments](/actions/reference/environments)."
+For more information about environments and required approvals, see "[Environments](/actions/reference/environments)." For information about how to review deployments with the REST API, see "[Workflow Runs](/rest/reference/actions#workflow-runs)."
### Approving or rejecting a job
diff --git a/content/actions/reference/environments.md b/content/actions/reference/environments.md
index d4b35b9cec..cfbdbfc1cd 100644
--- a/content/actions/reference/environments.md
+++ b/content/actions/reference/environments.md
@@ -56,6 +56,8 @@ Secrets stored in an environment are only available to workflow jobs that refere
1. Enter a name for the environment, then click **Configure environment**. Environment names are not case sensitive. An environment name may not exceed 255 characters and must be unique within the repository.
1. Configure any environment protection rules or environment secrets.
+You can also create and configure environments through the REST API. For more information, see "[Environments](/rest/reference/repos#environments)" and "[Secrets](/rest/reference/actions#secrets)."
+
Running a workflow that references an environment that does not exist will create an environment with the referenced name. The newly created environment will not have any protection rules or secrets configured. Anyone that can edit workflows in the repository can create environments via a workflow file, but only repository admins can configure the environment.
### Referencing an environment
@@ -77,3 +79,5 @@ Deleting an environment will delete all secrets and protection rules associated
{% data reusables.github-actions.sidebar-environment %}
1. Next the the environment that you want to delete, click {% octicon "trashcan" aria-label="The trashcan icon" %}.
2. Click **I understand, delete this environment**.
+
+You can also delete environments through the REST API. For more information, see "[Environments](/rest/reference/repos#environments)."
diff --git a/content/admin/configuration/configuring-code-scanning-for-your-appliance.md b/content/admin/configuration/configuring-code-scanning-for-your-appliance.md
index 8dad550cab..7b579bfe1d 100644
--- a/content/admin/configuration/configuring-code-scanning-for-your-appliance.md
+++ b/content/admin/configuration/configuring-code-scanning-for-your-appliance.md
@@ -42,7 +42,6 @@ For the users of {% data variables.product.product_location %} to be able to ena

{% data reusables.enterprise_management_console.save-settings %}
-
### Running {% data variables.product.prodname_code_scanning %} using {% data variables.product.prodname_actions %}
#### Setting up a self-hosted runner
@@ -89,3 +88,25 @@ The {% data variables.product.prodname_codeql_runner %} is a command-line tool t
1. Under "{% data variables.product.prodname_advanced_security %}", unselect **{% data variables.product.prodname_code_scanning_capc %}**.

{% data reusables.enterprise_management_console.save-settings %}
+
+### Enabling or disabling {% data variables.product.prodname_code_scanning %} via the administrative shell (SSH)
+
+You can enable or disable {% data variables.product.prodname_code_scanning %} programmatically on {% data variables.product.product_location %}. For example, you can enable {% data variables.product.prodname_code_scanning %} with your infrastructure-as-code tooling when you deploy an instance for staging or disaster recovery.
+
+For more information about the administrative shell and command-line utilities for {% data variables.product.prodname_ghe_server %}, see "[Accessing the administrative shell (SSH)](/admin/configuration/accessing-the-administrative-shell-ssh)" and "[Command-line utilities](/admin/configuration/command-line-utilities#ghe-config)."
+
+1. SSH into {% data variables.product.product_location %}.
+1. Enable {% data variables.product.prodname_code_scanning %}.
+ ```shell
+ ghe-config app.minio.enabled true
+ ghe-config app.code-scanning.enabled true
+ ```
+2. Optionally, disable {% data variables.product.prodname_code_scanning %}.
+ ```shell
+ ghe-config app.minio.enabled false
+ ghe-config app.code-scanning.enabled false
+ ```
+3. Apply the configuration.
+ ```shell
+ ghe-config-apply
+ ```
diff --git a/content/graphql/guides/index.md b/content/graphql/guides/index.md
index 1286ac37d7..35387642ba 100644
--- a/content/graphql/guides/index.md
+++ b/content/graphql/guides/index.md
@@ -20,3 +20,5 @@ versions:
{% link_in_list /using-the-explorer %}
{% link_in_list /managing-enterprise-accounts %}
+
+{% link_in_list /using-the-graphql-api-for-discussions %}
diff --git a/content/graphql/guides/using-the-graphql-api-for-discussions.md b/content/graphql/guides/using-the-graphql-api-for-discussions.md
new file mode 100644
index 0000000000..ad50406a54
--- /dev/null
+++ b/content/graphql/guides/using-the-graphql-api-for-discussions.md
@@ -0,0 +1,1084 @@
+---
+title: Using the GraphQL API for Discussions
+intro: 'Learn how to use the GitHub Discussions GraphQL API.'
+versions:
+ free-pro-team: '*'
+---
+
+The {% data variables.product.prodname_discussions %} GraphQL API allows you to get, create, edit, and delete discussion posts. For more information about {% data variables.product.prodname_discussions %}, see "[‎About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)."
+
+This API is available for authenticated users, OAuth Apps, and GitHub Apps. Access tokens require the `repo` scope for private repositories and the `public_repo` scope for public repositories. For more information, see "[Scopes for OAuth apps](/developers/apps/scopes-for-oauth-apps)."
+
+To use this API, you must include `GraphQL-Features: discussions_api` in the `HTTP` header.
+
+## Fields
+
+### Repository.discussions
+
+List the discussions within a repository. If `categoryId` is specified, only results within that category will be returned.
+
+_Signature:_
+
+```graphql
+discussions(
+ after: String,
+ before: String,
+ first: Int,
+ last: Int,
+ categoryId: ID = null,
+ orderBy: DiscussionOrder = {field: UPDATED_AT, direction: DESC}
+) : Discussion
+```
+
+#### DiscussionOrder
+
+```graphql
+"""
+Ways in which discussions can be ordered.
+"""
+input DiscussionOrder {
+ """
+ The field by which to order discussions.
+ """
+ field: DiscussionOrderField!
+
+ """
+ The direction in which to order discussions by the specified field.
+ """
+ direction: OrderDirection!
+}
+```
+
+```graphql
+"""
+Properties by which discussion connections can be ordered.
+"""
+enum DiscussionOrderField {
+ """
+ Order discussions by creation time.
+ """
+ CREATED_AT
+
+ """
+ Order discussions by most recent modification time.
+ """
+ UPDATED_AT
+}
+```
+
+### Repository.discussionCategories
+
+Return the available discussion categories defined within this repository. Each repository may have up to 10 categories. For more information about discussion categories, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions#about-categories-and-formats-for-discussions)."
+
+_Signature:_
+
+```graphql
+discussionCategories(
+ after: String,
+ before: String,
+ first: Int,
+ last: Int,
+) : DiscussionCategoryConnection!
+```
+
+### Repository.discussion
+
+Get a discussion. Returns `null` if discussion with the specified ID exists.
+
+_Signature:_
+
+```graphql
+discussion(number: Int!) : Discussion
+```
+
+### Repository.pinnedDiscussions
+
+Return discussions pinned to this repository, ordered by pin position.
+
+_Signature:_
+
+```graphql
+pinnedDiscussions(
+ after: String,
+ before: String,
+ first: Int,
+ last: Int,
+) : PinnedDiscussionConnection!
+```
+
+## Objects
+
+**Note:** For brevity, connection types are not expanded here. Each connection type mentioned in the schema follows the same pattern as other connections in the GraphQL API. For more information, see "[Introduction to GraphQL](/graphql/guides/introduction-to-graphql#connection)."
+
+```graphql
+query {
+ repository(owner: "github", name: "some-repo") {
+ discussions(first: 10) {
+ # type: DiscussionConnection
+ totalCount # Int!
+
+ pageInfo {
+ # type: PageInfo (from the public schema)
+ startCursor
+ endCursor
+ hasNextPage
+ hasPreviousPage
+ }
+
+ edges {
+ # type: DiscussionEdge
+ cursor
+ node {
+ # type: Discussion
+ id
+ }
+ }
+
+ nodes {
+ # type: Discussion
+ id
+ }
+ }
+ }
+}
+```
+
+### Discussion
+
+
+Fields:
+
+```graphql
+"""
+A discussion in a repository.
+"""
+type Discussion implements Comment & Deletable & Lockable & Node & Reactable & RepositoryNode & Subscribable & Updatable {
+ """
+ Reason that the conversation was locked.
+ """
+ activeLockReason: LockReason
+
+ """
+ The comment chosen as this discussion's answer, if any.
+ """
+ answer: DiscussionComment
+
+ """
+ The time when a user chose this discussion's answer, if answered.
+ """
+ answerChosenAt: DateTime
+
+ """
+ The user who chose this discussion's answer, if answered.
+ """
+ answerChosenBy: Actor
+
+ """
+ The actor who authored the comment.
+ """
+ author: Actor
+
+ """
+ Author's association with the subject of the comment.
+ """
+ authorAssociation: CommentAuthorAssociation!
+
+ """
+ The main text of the discussion post.
+ """
+ body: String!
+
+ """
+ The body rendered to HTML.
+ """
+ bodyHTML: HTML!
+
+ """
+ The body rendered to text.
+ """
+ bodyText: String!
+
+ """
+ The category for this discussion.
+ """
+ category: DiscussionCategory!
+
+ """
+ The replies to the discussion.
+ """
+ comments(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+ ): DiscussionCommentConnection!
+
+ """
+ Identifies the date and time when the object was created.
+ """
+ createdAt: DateTime!
+
+ """
+ Check if this comment was created via an email reply.
+ """
+ createdViaEmail: Boolean!
+
+ """
+ Identifies the primary key from the database.
+ """
+ databaseId: Int
+
+ """
+ The actor who edited the comment.
+ """
+ editor: Actor
+ id: ID!
+
+ """
+ Check if this comment was edited and includes an edit with the creation data
+ """
+ includesCreatedEdit: Boolean!
+
+ """
+ The moment the editor made the last edit
+ """
+ lastEditedAt: DateTime
+
+ """
+ `true` if the object is locked
+ """
+ locked: Boolean!
+
+ """
+ The number identifying this discussion within the repository.
+ """
+ number: Int!
+
+ """
+ Identifies when the comment was published at.
+ """
+ publishedAt: DateTime
+
+ """
+ A list of reactions grouped by content left on the subject.
+ """
+ reactionGroups: [ReactionGroup!]
+
+ """
+ A list of Reactions left on the Issue.
+ """
+ reactions(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Allows filtering Reactions by emoji.
+ """
+ content: ReactionContent
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+
+ """
+ Allows specifying the order in which reactions are returned.
+ """
+ orderBy: ReactionOrder
+ ): ReactionConnection!
+
+ """
+ The repository associated with this node.
+ """
+ repository: Repository!
+
+ """
+ The path for this discussion.
+ """
+ resourcePath: URI!
+
+ """
+ The title of this discussion.
+ """
+ title: String!
+
+ """
+ Identifies the date and time when the object was last updated.
+ """
+ updatedAt: DateTime!
+
+ """
+ The URL for this discussion.
+ """
+ url: URI!
+
+ """
+ A list of edits to this content.
+ """
+ userContentEdits(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+ ): UserContentEditConnection
+
+ """
+ Check if the current viewer can delete this object.
+ """
+ viewerCanDelete: Boolean!
+
+ """
+ Can user react to this subject
+ """
+ viewerCanReact: Boolean!
+
+ """
+ Check if the viewer is able to change their subscription status for the repository.
+ """
+ viewerCanSubscribe: Boolean!
+
+ """
+ Check if the current viewer can update this object.
+ """
+ viewerCanUpdate: Boolean!
+
+ """
+ Did the viewer author this comment.
+ """
+ viewerDidAuthor: Boolean!
+
+ """
+ Identifies if the viewer is watching, not watching, or ignoring the subscribable entity.
+ """
+ viewerSubscription: SubscriptionState
+}
+```
+
+
+
+### DiscussionComment
+
+
+Fields
+
+```graphql
+"""
+A comment on a discussion.
+"""
+type DiscussionComment implements Comment & Deletable & Minimizable & Node & Reactable & Updatable & UpdatableComment {
+ """
+ The actor who authored the comment.
+ """
+ author: Actor
+
+ """
+ Author's association with the subject of the comment.
+ """
+ authorAssociation: CommentAuthorAssociation!
+
+ """
+ The body as Markdown.
+ """
+ body: String!
+
+ """
+ The body rendered to HTML.
+ """
+ bodyHTML: HTML!
+
+ """
+ The body rendered to text.
+ """
+ bodyText: String!
+
+ """
+ Identifies the date and time when the object was created.
+ """
+ createdAt: DateTime!
+
+ """
+ Check if this comment was created via an email reply.
+ """
+ createdViaEmail: Boolean!
+
+ """
+ Identifies the primary key from the database.
+ """
+ databaseId: Int
+
+ """
+ The time when this replied-to comment was deleted
+ """
+ deletedAt: DateTime
+
+ """
+ The discussion this comment was created in
+ """
+ discussion: Discussion
+
+ """
+ The actor who edited the comment.
+ """
+ editor: Actor
+ id: ID!
+
+ """
+ Check if this comment was edited and includes an edit with the creation data
+ """
+ includesCreatedEdit: Boolean!
+
+ """
+ Has this comment been chosen as the answer of its discussion?
+ """
+ isAnswer: Boolean!
+
+ """
+ Returns whether or not a comment has been minimized.
+ """
+ isMinimized: Boolean!
+
+ """
+ The moment the editor made the last edit
+ """
+ lastEditedAt: DateTime
+
+ """
+ Returns why the comment was minimized.
+ """
+ minimizedReason: String
+
+ """
+ Identifies when the comment was published at.
+ """
+ publishedAt: DateTime
+
+ """
+ A list of reactions grouped by content left on the subject.
+ """
+ reactionGroups: [ReactionGroup!]
+
+ """
+ A list of Reactions left on the Issue.
+ """
+ reactions(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Allows filtering Reactions by emoji.
+ """
+ content: ReactionContent
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+
+ """
+ Allows specifying the order in which reactions are returned.
+ """
+ orderBy: ReactionOrder
+ ): ReactionConnection!
+
+ """
+ The threaded replies to this comment.
+ """
+ replies(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+ ): DiscussionCommentConnection!
+
+ """
+ The discussion comment this comment is a reply to
+ """
+ replyTo: DiscussionComment
+
+ """
+ The path for this discussion comment.
+ """
+ resourcePath: URI!
+
+ """
+ Identifies the date and time when the object was last updated.
+ """
+ updatedAt: DateTime!
+
+ """
+ The URL for this discussion comment.
+ """
+ url: URI!
+
+ """
+ A list of edits to this content.
+ """
+ userContentEdits(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+ ): UserContentEditConnection
+
+ """
+ Check if the current viewer can delete this object.
+ """
+ viewerCanDelete: Boolean!
+
+ """
+ Can the current user mark this comment as an answer?
+ """
+ viewerCanMarkAsAnswer: Boolean!
+
+ """
+ Check if the current viewer can minimize this object.
+ """
+ viewerCanMinimize: Boolean!
+
+ """
+ Can user react to this subject
+ """
+ viewerCanReact: Boolean!
+
+ """
+ Can the current user unmark this comment as an answer?
+ """
+ viewerCanUnmarkAsAnswer: Boolean!
+
+ """
+ Check if the current viewer can update this object.
+ """
+ viewerCanUpdate: Boolean!
+
+ """
+ Reasons why the current viewer can not update this comment.
+ """
+ viewerCannotUpdateReasons: [CommentCannotUpdateReason!]!
+
+ """
+ Did the viewer author this comment.
+ """
+ viewerDidAuthor: Boolean!
+}
+```
+
+
+
+### DiscussionCategory
+
+
+Fields
+
+```graphql
+"""
+A category for discussions in a repository.
+"""
+type DiscussionCategory implements Node & RepositoryNode {
+ """
+ Identifies the date and time when the object was created.
+ """
+ createdAt: DateTime!
+
+ """
+ A description of this category.
+ """
+ description: String
+
+ """
+ An emoji representing this category.
+ """
+ emoji: String!
+
+ """
+ This category's emoji rendered as HTML.
+ """
+ emojiHTML: HTML!
+ id: ID!
+
+ """
+ Whether or not discussions in this category support choosing an answer with the markDiscussionCommentAsAnswer mutation.
+ """
+ isAnswerable: Boolean!
+
+ """
+ The name of this category.
+ """
+ name: String!
+
+ """
+ The repository associated with this node.
+ """
+ repository: Repository!
+
+ """
+ Identifies the date and time when the object was last updated.
+ """
+ updatedAt: DateTime!
+}
+```
+
+
+
+### PinnedDiscussion
+
+
+Fields:
+
+```graphql
+"""
+A Pinned discussion is a discussion pinned to a repository's index page.
+"""
+type PinnedDiscussion implements Node & RepositoryNode {
+ """
+ Identifies the date and time when the object was created.
+ """
+ createdAt: DateTime!
+
+ """
+ Identifies the primary key from the database.
+ """
+ databaseId: Int
+
+ """
+ The discussion that was pinned.
+ """
+ discussion: Discussion!
+
+ """
+ Color stops of the chosen gradient
+ """
+ gradientStopColors: [String!]!
+ id: ID!
+
+ """
+ Background texture pattern
+ """
+ pattern: PinnedDiscussionPattern!
+
+ """
+ The actor that pinned this discussion.
+ """
+ pinnedBy: Actor!
+
+ """
+ Preconfigured background gradient option
+ """
+ preconfiguredGradient: PinnedDiscussionGradient
+
+ """
+ The repository associated with this node.
+ """
+ repository: Repository!
+
+ """
+ Identifies the date and time when the object was last updated.
+ """
+ updatedAt: DateTime!
+}
+```
+
+
+
+#### PinnedDiscussionPattern
+
+
+Values
+
+```graphql
+"""
+Preconfigured background patterns that may be used to style discussions pinned within a repository.
+"""
+enum PinnedDiscussionPattern {
+ """
+ An upward-facing chevron pattern
+ """
+ CHEVRON_UP
+
+ """
+ A hollow dot pattern
+ """
+ DOT
+
+ """
+ A solid dot pattern
+ """
+ DOT_FILL
+
+ """
+ A heart pattern
+ """
+ HEART_FILL
+
+ """
+ A friendly octocat face pattern
+ """
+ OCTOFACE
+
+ """
+ A plus sign pattern
+ """
+ PLUS
+}
+```
+
+
+
+#### PinnedDiscussionGradient
+
+
+Values
+
+```graphql
+"""
+Preconfigured gradients that may be used to style discussions pinned within a repository.
+"""
+enum PinnedDiscussionGradient {
+ """
+ A gradient of blue to mint
+ """
+ BLUE_MINT
+
+ """
+ A gradient of blue to purple
+ """
+ BLUE_PURPLE
+
+ """
+ A gradient of pink to blue
+ """
+ PINK_BLUE
+
+ """
+ A gradient of purple to coral
+ """
+ PURPLE_CORAL
+
+ """
+ A gradient of red to orange
+ """
+ RED_ORANGE
+}
+```
+
+
+
+## Interfaces
+
+### RepositoryDiscussionAuthor
+
+Implemented by the `User` and `Organization` types. **Note:** An `Organization` will only have discussions associated with it if it was converted from a `User`.
+
+
+Fields
+
+```graphql
+"""
+Represents an author of discussions in repositories.
+"""
+interface RepositoryDiscussionAuthor {
+ """
+ Discussions this user has started.
+ """
+ repositoryDiscussions(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Filter discussions to only those that have been answered or not. Defaults to
+ including both answered and unanswered discussions.
+ """
+ answered: Boolean = null
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+
+ """
+ Ordering options for discussions returned from the connection.
+ """
+ orderBy: DiscussionOrder = {field: CREATED_AT, direction: DESC}
+
+ """
+ Filter discussions to only those in a specific repository.
+ """
+ repositoryId: ID
+ ): DiscussionConnection!
+}
+```
+
+
+
+### RepositoryDiscussionCommentAuthor
+
+Also implemented by the `User` and `Organization` types.
+
+
+Fields
+
+```graphql
+"""
+Represents an author of discussion comments in repositories.
+"""
+interface RepositoryDiscussionCommentAuthor {
+ """
+ Discussion comments this user has authored.
+ """
+ repositoryDiscussionComments(
+ """
+ Returns the elements in the list that come after the specified cursor.
+ """
+ after: String
+
+ """
+ Returns the elements in the list that come before the specified cursor.
+ """
+ before: String
+
+ """
+ Returns the first _n_ elements from the list.
+ """
+ first: Int
+
+ """
+ Returns the last _n_ elements from the list.
+ """
+ last: Int
+
+ """
+ Filter discussion comments to only those that were marked as the answer
+ """
+ onlyAnswers: Boolean = false
+
+ """
+ Filter discussion comments to only those in a specific repository.
+ """
+ repositoryId: ID
+ ): DiscussionCommentConnection!
+}
+```
+
+
+
+## Mutations
+
+These mutations follow the same implementation pattern that other mutations in the GraphQL API. Each mutation accepts a single argument of an `Input` type, named after the mutation, and returns a `Payload` type containing the fields specified.
+
+For example, this is a basic `createDiscussion` mutation that will create a new discussion:
+
+```graphql
+mutation {
+ # input type: CreateDiscussionInput
+ createDiscussion(input: {repositoryId: "1234", categoryId: "5678", body: "The body", title: "The title"}) {
+
+ # response type: CreateDiscussionPayload
+ discussion {
+ id
+ }
+ }
+}
+```
+
+### createDiscussion
+
+Input fields:
+
+* `body: String!` The body of the new discussion.
+* `title: String!` The title of the new discussion.
+* `repositoryId: ID!` The ID of a repository in which to create the discussion.
+* `categoryId: ID!` The ID of a `DiscussionCategory` within this repository.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `discussion: Discussion` The discussion that was created.
+
+### updateDiscussion
+
+Input fields:
+
+* `discussionId: ID!` The node ID of the discussion to update.
+* `body: String` The new contents of the discussion body.
+* `title: String` The new discussion title.
+* `categoryId: ID` The node ID of a `DiscussionCategory` within the same repository to change this discussion to.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `discussion: Discussion` The discussion that was modified.
+
+### deleteDiscussion
+Input fields:
+
+* `id: ID!` The node ID of the discussion to delete.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `discussion: Discussion` The discussion that was deleted.
+
+### addDiscussionComment
+
+Input fields:
+
+* `body: String!` The contents of the comment.
+* `discussionId: ID!` The node ID of the discussion to comment on.
+* `replyToId: ID` The node ID of the discussion comment to reply to. If absent, the created comment will be a top-level comment.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `comment: DiscussionComment` The discussion comment that was created.
+
+### updateDiscussionComment
+
+Input fields:
+
+* `body: String!` The new contents of the comment body.
+* `commentId: ID!` The node ID of the discussion comment to update.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `comment: DiscussionComment` The discussion comment that was updated.
+
+### deleteDiscussionComment
+
+Input fields:
+
+* `id: ID!` The node ID of the discussion comment to delete.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `comment: DiscussionComment` The discussion comment that was deleted.
+
+### markDiscussionCommentAsAnswer
+
+Input fields:
+
+* `id: ID!` The node ID of the discussion comment to mark as an answer.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `discussion: Discussion` The discussion that includes the chosen comment.
+
+### unmarkDiscussionCommentAsAnswer
+
+Input fields:
+
+* `id: ID!` The node ID of the discussion comment to unmark as an answer.
+* `clientMutationId: String` A unique identifier for the client performing the mutation.
+
+Return type fields:
+
+* `clientMutationId: String` The unique identifier provided as an input.
+* `discussion: Discussion` The discussion that includes the unmarked comment.
+
+## Search
+
+Discussion may be returned from the top-level `search` field. To search for discussion, specify `type` as `DISCUSSION`. The `SearchResultItemConnection` type has a `discussionCount` field to report the number of returned discussions, and the `Discussion` type is added to the `SearchResultItem` union. For more information, see ["Queries](/graphql/reference/queries#searchresultitemconnection)."
diff --git a/content/rest/reference/repos.md b/content/rest/reference/repos.md
index b30002c9f8..7233e0457f 100644
--- a/content/rest/reference/repos.md
+++ b/content/rest/reference/repos.md
@@ -152,6 +152,15 @@ You can communicate that a transient environment no longer exists by setting its
{% if operation.subcategory == 'deployments' %}{% include rest_operation %}{% endif %}
{% endfor %}
+{% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}
+## Environments
+
+The Environments API allows you to create, configure, and delete environments. For more information about environments, see "[Environments](/actions/reference/environments)."
+{% for operation in currentRestOperations %}
+ {% if operation.subcategory == 'environments' %}{% include rest_operation %}{% endif %}
+{% endfor %}
+{% endif %}
+
## Forks
{% for operation in currentRestOperations %}
diff --git a/data/reusables/actions/about-secrets.md b/data/reusables/actions/about-secrets.md
index 9035067f83..7e67aff95e 100644
--- a/data/reusables/actions/about-secrets.md
+++ b/data/reusables/actions/about-secrets.md
@@ -1 +1 @@
-Encrypted secrets allow you to store sensitive information, such as access tokens, in your repository or organization.
+Encrypted secrets allow you to store sensitive information, such as access tokens, in your repository, repository environments, or organization.
diff --git a/data/reusables/pages/new-or-existing-repo.md b/data/reusables/pages/new-or-existing-repo.md
index bfb5ba3b47..0448df67ab 100644
--- a/data/reusables/pages/new-or-existing-repo.md
+++ b/data/reusables/pages/new-or-existing-repo.md
@@ -1,5 +1,5 @@
If your site is an independent project, you can create a new repository to store your site's source code. If your site is associated with an existing project, you can add the source code {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" or currentVersion == "github-ae@latest" %}to that project's repository, in a `/docs` folder on the default branch or on a different branch.{% else %}for your site to a `gh-pages` branch or a `docs` folder on the `master` branch in that project's repository.{% endif %} For example, if you're creating a site to publish documentation for a project that's already on {% data variables.product.product_name %}, you may want to store the source code for the site in the same repository as the project.
-{% if currentVersion == "free-pro-team@latest" %}If the account that owns the repository uses {% data variables.product.prodname_free_user %} or {% data variables.product.prodname_free_team %}, the repository must be public.{% endif %}
+{% if currentVersion == "free-pro-team@latest" %}If the account that owns the repository uses {% data variables.product.prodname_free_user %} or {% data variables.product.prodname_free_team %} for organizations, the repository must be public.{% endif %}
If you want to create a site in an existing repository, skip to the "[Creating your site](#creating-your-site)" section.
diff --git a/data/reusables/webhooks/check_run_properties.md b/data/reusables/webhooks/check_run_properties.md
index caf11510a8..eca6f57502 100644
--- a/data/reusables/webhooks/check_run_properties.md
+++ b/data/reusables/webhooks/check_run_properties.md
@@ -6,6 +6,7 @@ Key | Type | Description
`check_run[conclusion]`|`string` | The result of the completed check run. Can be one of `success`, `failure`, `neutral`, `cancelled`, `timed_out`, {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.19" or currentVersion == "github-ae@latest" %}`action_required` or `stale`{% else %}or `action_required`{% endif %}. This value will be `null` until the check run has `completed`.
`check_run[name]`|`string` | The name of the check run.
`check_run[check_suite][id]`|`integer` | The id of the check suite that this check run is part of.
-`check_run[check_suite][pull_requests]`|`array`| An array of pull requests that match this check suite. A pull request matches a check suite if they have the same `head_sha` and `head_branch`. When the check suite's `head_branch` is in a forked repository it will be `null` and the `pull_requests` array will be empty.
+`check_run[check_suite][pull_requests]`|`array`| An array of pull requests that match this check suite. A pull request matches a check suite if they have the same `head_sha` and `head_branch`. When the check suite's `head_branch` is in a forked repository it will be `null` and the `pull_requests` array will be empty.{% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}
+`deployment`|`object`| A deployment to a repository environment. This will only be populated if the check run was created by a {% data variables.product.prodname_actions %} workflow job that references an environment.{% endif %}
`requested_action`|`object` | The action requested by the user.
`requested_action[identifier]`|`string` | The integrator reference of the action requested by the user.
diff --git a/includes/scroll-button.html b/includes/scroll-button.html
new file mode 100644
index 0000000000..e6d5d14b70
--- /dev/null
+++ b/includes/scroll-button.html
@@ -0,0 +1,3 @@
+
diff --git a/javascripts/index.js b/javascripts/index.js
index 7cc42b0042..0cf22b13a9 100644
--- a/javascripts/index.js
+++ b/javascripts/index.js
@@ -2,6 +2,7 @@
import '../stylesheets/index.scss'
import displayPlatformSpecificContent from './display-platform-specific-content'
import explorer from './explorer'
+import scrollUp from './scroll-up'
import search from './search'
import nav from './nav'
import browserDateFormatter from 'browser-date-formatter'
@@ -23,6 +24,7 @@ import airgapLinks from './airgap-links'
document.addEventListener('DOMContentLoaded', async () => {
displayPlatformSpecificContent()
explorer()
+ scrollUp()
search()
nav()
browserDateFormatter()
diff --git a/javascripts/scroll-up.js b/javascripts/scroll-up.js
new file mode 100644
index 0000000000..3a28db997c
--- /dev/null
+++ b/javascripts/scroll-up.js
@@ -0,0 +1,22 @@
+export default function () {
+ // function to scroll up to page top
+ const PageTopBtn = document.getElementById('js-scroll-top')
+ if (!PageTopBtn) return
+
+ PageTopBtn.addEventListener('click', (e) => {
+ window.scrollTo({
+ top: 0,
+ behavior: 'smooth'
+ })
+ })
+
+ // show scroll button only when display is scroll down
+ window.addEventListener('scroll', function () {
+ const y = document.documentElement.scrollTop // get the height from page top
+ if (y < 100) {
+ PageTopBtn.classList.remove('show')
+ } else if (y >= 100) {
+ PageTopBtn.classList.add('show')
+ }
+ })
+}
diff --git a/layouts/default.html b/layouts/default.html
index c90330af86..c409dae945 100644
--- a/layouts/default.html
+++ b/layouts/default.html
@@ -15,6 +15,7 @@
{% endif %}
{% include support-section %}
{% include small-footer %}
+ {% include scroll-button %}