Skip to content

Commit 3866261

Browse files
committed
Merge branch 'master' into emergency-backup-zip
2 parents bda11b5 + e61b4ea commit 3866261

File tree

7 files changed

+206
-5
lines changed

7 files changed

+206
-5
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727
packages:
2828
- libgconf-2-4
2929
script:
30+
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
31+
- ./node_modules/.bin/ts-node rebuild-only-changed-images.ts
3032
- yarn global add wait-on
3133
- yarn dev:secrets:gen
3234
- docker swarm init

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@
5252
},
5353
"devDependencies": {
5454
"@types/dotenv": "^6.1.0",
55+
"@types/js-yaml": "^3.12.1",
5556
"bundlesize": "^0.18.0",
5657
"concurrently": "^3.5.1",
5758
"husky": "1.0.0-rc.13",
59+
"js-yaml": "^3.13.1",
5860
"lerna": "^3.18.3",
5961
"lint-staged": "^7.1.0",
6062
"prettier": "^1.15.2"
@@ -64,6 +66,7 @@
6466
"license-check-and-add": "^3.0.3",
6567
"opener": "^1.5.1",
6668
"patch-package": "^6.1.2",
67-
"postinstall-postinstall": "^2.0.0"
69+
"postinstall-postinstall": "^2.0.0",
70+
"ts-node": "^8.5.2"
6871
}
6972
}

