Skip to content

Commit 6188606

Browse files
authored
Merge pull request #265 from AppQuality/develop
Pull Request triggered from POEditor
2 parents d2a98e0 + 2fe5574 commit 6188606

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+3488
-81
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# This is a basic workflow to help you get started with Actions
2+
3+
name: Deploy to staging
4+
5+
# Controls when the workflow will run
6+
on:
7+
workflow_dispatch:
8+
9+
env:
10+
ECR_REPOSITORY: unguess-react
11+
DEPLOY_BUCKET: unguess-app-staging-source
12+
DEPLOY_KEY: unguess-app-react-staging-pipeline/source.zip
13+
PIPELINE: unguess-app-react-staging-pipeline-pipeline
14+
15+
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
16+
jobs:
17+
# This workflow contains a single job called "build"
18+
build:
19+
# The type of runner that the job will run on
20+
runs-on: ubuntu-latest
21+
22+
# Steps represent a sequence of tasks that will be executed as part of the job
23+
steps:
24+
- name: Checkout
25+
uses: actions/checkout@v2
26+
27+
- name: Extract environment
28+
shell: bash
29+
run: |
30+
echo "##[set-output name=ECR_REPOSITORY;]$ECR_REPOSITORY"
31+
echo "##[set-output name=DEPLOY_BUCKET;]$DEPLOY_BUCKET"
32+
echo "##[set-output name=DEPLOY_KEY;]$DEPLOY_KEY"
33+
echo "##[set-output name=PIPELINE;]$PIPELINE"
34+
id: environment
35+
- name: Extract branch name
36+
shell: bash
37+
run: |
38+
BRANCH=$(echo ${GITHUB_REF#refs/heads/})
39+
if [ "$BRANCH" = "master" ]; then
40+
TAG="latest"
41+
else
42+
TAG="$BRANCH"
43+
fi
44+
echo "##[set-output name=tag;]$TAG"
45+
id: extract_branch
46+
- name: "Generate dist zip"
47+
run: |
48+
cd deployment
49+
echo -n "${{steps.environment.outputs.ECR_REPOSITORY}}:${{steps.extract_branch.outputs.tag}}" > docker-image.txt
50+
zip dist.zip *
51+
- uses: zdurham/s3-upload-github-action@master
52+
env:
53+
S3_BUCKET: ${{steps.environment.outputs.DEPLOY_BUCKET}}
54+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
55+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
56+
AWS_REGION: "eu-west-1" # optional: defaults to us-east-1
57+
FILE: ./deployment/dist.zip
58+
S3_KEY: ${{steps.environment.outputs.DEPLOY_KEY}}
59+
- name: configure AWS creds
60+
uses: aws-actions/configure-aws-credentials@v1
61+
with:
62+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
63+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
64+
aws-region: eu-west-1
65+
- name: Start CodePipeline
66+
uses: moia-oss/aws-codepipeline-trigger@v1
67+
with:
68+
pipeline: ${{steps.environment.outputs.PIPELINE}}
69+
wait: true

.github/workflows/push.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ name: Build and Push to ECR
33
on:
44
push:
55
branches:
6-
- master
7-
- develop
6+
- "*"
87
workflow_dispatch:
98

10-
jobs:
9+
jobs:
1110
validate:
1211
runs-on: ubuntu-latest
1312
steps:
@@ -51,7 +50,7 @@ jobs:
5150
fi
5251
echo "##[set-output name=img_tag;]$TAG"
5352
id: extract_image_tag
54-
53+
5554
- name: Extract env name
5655
shell: bash
5756
run: |

.github/workflows/release.yml

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
name: Create release
2+
3+
on:
4+
push:
5+
tags:
6+
- release-*
7+
8+
env:
9+
ECR_REPOSITORY: unguess-react
10+
DEPLOY_PROD_BUCKET: unguess-app-staging-source
11+
DEPLOY_PROD_KEY: unguess-app-react-staging-pipeline/source.zip
12+
ASG_NAME: unguess-app-asg-unguess-app-react-production
13+
PIPELINE: unguess-app-react-production-pipeline-pipeline
14+
15+
jobs:
16+
push-to-ecr:
17+
name: Push Image
18+
runs-on: ubuntu-latest
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@v2
22+
23+
- name: Get tag name
24+
shell: bash
25+
run: |
26+
TAG=${GITHUB_REF##*/}
27+
echo "##[set-output name=tag;]$TAG"
28+
echo "##[set-output name=ECR_REPOSITORY;]$ECR_REPOSITORY"
29+
id: extract_tag
30+
31+
- name: Docker ECR
32+
uses: kciter/aws-ecr-action@v2
33+
with:
34+
access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }}
35+
secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
36+
account_id: ${{ secrets.AWS_ACCOUNT_ID }}
37+
region: eu-west-1
38+
repo: ${{ steps.extract_tag.outputs.ECR_REPOSITORY }}
39+
tags: ${{ steps.extract_tag.outputs.tag }}
40+
41+
release-to-prod:
42+
name: Release to production
43+
needs: push-to-ecr
44+
runs-on: ubuntu-latest
45+
environment: production
46+
steps:
47+
- name: Checkout
48+
uses: actions/checkout@v2
49+
- name: Get tag name
50+
shell: bash
51+
run: |
52+
TAG=${GITHUB_REF##*/}
53+
echo "##[set-output name=tag;]$TAG"
54+
echo "##[set-output name=ECR_REPOSITORY;]$ECR_REPOSITORY"
55+
echo "##[set-output name=DEPLOY_BUCKET;]$DEPLOY_BUCKET"
56+
echo "##[set-output name=DEPLOY_PROD_BUCKET;]$DEPLOY_PROD_BUCKET"
57+
echo "##[set-output name=DEPLOY_PROD_KEY;]$DEPLOY_PROD_KEY"
58+
echo "##[set-output name=ASG_NAME;]$ASG_NAME"
59+
echo "##[set-output name=PIPELINE;]$PIPELINE"
60+
id: extract_tag
61+
- name: "Generate dist zip"
62+
run: |
63+
cd deployment
64+
echo -n "${{ steps.extract_tag.outputs.ECR_REPOSITORY }}:${{steps.extract_tag.outputs.tag}}" > docker-image.txt
65+
zip dist.zip *
66+
- uses: zdurham/s3-upload-github-action@master
67+
env:
68+
S3_BUCKET: ${{ steps.extract_tag.outputs.DEPLOY_PROD_BUCKET }}
69+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
70+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
71+
AWS_REGION: "eu-west-1"
72+
FILE: ./deployment/dist.zip
73+
S3_KEY: ${{ steps.extract_tag.outputs.DEPLOY_PROD_KEY }}
74+
- name: configure AWS creds
75+
uses: aws-actions/configure-aws-credentials@v1
76+
with:
77+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
78+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
79+
aws-region: eu-west-1
80+
- name: Update asg capacity to 2
81+
uses: AppQuality/update-desired-asg-instances@v1.0.0
82+
id: update-asg
83+
env:
84+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
85+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
86+
AWS_REGION: "eu-west-1"
87+
ASG_NAME: ${{ steps.extract_tag.outputs.ASG_NAME }}
88+
DESIRED_INSTANCES: 2
89+
MAX_INSTANCES: 2
90+
- name: Start CodePipeline
91+
uses: moia-oss/aws-codepipeline-trigger@v1
92+
with:
93+
pipeline: ${{ steps.extract_tag.outputs.PIPELINE }}
94+
wait: true
95+
- name: Restore asg capacity
96+
uses: AppQuality/update-desired-asg-instances@v1.0.0
97+
env:
98+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
99+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
100+
AWS_REGION: "eu-west-1"
101+
ASG_NAME: ${{ steps.extract_tag.outputs.ASG_NAME }}
102+
DESIRED_INSTANCES: ${{ steps.update-asg.outputs.original_desired }}
103+
MAX_INSTANCES: ${{ steps.update-asg.outputs.original_max }}
104+
- name: Get deployment url
105+
uses: AppQuality/get-codeploy-from-codepipeline@1.0.0
106+
id: codedeploy
107+
env:
108+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
109+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
110+
AWS_REGION: "eu-west-1"
111+
PIPELINE_NAME: ${{ steps.extract_tag.outputs.PIPELINE }}
112+
- name: Update release with deployment url
113+
uses: tubone24/update_release@v1.0
114+
env:
115+
GITHUB_TOKEN: ${{ github.token }}
116+
with:
117+
body: "[![](https://img.shields.io/badge/AWS-Redeploy-blueviolet)](${{ steps.codedeploy.outputs.codedeploy_url }})"
118+
isAppendBody: true

deployment/after-install.sh

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
# enable and start docker service
5+
systemctl enable docker.service
6+
systemctl start docker.service
7+
8+
# login to ecr
9+
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 163482350712.dkr.ecr.eu-west-1.amazonaws.com
10+
11+
# read docker image version from manifest
12+
DOCKER_IMAGE=$(cat "/home/ec2-user/unguess-react/docker-image.txt")
13+
DOCKER_COMPOSE_FILE="/home/ec2-user/$APPLICATION_NAME/docker-compose.yml"
14+
INSTANCE_ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)
15+
ENVIRONMENT=$(aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values=environment" --output=text | cut -f5)
16+
17+
# pull docker image from ecr
18+
docker pull 163482350712.dkr.ecr.eu-west-1.amazonaws.com/$DOCKER_IMAGE
19+
20+
# get env variables from parameter store
21+
mkdir -p /var/docker/keys
22+
mkdir -p /home/ec2-user/$APPLICATION_NAME
23+
24+
if test -f "$DOCKER_COMPOSE_FILE"; then
25+
set +e
26+
IS_RUNNING=$(docker ps -a | grep $DOCKER_IMAGE| wc -l)
27+
set -e
28+
if [ "$IS_RUNNING" -eq "1" ]; then
29+
docker-compose -f $DOCKER_COMPOSE_FILE down
30+
fi
31+
fi
32+
33+
echo "
34+
version: '3'
35+
services:
36+
app:
37+
image: 163482350712.dkr.ecr.eu-west-1.amazonaws.com/$DOCKER_IMAGE
38+
restart: always
39+
ports:
40+
- '80:80'
41+
environment:
42+
PORT: 80
43+
44+
" > $DOCKER_COMPOSE_FILE
45+
46+
47+
docker-compose -f $DOCKER_COMPOSE_FILE up -d

deployment/appspec.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
version: 0.0
2+
os: linux
3+
files:
4+
- source: /
5+
destination: /home/ec2-user/unguess-react
6+
permissions:
7+
- object: /home/ec2-user/unguess-react
8+
owner: ec2-user
9+
group: ec2-user
10+
11+
hooks:
12+
AfterInstall:
13+
- location: after-install.sh
14+
runas: root

src/common/GoogleTagManager.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const tagManagerArgs: TagManagerArgs = {
1414
events: {
1515
unguess_loaded: 'unguess_loaded',
1616
workspace_change: 'workspace_change',
17+
generic_error: 'generic_error',
1718
},
1819
};
1920
TagManager.initialize(tagManagerArgs);

src/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export const FEATURE_FLAG_CATALOG = 'catalog-pages';
44
export const EXPRESS_1_CAMPAIGN_TYPE_ID = 46;
55
export const EXPRESS_2_CAMPAIGN_TYPE_ID = 51;
66
export const EXPRESS_3_CAMPAIGN_TYPE_ID = 52;
7+
export const EXPRESS_4_CAMPAIGN_TYPE_ID = 66;
78
export const BASE_DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss';
89
export const ZAPIER_WEBHOOK_TRIGGER =
910
process.env.REACT_ZAPIER_WEBHOOK ||
@@ -24,6 +25,7 @@ export const EXPRESS_USE_CASES_LIMIT = 5;
2425
export const EXPRESS_START_DATE_MAX_VALUE = 30;
2526
export const EXPRESS_BUSINESS_DAYS_TO_ADD = 2;
2627
export const EXPRESS_3_BUSINESS_DAYS_TO_ADD = 3;
28+
export const EXPRESS_4_UX_TAGGING_BUSINESS_DAYS_TO_ADD = 5;
2729

2830
export const RELATIVE_DATE_FORMAT_OPTS: {
2931
[key: string]: { [key: string]: string };

src/hooks/useGTMevent.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { useCallback } from 'react';
2+
import TagManager from 'react-gtm-module';
3+
import { useAppSelector } from 'src/app/hooks';
4+
5+
export interface GTMEventData {
6+
event: string;
7+
content?: string;
8+
}
9+
10+
export const useSendGTMevent = () => {
11+
const { userData: user } = useAppSelector((state) => state.user);
12+
const { activeWorkspace } = useAppSelector((state) => state.navigation);
13+
14+
const callback = useCallback(
15+
(data: GTMEventData) => {
16+
if (user && activeWorkspace && data) {
17+
TagManager.dataLayer({
18+
dataLayer: {
19+
event: data?.event,
20+
role: user.role,
21+
wp_user_id: user.tryber_wp_user_id,
22+
tester_id: user.id,
23+
name: user.name,
24+
email: user.email,
25+
company: activeWorkspace.company,
26+
...(data?.content && { content: data.content }),
27+
},
28+
});
29+
}
30+
},
31+
[user, activeWorkspace]
32+
);
33+
34+
return callback;
35+
};

src/hooks/useLocalizeDashboardUrl.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const isReactCampaign = (outputs: Output[]): boolean => {
77

88
if (outputs.length) {
99
outputs.forEach((output) => {
10-
if (output === 'bugs') isReact = false;
1110
if (output === 'media') isReact = false;
1211
});
1312
}

src/locales/en/translation.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,50 @@
139139
"__EXPRESS_3_WIZARD_STEP_WHO_TAG_USERS": "N° of users 6",
140140
"__EXPRESS_3_WIZARD_STEP_WHO_TAG_USERS_LANGUAGE": "Live in Italy",
141141
"__EXPRESS_3_WIZARD_STEP_WHO_TAG_USERS_LOCATION": "Speak Italian",
142+
"__EXPRESS_4_WIZARD_STEP_CONFIRM_WHO_TEXT": "Your users",
143+
"__EXPRESS_4_WIZARD_STEP_HOW_ADD_USE_CASE_CARD_TITLE": "Add user task",
144+
"__EXPRESS_4_WIZARD_STEP_HOW_EDIT_USE_CASE_CARD_INCOMEPLETE_LABEL": "This user task is not complete",
145+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_DELETE_USE_CASE_LABEL": "Delete User Task",
146+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_EMPTY_USE_CASE_DESCRIPTION": "Specify what actions testers will perform to verify one or more functionalities in real scenarios",
147+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_EMPTY_USE_CASE_LABEL": "Add your first user task",
148+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_MIN_ERROR": "Please add at least one user task",
149+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_TITLE_FIELD_TITLE": "User task title",
150+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_TITLE_REQUIRED": "User task title is required",
151+
"__EXPRESS_4_WIZARD_STEP_HOW_USE_CASE_MODAL_USE_CASE_LABEL": "User Task",
152+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_AGE_RANGE_TEXT": "Are aged between <1><0>{{age_range_start}}</0> and <2>{{age_range_end}}</2></1> years.",
153+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_AGE_RANGE_TEXT_ALL": "Are <1>evenly distributed</1> by <3>age</3>.",
154+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_DIGITALIZATION_TEXT_ALL": "Are <1>evenly distributed</1> by <4>digital literacy</4>.",
155+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_DIGITALIZATION_TEXT_BEGINNER": "Have a <1>low level</1> of <4>digital literacy</4>.",
156+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_DIGITALIZATION_TEXT_EXPERT": "Have an <1>high level</1> of <4>digital literacy</4>.",
157+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_DIGITALIZATION_TEXT_INTERMEDIATE": "Have a <1>medium level</1> of <4>digital literacy</>.",
158+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_GENDER_TEXT": "Are <1>{{gender}}</1>.",
159+
"__EXPRESS_4_WIZARD_STEP_RECAP_WHO_GENDER_TEXT_ALL": "Are <1>evenly distributed</1> by <3>gender</3>.",
160+
"__EXPRESS_4_WIZARD_STEP_WHERE_SUBTITLE": "Choose a <1>type of device</1> where to perform the test.",
161+
"__EXPRESS_4_WIZARD_STEP_WHO_DEMOGRAPHICS_CRITERIA_DESCRIPTION": "Select the demographics that you want to target",
162+
"__EXPRESS_4_WIZARD_STEP_WHO_DEMOGRAPHICS_CRITERIA_TITLE": "Demographics criteria",
163+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_AGE_RANGE_ALL": "All ages",
164+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_AGE_RANGE_ALL_HINT": "from 18 to 70",
165+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_AGE_RANGE_LABEL": "Age range",
166+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_GENDER_ALL": "All genders",
167+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_GENDER_ALL_HINT": "Testers equally divided by gender",
168+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_GENDER_LABEL": "How do you describe the gender identity?",
169+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_LITERACY_ALL": "All levels",
170+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_LITERACY_ALL_HINT": "Testers equally divided by literacy level",
171+
"__EXPRESS_4_WIZARD_STEP_WHO_FIELD_LITERACY_LABEL": "Digital literacy level",
172+
"__EXPRESS_4_WIZARD_STEP_WHO_GENDER_FEMALE": "Female",
173+
"__EXPRESS_4_WIZARD_STEP_WHO_GENDER_FEMALE_PLURAL": "women",
174+
"__EXPRESS_4_WIZARD_STEP_WHO_GENDER_MALE": "Male",
175+
"__EXPRESS_4_WIZARD_STEP_WHO_GENDER_MALE_PLURAL": "men",
176+
"__EXPRESS_4_WIZARD_STEP_WHO_LABEL_SELECTION_CRITERIA": "Specify selection criteria for the 6 users who will browse your product",
177+
"__EXPRESS_4_WIZARD_STEP_WHO_LITERACY_BEGINNER": "Beginner",
178+
"__EXPRESS_4_WIZARD_STEP_WHO_LITERACY_BEGINNER_DESCRIPTION": "This tester has no autonomy, needs help from family and friens",
179+
"__EXPRESS_4_WIZARD_STEP_WHO_LITERACY_EXPERT": "Expert",
180+
"__EXPRESS_4_WIZARD_STEP_WHO_LITERACY_EXPERT_DESCRIPTION": "Completely autonomous in any digital product use",
181+
"__EXPRESS_4_WIZARD_STEP_WHO_LITERACY_INTERMEDIATE": "Intermediate",
182+
"__EXPRESS_4_WIZARD_STEP_WHO_LITERACY_INTERMEDIATE_DESCRIPTION": "Partial autonomy, needs help in some scenarios",
183+
"__EXPRESS_4_WIZARD_STEP_WHO_TAG_USERS": "N° of users 6",
184+
"__EXPRESS_4_WIZARD_STEP_WHO_TAG_USERS_LANGUAGE": "Live in Italy",
185+
"__EXPRESS_4_WIZARD_STEP_WHO_TAG_USERS_LOCATION": "Speak Italian",
142186
"__EXPRESS_LABEL": "Express",
143187
"__EXPRESS_WIZARD_BACK_BUTTON_LABEL": "Back",
144188
"__EXPRESS_WIZARD_CONFIRM_BUTTON_LABEL": "Launch",

0 commit comments

Comments
 (0)