Merge branch 'main' into nmb/513-google-analytics

This commit is contained in:
Neil Martinsen-Burrell 2023-11-08 12:11:44 -06:00
commit e29fbd0c2f
No known key found for this signature in database
GPG key ID: 6A3C818CC10D0184
15 changed files with 188 additions and 47 deletions

View file

@ -0,0 +1,30 @@
# 24. Production Release Cadence
Date: 2023-11-02
## Status
In Review
## Context
Going into our first production launch we need a plan describing what our release cadence for both our staging and stable envirornments will be. Currently, we release to staging whenever there are significant changes made, but we have not been making releases to stable with the same frequency.
## Considered Options
**Option 1:** Releasing to stable/staging once a sprint
Releasing once a sprint would mean that we release the past sprint's work to stable at the end of the current sprint. At the same point, the current sprint's work would be pushed to staging, thus making staging a full sprint ahead of stable. While this is more straight forward, it means our users would have to wait longer to see changes that weren't deemed critical.
**Option 2:** Releasing to stable/staging once a week
Releasing once a week would follow the same flow but with code being released to staging one week before the same code is released to stable. This would make stable only one week behind staging and would allow us to roll out minor bug fixes and faster with greater speed. The negative side is that we have less time to see if errors occur on staging
In both of the above scenarios the release date would fall on the same day of the week that the sprint starts, which is currently a Wednesday. Additionally, in both scenarios the release commits would eventually be tagged with both a staging and stable tag. Furthermore, critical bugs or features would be exempt from these restrictions based on the product owner's discretion.
## Decision
We decided to go with option 2 and release once a week once in production. This will allow us to give users features and bug fixes faster while still allowing enough time on staging for quality to be maintained.
## Consequences
Work not completed by end of the sprint will have to wait to be added to stable. Also, making quick fixes for bugs that are found on stable will be a little more complicated to fix.
When first going into production, staging and stable will start with the same code base. The following week a new release will be made to staging, but not stable as no code will have been on staging long enough to warrant another release. Thus just at the start of launch stable will be essentially frozen for 2 weeks, not one.

View file

