Skip to content

Commit c577764

Browse files
authored
chore: add all servers to docker (#85)
* chore: add all servers to docker * chore: add all servers to docker * chore: wait until elastic is up * ci: add test server to run the tests * ci: use specific docker-compose for ci
1 parent d4f712f commit c577764

File tree

12 files changed

+223
-97
lines changed

12 files changed

+223
-97
lines changed

Makefile

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
all: build
22

33
start:
4-
@docker compose up -d
4+
@docker-compose -f docker-compose.ci.yml up -d
55

66
build:
77
@./gradlew build --warning-mode all
88

99
lint:
10-
@docker exec codelytv-ddd_example-java ./gradlew spotlessCheck
10+
@docker exec codely-java_ddd_example-test_server ./gradlew spotlessCheck
1111

1212
run-tests:
1313
@./gradlew test --warning-mode all
1414

1515
test:
16-
@docker exec codelytv-ddd_example-java ./gradlew test --warning-mode all
16+
@docker exec codely-java_ddd_example-test_server ./gradlew test --warning-mode all
1717

1818
run:
1919
@./gradlew :run
2020

2121
ping-mysql:
22-
@docker exec codelytv-java_ddd_example-mysql mysqladmin --user=root --password= --host "127.0.0.1" ping --silent
22+
@docker exec codely-java_ddd_example-mysql mysqladmin --user=root --password= --host "127.0.0.1" ping --silent
2323

2424
# Start the app
2525
start-mooc_backend:

apps/main/resources/.env

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
# MOOC #
22
#--------------------------------#
3-
MOOC_BACKEND_SERVER_PORT=8081
3+
MOOC_BACKEND_SERVER_PORT=8030
44
# MySql
5-
MOOC_DATABASE_HOST=codelytv-java_ddd_example-mysql
5+
MOOC_DATABASE_HOST=codely-java_ddd_example-mysql
66
MOOC_DATABASE_PORT=3306
77
MOOC_DATABASE_NAME=mooc
88
MOOC_DATABASE_USER=root
99
MOOC_DATABASE_PASSWORD=
1010

1111
# BACKOFFICE #
1212
#--------------------------------#
13-
BACKOFFICE_FRONTEND_SERVER_PORT=8090
14-
BACKOFFICE_BACKEND_SERVER_PORT=8091
13+
BACKOFFICE_BACKEND_SERVER_PORT=8040
14+
BACKOFFICE_FRONTEND_SERVER_PORT=8041
1515
# MySql
16-
BACKOFFICE_DATABASE_HOST=codelytv-java_ddd_example-mysql
16+
BACKOFFICE_DATABASE_HOST=codely-java_ddd_example-mysql
1717
BACKOFFICE_DATABASE_PORT=3306
1818
BACKOFFICE_DATABASE_NAME=backoffice
1919
BACKOFFICE_DATABASE_USER=root
2020
BACKOFFICE_DATABASE_PASSWORD=
2121
# Elasticsearch
22-
BACKOFFICE_ELASTICSEARCH_HOST=codelytv-java_ddd_example-elasticsearch
22+
BACKOFFICE_ELASTICSEARCH_HOST=codely-java_ddd_example-elasticsearch
2323
BACKOFFICE_ELASTICSEARCH_PORT=9200
2424
BACKOFFICE_ELASTICSEARCH_INDEX_PREFIX=backoffice
2525

2626
# COMMON #
2727
#--------------------------------#
2828
# RabbitMQ
29-
RABBITMQ_HOST=codelytv-java_ddd_example-rabbitmq
29+
RABBITMQ_HOST=codely-java_ddd_example-rabbitmq
3030
RABBITMQ_PORT=5672
31-
RABBITMQ_LOGIN=codelytv
31+
RABBITMQ_LOGIN=codely
3232
RABBITMQ_PASSWORD=c0d3ly
3333
RABBITMQ_EXCHANGE=domain_events
3434
RABBITMQ_MAX_RETRIES=5

docker-compose.ci.yml

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
version: '3'
2+
3+
services:
4+
shared_mysql:
5+
container_name: codely-java_ddd_example-mysql
6+
image: mysql:8
7+
platform: linux/amd64
8+
ports:
9+
- "3306:3306"
10+
environment:
11+
- MYSQL_ROOT_PASSWORD=
12+
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
13+
entrypoint:
14+
sh -c "
15+
echo 'CREATE DATABASE IF NOT EXISTS mooc;CREATE DATABASE IF NOT EXISTS backoffice;' > /docker-entrypoint-initdb.d/init.sql;
16+
/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
17+
"
18+
command: ["--default-authentication-plugin=mysql_native_password"]
19+
20+
shared_rabbitmq:
21+
container_name: codely-java_ddd_example-rabbitmq
22+
image: 'rabbitmq:3.7-management'
23+
platform: linux/amd64
24+
restart: unless-stopped
25+
ports:
26+
- "5630:5672"
27+
- "8090:15672"
28+
environment:
29+
- RABBITMQ_DEFAULT_USER=codely
30+
- RABBITMQ_DEFAULT_PASS=c0d3ly
31+
32+
backoffice_elasticsearch:
33+
container_name: codely-java_ddd_example-elasticsearch
34+
image: 'elasticsearch:6.8.4'
35+
platform: linux/amd64
36+
restart: unless-stopped
37+
ports:
38+
- "9300:9300"
39+
- "9200:9200"
40+
environment:
41+
- discovery.type=single-node
42+
43+
test_server_java:
44+
container_name: codely-java_ddd_example-test_server
45+
build:
46+
context: .
47+
dockerfile: Dockerfile
48+
restart: unless-stopped
49+
volumes:
50+
- .:/app:delegated
51+
depends_on:
52+
- shared_mysql
53+
- shared_rabbitmq
54+
- backoffice_elasticsearch
55+
tty: true

docker-compose.yml

+70-16
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
version: '3'
22

33
services:
4-
mysql:
5-
container_name: codelytv-java_ddd_example-mysql
4+
shared_mysql:
5+
container_name: codely-java_ddd_example-mysql
66
image: mysql:8
77
platform: linux/amd64
88
ports:
@@ -17,20 +17,20 @@ services:
1717
"
1818
command: ["--default-authentication-plugin=mysql_native_password"]
1919

20-
rabbitmq:
21-
container_name: codelytv-java_ddd_example-rabbitmq
20+
shared_rabbitmq:
21+
container_name: codely-java_ddd_example-rabbitmq
2222
image: 'rabbitmq:3.7-management'
2323
platform: linux/amd64
2424
restart: unless-stopped
2525
ports:
2626
- "5630:5672"
2727
- "8090:15672"
2828
environment:
29-
- RABBITMQ_DEFAULT_USER=codelytv
29+
- RABBITMQ_DEFAULT_USER=codely
3030
- RABBITMQ_DEFAULT_PASS=c0d3ly
3131

32-
elasticsearch:
33-
container_name: codelytv-java_ddd_example-elasticsearch
32+
backoffice_elasticsearch:
33+
container_name: codely-java_ddd_example-elasticsearch
3434
image: 'elasticsearch:6.8.4'
3535
platform: linux/amd64
3636
restart: unless-stopped
@@ -40,20 +40,74 @@ services:
4040
environment:
4141
- discovery.type=single-node
4242

43-
java:
44-
container_name: codelytv-ddd_example-java
43+
backoffice_backend_server_java:
44+
container_name: codely-java_ddd_example-backoffice_backend_server
4545
build:
4646
context: .
4747
dockerfile: Dockerfile
4848
restart: unless-stopped
49-
platform: linux/amd64
5049
ports:
51-
- "8030:8080"
50+
- "8040:8040"
5251
volumes:
5352
- .:/app:delegated
54-
env_file:
55-
- .env
56-
tty: true
53+
- backoffice_backend_gradle_cache:/app/.gradle
54+
depends_on:
55+
- shared_mysql
56+
- shared_rabbitmq
57+
- backoffice_elasticsearch
58+
command: ["./gradlew", "bootRun", "--args", "backoffice_backend server"]
59+
60+
backoffice_frontend_server_java:
61+
container_name: codely-java_ddd_example-backoffice_frontend_server
62+
build:
63+
context: .
64+
dockerfile: Dockerfile
65+
restart: unless-stopped
66+
ports:
67+
- "8041:8041"
68+
volumes:
69+
- .:/app:delegated
70+
- backoffice_frontend_gradle_cache:/app/.gradle
71+
depends_on:
72+
- shared_mysql
73+
- shared_rabbitmq
74+
- backoffice_elasticsearch
75+
command: ["./gradlew", "bootRun", "--args", "backoffice_frontend server"]
76+
77+
mooc_backend_server_java:
78+
container_name: codely-java_ddd_example-mooc_backend_server
79+
build:
80+
context: .
81+
dockerfile: Dockerfile
82+
restart: unless-stopped
83+
ports:
84+
- "8030:8030"
85+
volumes:
86+
- .:/app:delegated
87+
- mooc_backend_gradle_cache:/app/.gradle
5788
depends_on:
58-
- mysql
59-
- rabbitmq
89+
- shared_mysql
90+
- shared_rabbitmq
91+
- backoffice_elasticsearch
92+
command: ["./gradlew", "bootRun", "--args", "mooc_backend server"]
93+
94+
test_server_java:
95+
container_name: codely-java_ddd_example-test_server
96+
build:
97+
context: .
98+
dockerfile: Dockerfile
99+
restart: unless-stopped
100+
volumes:
101+
- .:/app:delegated
102+
- test_gradle_cache:/app/.gradle
103+
depends_on:
104+
- shared_mysql
105+
- shared_rabbitmq
106+
- backoffice_elasticsearch
107+
tty: true
108+
109+
volumes:
110+
backoffice_backend_gradle_cache:
111+
backoffice_frontend_gradle_cache:
112+
mooc_backend_gradle_cache:
113+
test_gradle_cache:

src/backoffice/main/tv/codely/backoffice/shared/infrastructure/persistence/BackofficeElasticsearchConfiguration.java

+27-20
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.context.annotation.Configuration;
1111
import org.springframework.core.io.Resource;
1212
import org.springframework.core.io.support.ResourcePatternResolver;
13+
import tv.codely.shared.domain.Utils;
1314
import tv.codely.shared.infrastructure.config.Parameter;
1415
import tv.codely.shared.infrastructure.config.ParameterNotExist;
1516
import tv.codely.shared.infrastructure.elasticsearch.ElasticsearchClient;
@@ -29,27 +30,33 @@ public BackofficeElasticsearchConfiguration(Parameter config, ResourcePatternRes
2930
}
3031

3132
@Bean
32-
public ElasticsearchClient elasticsearchClient() throws ParameterNotExist, IOException {
33-
ElasticsearchClient client = new ElasticsearchClient(
34-
new RestHighLevelClient(
35-
RestClient.builder(
36-
new HttpHost(
37-
config.get("BACKOFFICE_ELASTICSEARCH_HOST"),
38-
config.getInt("BACKOFFICE_ELASTICSEARCH_PORT"),
39-
"http"
40-
)
41-
)
42-
),
43-
RestClient.builder(
44-
new HttpHost(
45-
config.get("BACKOFFICE_ELASTICSEARCH_HOST"),
46-
config.getInt("BACKOFFICE_ELASTICSEARCH_PORT"),
47-
"http"
48-
)).build(),
49-
config.get("BACKOFFICE_ELASTICSEARCH_INDEX_PREFIX")
50-
);
33+
public ElasticsearchClient elasticsearchClient() throws ParameterNotExist, Exception {
34+
ElasticsearchClient client = new ElasticsearchClient(
35+
new RestHighLevelClient(
36+
RestClient.builder(
37+
new HttpHost(
38+
config.get("BACKOFFICE_ELASTICSEARCH_HOST"),
39+
config.getInt("BACKOFFICE_ELASTICSEARCH_PORT"),
40+
"http"
41+
)
42+
)
43+
),
44+
RestClient.builder(
45+
new HttpHost(
46+
config.get("BACKOFFICE_ELASTICSEARCH_HOST"),
47+
config.getInt("BACKOFFICE_ELASTICSEARCH_PORT"),
48+
"http"
49+
)).build(),
50+
config.get("BACKOFFICE_ELASTICSEARCH_INDEX_PREFIX")
51+
);
5152

52-
generateIndexIfNotExists(client, "backoffice");
53+
Utils.retry(10, 10000, () -> {
54+
try {
55+
generateIndexIfNotExists(client, "backoffice");
56+
} catch (IOException e) {
57+
throw new RuntimeException(e);
58+
}
59+
});
5360

5461
return client;
5562
}

src/mooc/main/resources/database/mooc.sql

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ CREATE TABLE IF NOT EXISTS courses_counter (
1717
ENGINE = InnoDB
1818
DEFAULT CHARSET = utf8mb4
1919
COLLATE = utf8mb4_unicode_ci;
20+
INSERT IGNORE INTO courses_counter (id, total, existing_courses) VALUES ('efbaff16-8fcd-4689-9fc9-ec545d641c46', 0, '[]');
2021

2122
CREATE TABLE IF NOT EXISTS steps (
2223
id CHAR(36) NOT NULL,

src/mooc/main/tv/codely/mooc/courses_counter/infrastructure/persistence/hibernate/CoursesCounter.hbm.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
</component>
1717

1818
<property name="existingCourses" column="existing_courses" access="field">
19-
<type name="json_string">
19+
<type name="tv.codely.shared.infrastructure.hibernate.JsonListType">
2020
<param name="list_of">tv.codely.mooc.courses.domain.CourseId</param>
2121
</type>
2222
</property>

src/mooc/main/tv/codely/mooc/courses_counter/infrastructure/persistence/hibernate/CustomTypes.hbm.xml

-8
This file was deleted.

src/shared/main/tv/codely/shared/domain/Utils.java

+23
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,27 @@ public static String toCamel(String text) {
4747
public static String toCamelFirstLower(String text) {
4848
return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, text);
4949
}
50+
51+
public static void retry(int numberOfRetries, long waitTimeInMillis, Runnable operation) throws Exception {
52+
for (int i = 0; i < numberOfRetries; i++) {
53+
try {
54+
operation.run();
55+
return; // Success, exit the method
56+
} catch (Exception ex) {
57+
System.out.println("Retry " + (i + 1) + "/" + numberOfRetries + " fail. Retrying…");
58+
if (i >= numberOfRetries - 1) {
59+
throw ex;
60+
}
61+
62+
try {
63+
Thread.sleep(waitTimeInMillis);
64+
} catch (InterruptedException ie) {
65+
Thread.currentThread().interrupt();
66+
67+
throw new Exception("Operation interrupted while retrying", ie);
68+
}
69+
}
70+
}
71+
}
72+
5073
}

src/shared/main/tv/codely/shared/infrastructure/bus/event/DomainEventSubscriberInformation.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ public List<Class<? extends DomainEvent>> subscribedEvents() {
4444
}
4545

4646
public String formatRabbitMqQueueName() {
47-
return String.format("codelytv.%s.%s.%s", contextName(), moduleName(), Utils.toSnake(className()));
47+
return String.format("codely.%s.%s.%s", contextName(), moduleName(), Utils.toSnake(className()));
4848
}
4949
}

src/shared/main/tv/codely/shared/infrastructure/hibernate/HibernateConfigurationFactory.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,19 @@ private List<String> subdirectoriesFor(String contextName) {
110110
}
111111

112112
private String[] mappingFilesIn(String path) {
113-
String[] files = new File(path).list((current, name) -> new File(current, name).getName().contains(".hbm.xml"));
113+
List<String> fileList = new ArrayList<>();
114114

115-
if (null == files) {
116-
return new String[0];
117-
}
115+
String[] hbmFiles = new File(path).list((current, name) -> new File(current, name).getName().contains(".hbm.xml"));
116+
String[] ormFiles = new File(path).list((current, name) -> new File(current, name).getName().contains(".orm.xml"));
117+
118+
if (hbmFiles != null) {
119+
fileList.addAll(Arrays.asList(hbmFiles));
120+
}
121+
if (ormFiles != null) {
122+
fileList.addAll(Arrays.asList(ormFiles));
123+
}
118124

119-
return files;
125+
return fileList.toArray(new String[0]);
120126
}
121127

122128
private Properties hibernateProperties() {

0 commit comments

Comments
 (0)