packages/client/src/views/Settings/PasswordChangeModal.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,13 @@ class PasswordChangeModalComp extends React.Component<IFullProps, State> {
337337
<span>
338338
{intl.formatMessage(
339339
messages.passwordLengthCharacteristicsForPasswordUpdateForm,
340-
{ min: 8 }
340+
{
341+
min: intl.formatMessage({
342+
defaultMessage: '8',
343+
description: 'Minimum length password',
344+
id: 'number.eight'
345+
})
346+
}
341347
)}
342348
</span>
343349
</div>
@@ -400,7 +406,13 @@ class PasswordChangeModalComp extends React.Component<IFullProps, State> {
400406
<span>
401407
{intl.formatMessage(
402408
messages.passwordLengthCharacteristicsForPasswordUpdateForm,
403-
{ min: 8 }
409+
{
410+
min: intl.formatMessage({
411+
defaultMessage: '8',
412+
description: 'Minimum length password',
413+
id: 'number.eight'
414+
})
415+
}
404416
)}
405417
</span>
406418
</div>

packages/client/src/views/Settings/SettingsPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ class SettingsView extends React.Component<IProps, IState> {
266266
items: [
267267
{
268268
label: intl.formatMessage(constantsMessages.labelPassword),
269-
placeHolder: 'Last change 4 days ago',
269+
placeHolder: '********',
270270
action: {
271271
id: 'BtnChangePassword',
272272
label: intl.formatMessage(buttonMessages.change),
@@ -275,7 +275,7 @@ class SettingsView extends React.Component<IProps, IState> {
275275
},
276276
{
277277
label: intl.formatMessage(constantsMessages.labelPin),
278-
placeHolder: 'Last change 4 days ago',
278+
placeHolder: '****',
279279
action: {
280280
label: intl.formatMessage(buttonMessages.change),
281281
disabled: true

packages/resources/src/bgd/features/languages/generated/register.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,16 @@
416416
"countries.ZAF": "South Africa",
417417
"countries.ZMB": "Zambia",
418418
"countries.ZWE": "Zimbabwe",
419+
"number.zero": "0",
420+
"number.one": "1",
421+
"number.two": "2",
422+
"number.three": "3",
423+
"number.four": "4",
424+
"number.five": "5",
425+
"number.six": "6",
426+
"number.seven": "7",
427+
"number.eight": "8",
428+
"number.nine": "9",
419429
"create.validate.application.action.decription": "{completeApplication, select, true {By sending for approval you confirm that the information has been reviewed by the applicant and that it is ready to register.} false {Mandatory information is missing. Please add this information so that you can send to register.}}",
420430
"createPIN.createDescription": "Choose a PIN that doesn't have 4 repeating digits or sequential numbers.",
421431
"createPIN.createTitle": "Create a PIN",
@@ -1486,6 +1496,16 @@
14861496
"countries.ZAF": "দক্ষিন আফ্রিকা",
14871497
"countries.ZMB": "জাম্বিয়া",
14881498
"countries.ZWE": "জিম্বাবুয়ে",
1499+
"number.zero": "",
1500+
"number.one": "",
1501+
"number.two": "",
1502+
"number.three": "",
1503+
"number.four": "",
1504+
"number.five": "",
1505+
"number.six": "",
1506+
"number.seven": "",
1507+
"number.eight": "",
1508+
"number.nine": "",
14891509
"create.validate.application.action.decription": "{completeApplication, select, true {অনুমোদন পাঠানোর মাধ্যমে আপনি নিশ্চিত হন যে তথ্যটি আবেদনকারীর দ্বারা পর্যালোচনা করা হয়েছে এবং এটি নিবন্ধন করার জন্য প্রস্তুত।} false {বাধ্যতামূলক তথ্য অনুপস্থিত। নিবন্ধটি পাঠাতে তথ্যগুলো যোগ করুন}}",
14901510
"createPIN.createDescription": "Choose a PIN that doesn't have 4 repeating digits or sequential numbers.",
14911511
"createPIN.createTitle": "Create a PIN",

rebuild-only-changed-images.ts

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/*
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this
4+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
5+
*
6+
* OpenCRVS is also distributed under the terms of the Civil Registration
7+
* & Healthcare Disclaimer located at http://opencrvs.org/license.
8+
*
9+
* Copyright (C) The OpenCRVS Authors. OpenCRVS and the OpenCRVS
10+
* graphic logo are (registered/a) trademark(s) of Plan International.
11+
*/
12+
13+
import * as yaml from 'js-yaml'
14+
import { readFileSync, writeFileSync } from 'fs'
15+
import fetch from 'node-fetch'
16+
import * as cp from 'child_process'
17+
import { promisify } from 'util'
18+
19+
const exec = promisify(cp.exec.bind(cp))
20+
21+
const { DOCKER_USERNAME, DOCKER_PASSWORD } = process.env
22+
23+
async function getToken() {
24+
const response = await fetch('https://hub.docker.com/v2/users/login/', {
25+
method: 'POST',
26+
body: JSON.stringify({
27+
username: DOCKER_USERNAME,
28+
password: DOCKER_PASSWORD
29+
}),
30+
31+
headers: {
32+
'Content-Type': 'application/json'
33+
}
34+
})
35+
36+
const body = await response.json()
37+
return body.token
38+
}
39+
40+
async function getLatestTag(token: string, repository: string) {
41+
const response = await fetch(
42+
`https://hub.docker.com/v2/repositories/${repository}/tags`,
43+
{
44+
headers: {
45+
Authorization: `JWT ${token}`
46+
}
47+
}
48+
)
49+
const body = await response.json()
50+
51+
if (!body.results) {
52+
return null
53+
}
54+
55+
const latest = body.results.find(({ name }) => name === 'latest')
56+
return body.results.find(
57+
({ name, images }) =>
58+
name !== 'latest' && images[0].digest === latest.images[0].digest
59+
)
60+
}
61+
62+
const IMAGE_NAME_TO_DIRECTORY = {
63+
styleguide: 'components'
64+
}
65+
66+
async function preventBuildImageFromBeingBuilt() {
67+
const pkg = JSON.parse(readFileSync('./package.json', 'utf8'))
68+
pkg.scripts['build:image'] = 'echo "Skipping build image creation..."'
69+
writeFileSync('./package.json', JSON.stringify(pkg))
70+
}
71+
async function ignoreFromBuild(packages: string[]) {
72+
const pkg = JSON.parse(readFileSync('./package.json', 'utf8'))
73+
pkg.scripts['build'] =
74+
pkg.scripts['build'] +
75+
' ' +
76+
packages.map(directory => `--ignore ${directory}`).join(' ')
77+
writeFileSync('./package.json', JSON.stringify(pkg))
78+
}
79+
80+
async function run() {
81+
const compose = yaml.safeLoad(readFileSync('./docker-compose.yml', 'utf8'))
82+
83+
const token = await getToken()
84+
85+
// Not sure why but docker hub's API sometimes fails if you query it right after getting a token
86+
await new Promise(resolve => setTimeout(resolve, 1000))
87+
88+
const serviceNames = Object.keys(compose.services)
89+
90+
const packagesThatAreUpToDate = []
91+
92+
for (const serviceName of serviceNames) {
93+
const service = compose.services[serviceName]
94+
const { image } = service
95+
const repository = image.split(':')[0]
96+
const imageName = repository.replace('jembi/ocrvs-', '')
97+
const directory = IMAGE_NAME_TO_DIRECTORY[imageName] || imageName
98+
99+
const latestGitHash = (await exec(
100+
`git --no-pager log -n 1 --format="%h" -- "packages/${directory}"`
101+
)).trim()
102+
103+
const latestTag = await getLatestTag(token, repository)
104+
if (!latestTag) {
105+
console.log('⚠️ ', serviceName, ': no tags found!')
106+
continue
107+
}
108+
109+
const imageHash = latestTag.name
110+
111+
try {
112+
// Check that image hash is newer or the same as the latest commit of this package
113+
await exec(`git merge-base --is-ancestor ${latestGitHash} ${imageHash}`)
114+
console.log('✅ ', serviceName, ': no rebuild needed')
115+
service.image = `${repository}:latest`
116+
delete service.build
117+
packagesThatAreUpToDate.push(directory)
118+
} catch {
119+
console.log('♻️ ', serviceName, ': rebuilding...')
120+
}
121+
}
122+
writeFileSync('./docker-compose.yml', yaml.safeDump(compose))
123+
124+
// All services can be fetched from docker hub
125+
if (packagesThatAreUpToDate.length === serviceNames.length) {
126+
console.log('No packages to rebuild. Removing build image creation step.')
127+
await preventBuildImageFromBeingBuilt()
128+
} else {
129+
await ignoreFromBuild(packagesThatAreUpToDate)
130+
}
131+
}
132+
133+
run()

yarn.lock

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3039,6 +3039,11 @@
30393039
resolved "https://registry.yarnpkg.com/@types/joi/-/joi-14.3.3.tgz#f251aa8150fc0b6a7ce9feab21802a28473de335"
30403040
integrity sha512-6gAT/UkIzYb7zZulAbcof3lFxpiD5EI6xBeTvkL1wYN12pnFQ+y/+xl9BvnVgxkmaIDN89xWhGZLD9CvuOtZ9g==
30413041

3042+
"@types/js-yaml@^3.12.1":
3043+
version "3.12.1"
3044+
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656"
3045+
integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==
3046+
30423047
"@types/json2csv@^4.2.0", "@types/json2csv@^4.4.0":
30433048
version "4.5.0"
30443049
resolved "https://registry.yarnpkg.com/@types/json2csv/-/json2csv-4.5.0.tgz#f846edb5239969942a1aa6fbc470e13e69ae971d"
@@ -4300,6 +4305,11 @@ [email protected]:
43004305
resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545"
43014306
integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==
43024307

4308+
arg@^4.1.0:
4309+
version "4.1.2"
4310+
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.2.tgz#e70c90579e02c63d80e3ad4e31d8bfdb8bd50064"
4311+
integrity sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==
4312+
43034313
argparse@^1.0.7:
43044314
version "1.0.10"
43054315
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -8601,6 +8611,11 @@ [email protected], diff@^3.1.0, diff@^3.2.0:
86018611
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
86028612
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
86038613

8614+
diff@^4.0.1:
8615+
version "4.0.1"
8616+
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff"
8617+
integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==
8618+
86048619
diffie-hellman@^5.0.0:
86058620
version "5.0.3"
86068621
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -22460,6 +22475,17 @@ ts-node@^7.0.1:
2246022475
source-map-support "^0.5.6"
2246122476
yn "^2.0.0"
2246222477

22478+
ts-node@^8.5.2:
22479+
version "8.5.2"
22480+
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.5.2.tgz#434f6c893bafe501a30b32ac94ee36809ba2adce"
22481+
integrity sha512-W1DK/a6BGoV/D4x/SXXm6TSQx6q3blECUzd5TN+j56YEMX3yPVMpHsICLedUw3DvGF3aTQ8hfdR9AKMaHjIi+A==
22482+
dependencies:
22483+
arg "^4.1.0"
22484+
diff "^4.0.1"
22485+
make-error "^1.1.1"
22486+
source-map-support "^0.5.6"
22487+
yn "^3.0.0"
22488+
2246322489
[email protected], ts-pnp@^1.0.0:
2246422490
version "1.1.2"
2246522491
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552"
@@ -24411,6 +24437,11 @@ yn@^2.0.0:
2441124437
resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
2441224438
integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
2441324439

24440+
yn@^3.0.0:
24441+
version "3.1.1"
24442+
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
24443+
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
24444+
2441424445
zen-observable-ts@^0.8.18:
2441524446
version "0.8.18"
2441624447
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.18.tgz#ade44b1060cc4a800627856ec10b9c67f5f639c8"

0 commit comments

Comments
 (0)