mirror of
https://github.com/googleforgames/open-match.git
synced 2025-03-24 20:35:47 +00:00
Release Process for Open Match (#235)
This commit is contained in:
16
Makefile
16
Makefile
@ -49,7 +49,7 @@
|
||||
BASE_VERSION = 0.4.0
|
||||
VERSION_SUFFIX = $(shell git rev-parse --short=7 HEAD | tr -d [:punct:])
|
||||
BRANCH_NAME = $(shell git rev-parse --abbrev-ref HEAD | tr -d [:punct:])
|
||||
VERSION ?= $(BASE_VERSION)-$(VERSION_SUFFIX)
|
||||
VERSION = $(BASE_VERSION)-$(VERSION_SUFFIX)
|
||||
|
||||
PROTOC_VERSION = 3.7.1
|
||||
HELM_VERSION = 2.13.1
|
||||
@ -73,6 +73,7 @@ PROTOC := $(TOOLCHAIN_BIN)/protoc
|
||||
PROTOC_INCLUDES := $(TOOLCHAIN_DIR)/include/
|
||||
GCP_PROJECT_ID ?=
|
||||
GCP_PROJECT_FLAG = --project=$(GCP_PROJECT_ID)
|
||||
OPEN_MATCH_PUBLIC_IMAGES_PROJECT_ID = open-match-public-images
|
||||
OM_SITE_GCP_PROJECT_ID = open-match-site
|
||||
OM_SITE_GCP_PROJECT_FLAG = --project=$(OM_SITE_GCP_PROJECT_ID)
|
||||
REGISTRY ?= gcr.io/$(GCP_PROJECT_ID)
|
||||
@ -637,6 +638,17 @@ example-evaluator-binaries: examples/evaluators/golang/serving/serving
|
||||
# For presubmit we want to update the protobuf generated files and verify that tests are good.
|
||||
presubmit: sync-deps clean-protos all-protos fmt vet build test
|
||||
|
||||
build/release/: presubmit clean-install-yaml install/yaml/
|
||||
mkdir -p $(BUILD_DIR)/release/
|
||||
cp install/yaml/* $(BUILD_DIR)/release/
|
||||
|
||||
release: REGISTRY = gcr.io/$(OPEN_MATCH_PUBLIC_IMAGES_PROJECT_ID)
|
||||
release: TAG = $(BASE_VERSION)
|
||||
release: build/release/
|
||||
|
||||
clean-release:
|
||||
rm -rf build/release/
|
||||
|
||||
clean-site:
|
||||
rm -rf build/site/
|
||||
|
||||
@ -672,7 +684,7 @@ clean-install-yaml:
|
||||
rm -f install/yaml/03-prometheus-chart.yaml
|
||||
rm -f install/yaml/04-grafana-chart.yaml
|
||||
|
||||
clean: clean-images clean-binaries clean-site clean-toolchain clean-protos clean-nodejs clean-install-yaml
|
||||
clean: clean-images clean-binaries clean-site clean-release clean-toolchain clean-protos clean-nodejs clean-install-yaml
|
||||
|
||||
run-backendclient: build/toolchain/bin/kubectl$(EXE_EXTENSION)
|
||||
$(KUBECTL) run om-backendclient --rm --restart=Never --image-pull-policy=Always -i --tty --image=$(REGISTRY)/openmatch-backendclient:$(TAG) --namespace=$(OPEN_MATCH_KUBERNETES_NAMESPACE) $(KUBECTL_RUN_ENV)
|
||||
|
@ -17,7 +17,7 @@
|
||||
"paths": {
|
||||
"/v1/backend/assignments": {
|
||||
"delete": {
|
||||
"summary": "Remove DGS connection info from state storage for players. \nINPUT: Roster message with the 'players' field populated. \n The only field in the Roster's Player messages used by\n DeleteAssignments is the 'id' field. All others are silently ignored. If\n you need to delete multiple rosters, make multiple calls.",
|
||||
"summary": "Remove DGS connection info from state storage for players.\nINPUT: Roster message with the 'players' field populated.\n The only field in the Roster's Player messages used by\n DeleteAssignments is the 'id' field. All others are silently ignored. If\n you need to delete multiple rosters, make multiple calls.",
|
||||
"operationId": "DeleteAssignments2",
|
||||
"responses": {
|
||||
"200": {
|
||||
@ -40,7 +40,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Write the connection info for the list of players in the\nAssignments.messages.Rosters to state storage. The Frontend API is\nresponsible for sending anything sent here to the game clients.\nSending a player to this function kicks off a process that removes\nthe player from future matchmaking functions by adding them to the \n'deindexed' player list and then deleting their player ID from state storage\nindexes.\nINPUT: Assignments message with these fields populated:\n - assignment, anything you write to this string is sent to Frontend API \n - rosters. You can send any number of rosters, containing any number of\n player messages. All players from all rosters will be sent the assignment.\n The only field in the Roster's Player messages used by CreateAssignments is\n the id field. All other fields in the Player messages are silently ignored.",
|
||||
"summary": "Write the connection info for the list of players in the\nAssignments.messages.Rosters to state storage. The Frontend API is\nresponsible for sending anything sent here to the game clients.\nSending a player to this function kicks off a process that removes\nthe player from future matchmaking functions by adding them to the\n'deindexed' player list and then deleting their player ID from state storage\nindexes.\nINPUT: Assignments message with these fields populated:\n - assignment, anything you write to this string is sent to Frontend API\n - rosters. You can send any number of rosters, containing any number of\n player messages. All players from all rosters will be sent the assignment.\n The only field in the Roster's Player messages used by CreateAssignments is\n the id field. All other fields in the Player messages are silently ignored.",
|
||||
"operationId": "CreateAssignments",
|
||||
"responses": {
|
||||
"200": {
|
||||
@ -67,7 +67,7 @@
|
||||
},
|
||||
"/v1/backend/matches": {
|
||||
"delete": {
|
||||
"summary": "Delete a MatchObject from state storage manually. (MatchObjects in state\nstorage will also automatically expire after a while, defined in the config)\nINPUT: MatchObject message with the 'id' field populated. \n(All other fields are ignored.)",
|
||||
"summary": "Delete a MatchObject from state storage manually. (MatchObjects in state\nstorage will also automatically expire after a while, defined in the config)\nINPUT: MatchObject message with the 'id' field populated.\n(All other fields are ignored.)",
|
||||
"operationId": "DeleteMatch",
|
||||
"responses": {
|
||||
"200": {
|
||||
@ -119,7 +119,7 @@
|
||||
},
|
||||
"/v1/backend/matches/{match.id}": {
|
||||
"delete": {
|
||||
"summary": "Delete a MatchObject from state storage manually. (MatchObjects in state\nstorage will also automatically expire after a while, defined in the config)\nINPUT: MatchObject message with the 'id' field populated. \n(All other fields are ignored.)",
|
||||
"summary": "Delete a MatchObject from state storage manually. (MatchObjects in state\nstorage will also automatically expire after a while, defined in the config)\nINPUT: MatchObject message with the 'id' field populated.\n(All other fields are ignored.)",
|
||||
"operationId": "DeleteMatch2",
|
||||
"responses": {
|
||||
"200": {
|
||||
@ -196,6 +196,36 @@
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "mmfcfg.name",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "mmfcfg.host",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"name": "mmfcfg.port",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
},
|
||||
{
|
||||
"name": "mmfcfg.type",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"GRPC",
|
||||
"REST"
|
||||
],
|
||||
"default": "GRPC"
|
||||
}
|
||||
],
|
||||
"tags": [
|
||||
@ -233,6 +263,9 @@
|
||||
"properties": {
|
||||
"match": {
|
||||
"$ref": "#/definitions/messagesMatchObject"
|
||||
},
|
||||
"mmfcfg": {
|
||||
"$ref": "#/definitions/apiMmfConfig"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -274,6 +307,32 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"apiMmfConfig": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"host": {
|
||||
"type": "string"
|
||||
},
|
||||
"port": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
},
|
||||
"type": {
|
||||
"$ref": "#/definitions/apiMmfConfigType"
|
||||
}
|
||||
}
|
||||
},
|
||||
"apiMmfConfigType": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"GRPC",
|
||||
"REST"
|
||||
],
|
||||
"default": "GRPC"
|
||||
},
|
||||
"messagesAssignments": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
|
61
docs/governance/templates/release.md
Normal file
61
docs/governance/templates/release.md
Normal file
@ -0,0 +1,61 @@
|
||||
# v{version}
|
||||
|
||||
This is the {version} release of Open Match.
|
||||
|
||||
Check the [README](https://github.com/GoogleCloudPlatform/open-match/tree/release-{version}) for details on features, installation and usage.
|
||||
|
||||
Release Notes
|
||||
-------------
|
||||
|
||||
{ insert enhancements from the changelog and/or security and breaking changes }
|
||||
|
||||
**Breaking Changes**
|
||||
* API Changed #PR
|
||||
|
||||
**Enhancements**
|
||||
* New Harness #PR
|
||||
|
||||
**Security Fixes**
|
||||
* Reduced privileges required for MMF. #PR
|
||||
|
||||
See [CHANGELOG](https://github.com/GoogleCloudPlatform/open-match/blob/release-{version}/CHANGELOG.md) for more details on changes.
|
||||
|
||||
Images
|
||||
------
|
||||
|
||||
```bash
|
||||
# Servers
|
||||
docker pull gcr.io/open-match-public-images/openmatch-backendapi:{version}
|
||||
docker pull gcr.io/open-match-public-images/openmatch-frontendapi:{version}
|
||||
docker pull gcr.io/open-match-public-images/openmatch-mmforc:{version}
|
||||
docker pull gcr.io/open-match-public-images/openmatch-mmlogicapi:{version}
|
||||
|
||||
# Evaluators
|
||||
docker pull gcr.io/open-match-public-images/openmatch-evaluator-serving:{version}
|
||||
|
||||
# Sample Match Making Functions
|
||||
docker pull gcr.io/open-match-public-images/openmatch-mmf-go-grpc-serving-simple:{version}
|
||||
|
||||
# Test Clients
|
||||
docker pull gcr.io/open-match-public-images/openmatch-backendclient:{version}
|
||||
docker pull gcr.io/open-match-public-images/openmatch-clientloadgen:{version}
|
||||
docker pull gcr.io/open-match-public-images/openmatch-frontendclient:{version}
|
||||
```
|
||||
|
||||
_This software is currently alpha, and subject to change. Not to be used in production systems._
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
To deploy Open Match in your Kubernetes cluster run the following commands:
|
||||
|
||||
```bash
|
||||
# Grant yourself cluster-admin permissions so that you can deploy service accounts.
|
||||
kubectl create clusterrolebinding myname-cluster-admin-binding --clusterrole=cluster-admin --user=$(YOUR_KUBERNETES_USER_NAME)
|
||||
# Place all Open Match components in their own namespace.
|
||||
kubectl create namespace open-match
|
||||
# Install Open Match and monitoring services.
|
||||
kubectl apply -f https://github.com/GoogleCloudPlatform/open-match/releases/download/v{version}/install.yaml --namespace open-match
|
||||
# Install the example MMF and Evaluator.
|
||||
kubectl apply -f https://github.com/GoogleCloudPlatform/open-match/releases/download/v{version}/install-example.yaml --namespace open-match
|
||||
```
|
27
docs/governance/templates/release.sh
Executable file
27
docs/governance/templates/release.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/bin/bash
|
||||
# Usage:
|
||||
# ./release.sh 0.5.0-82d034f unstable
|
||||
# ./release.sh [SOURCE VERSION] [DEST VERSION]
|
||||
|
||||
# This is a basic shell script to publish the latest Open Match Images
|
||||
# There's no guardrails yet so use with care.
|
||||
# Purge Images
|
||||
# docker rmi $(docker images -a -q)
|
||||
# 0.4.0-82d034f
|
||||
SOURCE_VERSION=$1
|
||||
DEST_VERSION=$2
|
||||
SOURCE_PROJECT_ID=open-match-build
|
||||
DEST_PROJECT_ID=open-match-public-images
|
||||
IMAGE_NAMES="openmatch-backendapi openmatch-frontendapi openmatch-mmforc openmatch-mmlogicapi openmatch-evaluator-simple openmatch-mmf-cs-mmlogic-simple openmatch-mmf-go-mmlogic-simple openmatch-mmf-go-grpc-serving-simple openmatch-mmf-py3-mmlogic-simple openmatch-backendclient openmatch-clientloadgen openmatch-frontendclient"
|
||||
|
||||
for name in $IMAGE_NAMES
|
||||
do
|
||||
source_image=gcr.io/$SOURCE_PROJECT_ID/$name:$SOURCE_VERSION
|
||||
dest_image=gcr.io/$DEST_PROJECT_ID/$name:$DEST_VERSION
|
||||
dest_image_latest=gcr.io/$DEST_PROJECT_ID/$name:latest
|
||||
docker pull $source_image
|
||||
docker tag $source_image $dest_image
|
||||
docker tag $source_image $dest_image_latest
|
||||
docker push $dest_image
|
||||
docker push $dest_image_latest
|
||||
done
|
82
docs/governance/templates/release_issue.md
Normal file
82
docs/governance/templates/release_issue.md
Normal file
@ -0,0 +1,82 @@
|
||||
# Release {version}
|
||||
|
||||
<!--
|
||||
This is the release issue template. Make a copy of the markdown in this page
|
||||
and copy it into a release issue. Fill in relevent values, found inside {}
|
||||
{version} should be replaced with the version ie: 0.5.0.
|
||||
|
||||
There are 3 types of releases:
|
||||
* Release Candidates - 1.0.0-rc1
|
||||
* Full Releases - 1.2.0
|
||||
* Hot Fixes - 1.0.1
|
||||
|
||||
# Release Candidate and Full Release Process
|
||||
|
||||
1. Create a Release Issue from the [release issue template](./release_issue.md).
|
||||
1. Label the issue `kind/release`, and attach it to the milestone that it matches.
|
||||
1. Complete all items in the release issue checklist.
|
||||
1. Close the release issue.
|
||||
|
||||
# Hot Fix Process
|
||||
|
||||
1. Hotfixes will occur as needed, to be determined by those will commit access on the repository.
|
||||
1. Create a Release Issue from the [release issue template](./release_issue.md).
|
||||
1. Label the issue `kind/release`, and attach it to the next upcoming milestone.
|
||||
1. Complete all items in the release issue checklist.
|
||||
1. Close the release issue.
|
||||
|
||||
!-->
|
||||
Complete Milestone
|
||||
------------------
|
||||
- [ ] Create the next version milestone, use [semantic versioning](https://semver.org/) when naming it to be consistent with the [Go community](https://blog.golang.org/versioning-proposal).
|
||||
- [ ] Visit the [milestone](https://github.com/GoogleCloudPlatform/open-match/milestone).
|
||||
- [ ] Open a document for a draft [release notes](release.md).
|
||||
- [ ] Add the milestone tag to all PRs and issues that were merged since the last milestone. Look at the [releases page](https://github.com/GoogleCloudPlatform/open-match/releases) and look for the "X commits to master since this release" for the diff. The link resolves to, https://github.com/GoogleCloudPlatform/open-match/compare/v{version}...master.
|
||||
- [ ] Review all [milestone-less closed issues](https://github.com/GoogleCloudPlatform/open-match/issues?q=is%3Aissue+is%3Aclosed+no%3Amilestone) and assign the appropriate milestone.
|
||||
- [ ] Review all [issues in milestone](https://github.com/GoogleCloudPlatform/open-match/milestones) for proper [labels](https://github.com/GoogleCloudPlatform/open-match/labels) (ex: area/build).
|
||||
- [ ] Review all [milestone-less closed PRs](https://github.com/GoogleCloudPlatform/open-match/pulls?q=is%3Apr+is%3Aclosed+no%3Amilestone) and assign the appropriate milestone.
|
||||
- [ ] Review all [PRs in milestone](https://github.com/GoogleCloudPlatform/open-match/milestones) for proper [labels](https://github.com/GoogleCloudPlatform/open-match/labels) (ex: area/build).
|
||||
- [ ] View all open entries in milestone and move them to a future milestone if they aren't getting closed in time. https://github.com/GoogleCloudPlatform/open-match/milestones/v{version}
|
||||
- [ ] Review all closed PRs against the milestone. Put the user visible changes into the release notes using the suggested format. https://github.com/GoogleCloudPlatform/open-match/pulls?q=is%3Apr+is%3Aclosed+milestone%3Av{version}
|
||||
- [ ] Review all closed issues against the milestone. Put the user visible changes into the release notes using the suggested format. https://github.com/GoogleCloudPlatform/open-match/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aclosed+milestone%3Av{version}
|
||||
- [ ] Verify the [milestone](https://github.com/GoogleCloudPlatform/open-match/milestones) is effectively 100% at this point with the exception of the release issue itself.
|
||||
|
||||
TODO: Add details for appropriate tagging for issues.
|
||||
|
||||
Build Artifacts
|
||||
---------------
|
||||
- [ ] Create a PR to bump the version.
|
||||
- [ ] Open the [`Makefile`](makefile-version) and change BASE_VERSION value. Release candidates use the -rc# suffix.
|
||||
- [ ] Open the [`install/helm/open-match/Chart.yaml`](om-chart-yaml-version) and [`install/helm/open-match-example/Chart.yaml`](om-example-chart-yaml-version) and change the `appVersion` and `version` entries.
|
||||
- [ ] Open the [`install/helm/open-match/values.yaml`](om-values-yaml-version) and [`install/helm/open-match-example/values.yaml`](om-example-values-yaml-version) and change the `tag` entries.
|
||||
- [ ] Open the [`site/config.toml`] and change the `release_branch` and `release_version` entries.
|
||||
- [ ] Open the [`README.md`](readme-deploy) update the version references.
|
||||
- [ ] Run `make clean release`
|
||||
- [ ] There might be additional references to the old version but be careful not to change it for places that have it for historical purposes.
|
||||
- [ ] Submit the pull request.
|
||||
- [ ] Take note of the git hash in master, `git checkout master && git pull master && git rev-parse HEAD`
|
||||
- [ ] Go to [Cloud Build](https://pantheon.corp.google.com/cloud-build/triggers?project=open-match-build), under Post Submit click "Run Trigger".
|
||||
- [ ] Go to the History section and find the "Post Submit" build that's running. Wait for it to go Green. If it's red fix error repeat this section. Take note of version tag for next step.
|
||||
- [ ] Run `./docs/governance/templates/release.sh {source version tag} {version}` to copy the images to open-match-public-images.
|
||||
- [ ] Create a *draft* release with the [release template][release-template]
|
||||
- [ ] Make a `tag` with the release version. The tag must be v{version}. Example: v0.5.0. Append -rc# for release candidates. Example: v0.5.0-rc1.
|
||||
- [ ] Copy the files from `build/release/` generated from `make release` from earlier as release artifacts.
|
||||
- [ ] Run `make delete-gke-cluster create-gke-cluster push-helm sleep-10 install-chart install-example-chart` and verify that the pods are all healthy.
|
||||
- [ ] Run `make delete-gke-cluster create-gke-cluster` and run through the instructions under the [README](readme-deploy), verify the pods are healthy. You'll need to adjust the path to the `install/yaml/install.yaml` and `install/yaml/install-example.yaml` in your local clone since you haven't published them yet.
|
||||
- [ ] Publish the [Release](om-release) in Github.
|
||||
|
||||
Announce
|
||||
--------
|
||||
- [ ] Send an email to the [mailing list](mailing-list-post) with the release details (copy-paste the release blog post)
|
||||
- [ ] Send a chat on the [Slack channel](om-slack). "Open Match {version} has been released! Check it out at {release url}."
|
||||
|
||||
[om-slack]: https://open-match.slack.com/
|
||||
[mailing-list-post]: https://groups.google.com/forum/#!newtopic/open-match-discuss
|
||||
[release-template]: https://github.com/GoogleCloudPlatform/open-match/blob/master/docs/governance/templates/release.md
|
||||
[makefile-version]: https://github.com/GoogleCloudPlatform/open-match/blob/master/Makefile#L53
|
||||
[om-example-chart-yaml-version]: https://github.com/GoogleCloudPlatform/open-match/blob/master/install/helm/open-match/Chart.yaml#L16
|
||||
[om-example-values-yaml-version]: https://github.com/GoogleCloudPlatform/open-match/blob/master/install/helm/open-match/values.yaml#L16
|
||||
[om-example-chart-yaml-version]: https://github.com/GoogleCloudPlatform/open-match/blob/master/install/helm/open-match-example/Chart.yaml#L16
|
||||
[om-example-values-yaml-version]: https://github.com/GoogleCloudPlatform/open-match/blob/master/install/helm/open-match-example/values.yaml#L16
|
||||
[om-release]: https://github.com/GoogleCloudPlatform/open-match/releases/new
|
||||
[readme-deploy]: https://github.com/GoogleCloudPlatform/open-match/blob/master/README.md#deploy-to-kubernetes
|
Reference in New Issue
Block a user