@ -43,6 +43,21 @@ For ease of use, you can run the `deploy.sh <sandbox name>` script in the `/src`
Your sandbox space should've been setup as part of the onboarding process. If this was not the case, please have an admin follow the instructions [here](../../.github/ISSUE_TEMPLATE/developer-onboarding.md#setting-up-developer-sandbox).
## Stable and Staging Release Rules
Releases will be made for staging and stable every week starting on the first day of the sprint (Wednesday), with the second release of the sprint occuring halfway through the sprint. With the exception of first time going into production, these releases will NOT have the same code. The release to stable will be the same commit that was tagged for staging one week prior, making stable one week behind staging. Further, this means staging can be up to a week behind the main branch of code.
If a bug fix or feature needs to be made to stable out of the normal cycle, this can only be done at the product owner's request.
## Making bug fixes on stable during production
In the case where a bug fix or feature needs to be added outside of the normal cycle, the code-fix branch and release will be handled differently than normal:
1. Code will need to be branched NOT off of main, but off of the same commit as the most recent stable commit. This should be the one tagged with the most recent vX.XX.XX value.
2. After making the bug fix, the approved PR will branch will be tagged with a new release tag, incrementing the patch value from the last commit number.
3. This branch then needs to be merged to main per the usual process.
4. This same branch should be merged into staging.
## Serving static assets
We are using [WhiteNoise](http://whitenoise.evans.io/en/stable/index.html) plugin to serve our static assets on cloud.gov. This plugin is added to the `MIDDLEWARE` list in our apps `settings.py`.
@ -159,3 +174,27 @@ it with the latest model schema. Once launched, this should never be used on
the `stable` environment, but during development, it may be useful on the
various sandbox environments. After launch, some schema changes may take the
involvement of a skilled DBA to fix problems like this.
# Bug triage
Bugs on production software need to be documented quickly and triaged to determine if fixes need to be made outside of the normal release cadence. Triage levels will be Critical, High, Medium, and Low to indicate the level of priority for fix, not neccessarily the level of severity. See below for more details
**Critical**- should only be determined by the product owner and means the fix for this critical bug needs to have a quick fix for it created ASAP. This is the only case where a bug fix can be added outside of the normal release cycle and directly onto the stable release.
**High**- Can be determined by product owner or other team member, and indicates this bug is critical enough to warrant being added into the current sprint.
**Medium**- Should be added to a sprint coming up but is not blocking users, or enough users to warrant rushing it into a sprint
**Low**- A minor bug, that could even wait until after the next big launch date to be implemented.
## Steps for Triaging
1. When a bug is found, whether by a developer/designer or from feedback from an end user, a ticket should be made immediately. The actual maker of the ticket can be a member of the product team as needed.
2. This bug ticket immediately gets a priority added Critical/High/Medium/Low, with Critical requiring the product owner's consent.
3. Anything marked as `critical` should be refined immediately and engineering should be notified in our Slack dev channel that a Critical ticket has been created (if not already notified)
4. All items not marked as `critical` by the product owner can wait until refinement to be refined and may have their prioirty level changed during that meeting.
## Steps for dealing with Critical Bugs
1. Once the critical bug ticket is refined and the bug is clear, an engineer should be assigned to work on it. (No ticket, no work)
2. At the same point, two other engineers should be assigned to review the PR once it's made. One of the reviewing engineers can be subsititued for a designer if this is a design/content/other user facing bug fix.
3. In the case where the engineering lead is is unresponsive or unavailable to assign the ticket immediately, the product team will make sure an engineer volunteers or is assigned to the ticket/PR review ASAP.
4. Once done, the developer must make a PR and should tag the assigned PR reviewers in our Slack dev channel stating that the PR is now waiting on their review. These reviewers should drop other tasks in order to review this promptly.
5. See the the section above on [Making bug fixes on stable](#making-bug-fixes-on-stable-during-production) for how to push changes to stable once the PR is approved

View file

@ -25,6 +25,8 @@ applications:
GETGOV_PUBLIC_SITE_URL: https://beta.get.gov
# Which OIDC provider to use
OIDC_ACTIVE_PROVIDER: login.gov production
# Flag to disable/enable features in prod environments
IS_PRODUCTION: True
routes:
- route: getgov-stable.app.cloud.gov
services:

44
src/Pipfile.lock generated
View file

@ -32,20 +32,20 @@
},
"boto3": {
"hashes": [
"sha256:85e2fa361ad3210d30800bad311688261f2673a9b301e0edab56463d89609761",
"sha256:d18688bc5d688decf3cc404430a3ac3ec317be653cdcfbc51104c01f38a66434"
"sha256:02ce7dcad2d3b054cd99e7ca6df7a708e016a31b1c98b46d8df3b3891070c121",
"sha256:b8acb57a124434284d6ab69c61d32d70e84e13e2c27c33b4ad3c32f15ad407d3"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==1.28.76"
"version": "==1.28.79"
},
"botocore": {
"hashes": [
"sha256:479abb5a1ee03eb00faa1ea176bc595b2f46f7494777807681a9df45ed99ea18",
"sha256:74e0a4515d61b2860b24dc208ca89a68d79dc00147125d531746d3ba808822ad"
"sha256:07ecb93833475dde68e5c0e02a7ccf8ca22caf68cdc892651c300529894133e1",
"sha256:6f1fc49e9e12f9772b4fef577837670bc84d772a7c946b4d08fe2890e34a4305"
],
"markers": "python_version >= '3.7'",
"version": "==1.31.76"
"version": "==1.31.79"
},
"cachetools": {
"hashes": [
@ -448,7 +448,7 @@
},
"geventconnpool": {
"git": "https://github.com/rasky/geventconnpool.git",
"ref": null
"ref": "1bbb93a714a331a069adf27265fe582d9ba7ecd4"
},
"greenlet": {
"hashes": [
@ -1205,12 +1205,12 @@
},
"boto3": {
"hashes": [
"sha256:85e2fa361ad3210d30800bad311688261f2673a9b301e0edab56463d89609761",
"sha256:d18688bc5d688decf3cc404430a3ac3ec317be653cdcfbc51104c01f38a66434"
"sha256:02ce7dcad2d3b054cd99e7ca6df7a708e016a31b1c98b46d8df3b3891070c121",
"sha256:b8acb57a124434284d6ab69c61d32d70e84e13e2c27c33b4ad3c32f15ad407d3"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==1.28.76"
"version": "==1.28.79"
},
"boto3-mocking": {
"hashes": [
@ -1223,28 +1223,28 @@
},
"boto3-stubs": {
"hashes": [
"sha256:d89c3546e9e500f81ebfe78c71627e74085d3f77cd7e62830b5e48a67bce9b75",
"sha256:fc57fc32d9a0c4bdd02676c37dbaa911b3e6c3857e417a229d236938d31299fe"
"sha256:621e229ef9b394cd1f6cd5caa58a17347440b14423b01435d9f2a50031a427fc",
"sha256:f5986d1b09d516f58780100a3a86bfa75114370dd5dd0bdea67bfe8cda255723"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
"version": "==1.28.76"
"version": "==1.28.79"
},
"botocore": {
"hashes": [
"sha256:479abb5a1ee03eb00faa1ea176bc595b2f46f7494777807681a9df45ed99ea18",
"sha256:74e0a4515d61b2860b24dc208ca89a68d79dc00147125d531746d3ba808822ad"
"sha256:07ecb93833475dde68e5c0e02a7ccf8ca22caf68cdc892651c300529894133e1",
"sha256:6f1fc49e9e12f9772b4fef577837670bc84d772a7c946b4d08fe2890e34a4305"
],
"markers": "python_version >= '3.7'",
"version": "==1.31.76"
"version": "==1.31.79"
},
"botocore-stubs": {
"hashes": [
"sha256:778c6e014ae1103d546d59dffb000b0a659c9b9bbfa11050ff4a62c5adeec3a4",
"sha256:9fd9447a28642efa35a1c5590fc35132cf0173cd12055ba9044511cb6b24dd6f"
"sha256:64488b9f38905f8a60041998f9dc945754222d900a3345b449059667890c2c17",
"sha256:e4d8e782d774f45dbfc36d922a0a0edfffbacca2ce66bccaba02a893a38359f2"
],
"markers": "python_version >= '3.7' and python_version < '4.0'",
"version": "==1.31.76"
"version": "==1.31.79"
},
"click": {
"hashes": [
@ -1429,11 +1429,11 @@
},
"pbr": {
"hashes": [
"sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b",
"sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"
"sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda",
"sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"
],
"markers": "python_version >= '2.6'",
"version": "==5.11.1"
"version": "==6.0.0"
},
"platformdirs": {
"hashes": [

View file

@ -6,6 +6,10 @@
}
}
.usa-alert__text.measure-none {
max-width: measure(none);
}
// The icon was off center for some reason
// Fixes that issue
@media (min-width: 64em){

View file

@ -26,6 +26,24 @@ a.usa-button {
text-decoration: none;
}
a.usa-button.disabled-link {
background-color: #ccc !important;
color: #454545 !important
}
a.usa-button.disabled-link:hover {
background-color: #ccc !important;
cursor: not-allowed !important;
color: #454545 !important
}
a.usa-button.disabled-link:focus {
background-color: #ccc !important;
cursor: not-allowed !important;
outline: none !important;
color: #454545 !important
}
a.usa-button:not(.usa-button--unstyled, .usa-button--outline) {
color: color('white');
}

View file

@ -132,4 +132,10 @@ in the form $setting: value,
$theme-table-sorted-background-color: "accent-cool-lightest",
$theme-table-sorted-icon-color: "primary-darker",
$theme-table-unsorted-icon-color: "primary",
/*----------------------------
# Tooltip Settings
-----------------------------*/
$theme-tooltip-background-color: "accent-cool-lightest",
$theme-tooltip-font-color: "black"
);

View file

@ -46,6 +46,7 @@ path = Path(__file__)
env_db_url = env.dj_db_url("DATABASE_URL")
env_debug = env.bool("DJANGO_DEBUG", default=False)
env_is_production = env.bool("IS_PRODUCTION", default=False)
env_log_level = env.str("DJANGO_LOG_LEVEL", "DEBUG")
env_base_url = env.str("DJANGO_BASE_URL")
env_getgov_public_site_url = env.str("GETGOV_PUBLIC_SITE_URL", "")
@ -73,6 +74,8 @@ BASE_DIR = path.resolve().parent.parent.parent
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env_debug
# Controls production specific feature toggles
IS_PRODUCTION = env_is_production
# Applications are modular pieces of code.
# They are provided by Django, by third-parties, or by yourself.

View file

@ -70,10 +70,11 @@
{% if IS_DEMO_SITE %}
<section aria-label="Alert" >
<div class="usa-alert usa-alert--warning usa-alert--no-icon">
<div class="usa-alert usa-alert--info">
<div class="usa-alert__body">
<p class="usa-alert__text">
<strong>BETA SITE:</strong> Were building a new way to get a .gov. Take a look around, but dont rely on this site yet. This site is for testing purposes only. Dont enter real data into any form on this site. To learn about requesting a .gov domain, visit <a href="https://get.gov" class="usa-link">get.gov</a>
<h4 class="usa-alert__heading">New domain requests are paused</h4>
<p class="usa-alert__text measure-none">
This is the new registrar for managing .gov domains. Note that were not accepting requests for new .gov domains until January 2024. Follow .gov updates at <a href="https://get.gov/updates/" class="usa-link">get.gov/updates/</a>.
</p>
</div>
</div>

View file

@ -1,20 +1,41 @@
{% autoescape off %}{# In a text file, we don't want to have HTML entities escaped #}
Hi.
Hello from .gov.
You have been added as a manager on {% if domains|length > 1 %}multiple domains (listed below){% else %}{{ domains.0 }}{% endif %}.
Our new domain management system—the .gov registrar—is now available. The organization, contacts, and DNS information for your .gov domain{% if domains|length > 1 %}s{% endif %} have been transferred to our new registrar.
Your .gov domain{% if domains|length > 1 %}s{% endif %}:
{% for domain in domains %} - {{ domain }}
{% endfor %}
If youre not affiliated with the above domain{% if domains|length > 1 %}s{% endif %} or think you received this message in error, let us know in a reply to this email.
CREATE A LOGIN.GOV ACCOUNT
You cant use your old credentials to access the new registrar. Access is now managed through Login.gov, a simple and secure process for signing into many government services with one account. Follow these steps to create your Login.gov account <https://login.gov/help/get-started/create-your-account/>.
When creating an account, youll need to provide the same email address you used to log in to the old registrar. That will ensure your domains are linked to your Login.gov account.
If you need help finding the email address you used in the past, let us know in a reply to this email.
CHECK YOUR .GOV DOMAIN CONTACTS
This is a good time to check who has access to your .gov domain{% if domains|length > 1 %}s{% endif %}. The admin, technical, and billing contacts listed for your domain{% if domains|length > 1 %}s{% endif %} in our old system also received this email. In our new registrar, these contacts are all considered “domain managers.” We no longer have the admin, technical, and billing roles, and you arent limited to three domain managers like in the old system.
1. Once you have your Login.gov account, sign in to the new registrar at <https://manage.get.gov>.
2. Click the “Manage” link next to your .gov domain, then click on “Domain managers” to see who has access to your domain.
3. If any of these users should not have access to your domain, let us know in a reply to this email.
After verifying who has access to your domain{% if domains|length > 1 %}s{% endif %}, we also suggest reviewing your contact information and organization mailing address to ensure those are up to date.
DOMAIN EXPIRATION DATES EXTENDED BY ONE YEAR
Expiration dates for .gov domains in good standing have been extended for one year. Expiration dates won't be shown in the new registrar yet.
YOU NEED A LOGIN.GOV ACCOUNT
Youll need a Login.gov account to manage your .gov domain{% if domains|length > 1 %}s{% endif %}. Login.gov provides a simple and secure process for signing into many government services with one account. If you dont already have one, follow these steps to create your Login.gov account <https://login.gov/help/get-started/create-your-account/>.
DOMAIN MANAGEMENT
As a .gov domain manager you can add or update information about your domain{% if domains|length > 1 %}s{% endif %}. Youll also serve as a contact for your .gov domain{% if domains|length > 1 %}s{% endif %}. Please keep your contact information updated. Learn more about domain management <https://get.gov/help/>.
{% if domains|length > 1 %}
DOMAINS
{% for domain in domains %} {{ domain }}
{% endfor %}{% else %}
{% endif %}
SOMETHING WRONG?
If youre not affiliated with {{ domain }} or think you received this message in error, contact the .gov team <https://get.gov/help/#contact-us>.
If you think you received this message in error or have a question, let us know in a reply to this email.
THANK YOU
@ -24,6 +45,8 @@ THANK YOU
----------------------------------------------------------------
The .gov team
Contact us: <https://get.gov/contact/>
Visit <https://get.gov>
.Gov blog <https://get.gov/updates/>
Domain management <https://manage.get.gov>
Get.gov <https://get.gov>
{% endautoescape %}

View file

@ -1 +1 @@
You've been added to a .gov domain
(Action required) Manage your .gov domain{% if domains|length > 1 %}s{% endif %} in the new registrar

View file

@ -13,9 +13,22 @@
<h1>Manage your domains</h2>
<p class="margin-top-4">
<a href="{% url 'application:' %}" class="usa-button">
{% if is_production %}
<a href="javascript:void(0)"
class="usa-button usa-tooltip disabled-link"
data-position="right"
title="Coming in 2024"
aria-disabled="true"
data-tooltip="true"
>
Start a new domain request
</a>
{% else %}
<a href="{% url 'application:' %}" class="usa-button"
>
Start a new domain request
</a>
{% endif %}
</p>
<section class="section--outlined tablet:grid-col-11 desktop:grid-col-10">
@ -130,7 +143,7 @@
{% endif %}
</section>
{# Note: Reimplement this after MVP.. #}
{# Note: Reimplement this after MVP #}
<!--
<section class="section--outlined tablet:grid-col-11 desktop:grid-col-10">
<h2>Archived domains</h2>

View file

@ -2,6 +2,7 @@ from django.db.models import F
from django.shortcuts import render
from registrar.models import DomainApplication
from django.conf import settings
def index(request):
@ -22,4 +23,5 @@ def index(request):
state=F("domain__state"),
)
context["domains"] = domains
context["is_production"] = settings.IS_PRODUCTION
return render(request, "home.html", context)

View file

@ -1,8 +1,8 @@
-i https://pypi.python.org/simple
annotated-types==0.6.0; python_version >= '3.8'
asgiref==3.7.2; python_version >= '3.7'
boto3==1.28.76; python_version >= '3.7'
botocore==1.31.76; python_version >= '3.7'
boto3==1.28.79; python_version >= '3.7'
botocore==1.31.79; python_version >= '3.7'
cachetools==5.3.2; python_version >= '3.7'
certifi==2023.7.22; python_version >= '3.6'
cfenv==0.5.3
@ -28,7 +28,7 @@ fred-epplib@ git+https://github.com/cisagov/epplib.git@d56d183f1664f34c40ca9716a
furl==2.1.3
future==0.18.3; python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'
gevent==23.9.1; python_version >= '3.8'
geventconnpool@ git+https://github.com/rasky/geventconnpool.git
geventconnpool@ git+https://github.com/rasky/geventconnpool.git@1bbb93a714a331a069adf27265fe582d9ba7ecd4
greenlet==3.0.1; python_version >= '3.7'
gunicorn==21.2.0; python_version >= '3.5'
idna==3.4; python_version >= '3.5'