åœç€Ÿã¯ãã¢ããªã±ãŒã·ã§ã³ãããããŒã¿ããŒã¹ã«é¢ããŠãããä¿å®çãªã¢ãããŒããæ¡çšããŠããŸããããŒã¿ããŒã¹ã¯Kubernetesã§ã¯ãªããããŒããŠã§ã¢ãŸãã¯ä»®æ³ãã·ã³ã§å転ããŠããŸããæ¯æãåŠçããŒã¿ããŒã¹ã倿Žããããã®ç¢ºç«ãããããã»ã¹ããããŸããããã«ã¯ãå€ãã®èªåãã§ãã¯ãå€§èŠæš¡ãªã¬ãã¥ãŒãããã³DBAã®åå ã«ãããªãªãŒã¹ãå«ãŸããŸãããã®å Žåã®ãã§ãã¯ã®æ°ãšé¢ä¿è ã¯ãåžå Žæå ¥ãŸã§ã®æéã«æªåœ±é¿ãåãŒããŸããäžæ¹ãããã¯ãããã°ãããŠãããæ¬çªç°å¢ã«ç¢ºå®ã«å€æŽãå ããããšãã§ãããããäœããå£ããå¯èœæ§ãæå°éã«æããããšãã§ããŸãããããŠãäœããå£ããå Žåãé©åãªäººããã§ã«ä¿®çããã»ã¹ã«å«ãŸããŠããŸãããã®ã¢ãããŒãã«ãããäŒç€Ÿã®ã¡ã€ã³ãµãŒãã¹ã®äœæ¥ãããå®å®ããŸãã
PostgreSQLäžã®ãã€ã¯ããµãŒãã¹çšã®æ°ãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®ã»ãšãã©ãéå§ããŸããOracleã®ãããã°ãããããã»ã¹ã¯ãä¿¡é Œæ§ã¯ãããŸãããå°ããªããŒã¿ããŒã¹ã§ã¯äžå¿ èŠã«è€éã«ãªããŸããå°é£ãªããã»ã¹ãéå»ããæããæªæ¥ã«åŒããã蟌ã¿ãããšæã人ã¯èª°ãããŸããã誰ãåãã£ãŠæããæªæ¥ã®ããã®ããã»ã¹ã«åãçµã¿å§ããŸããã§ããããã®çµæãæšæºãšraznozhopitsuãäžè¶³ããŸããã ãããã©ã®ãããªåé¡ãåŒãèµ·ãããã©ã®ããã«è§£æ±ºããããç¥ãããå Žåã¯ãcatãžããããã
ç§ãã¡ã解決ããåé¡
çµ±äžãããããŒãžã§ã³ç®¡çåºæºã¯ãããŸãã
æè¯ã®å Žåããããã¯ããã€ã¯ããµãŒãã¹ã®ãããªããžããªã®dbãã£ã¬ã¯ããªã®ã©ããã«ããDDLSQLãã¡ã€ã«ã§ãããããããŒã¿ããŒã¹ã®çŸåšã®ç¶æ ã§ããããã¹ããšæ¬çªã§ç°ãªããããŒã¿ããŒã¹ã¹ããŒãã®åç §ã¹ã¯ãªããããªãå Žåã¯éåžžã«æªãã§ãã
ãããã°äžã«ããã¹ãããŒã¹ãç²ç ããŸã
ãç§ã¯ä»ããã¹ãããŒã¿ããŒã¹ãå°ãæºãã¶ã£ãŠããŸããããã§å¿é ããªãã§ãã ããã-ãããŠãã¹ãããŒã¿ããŒã¹ã«æ°ããæžãããã¹ããŒã倿Žã³ãŒãããããã°ãã«è¡ããŸãããæéããããå ŽåããããŸããããã®éããã¹ãåè·¯ã¯æ©èœããŸããã
åæã«ãä»ã®ãã€ã¯ããµãŒãã¹ããã€ã¯ããµãŒãã¹ãšçžäºäœçšããéšåã§ãã¹ãåè·¯ãç Žæããå¯èœæ§ããããŸãããã€ã¯ããµãŒãã¹ã®ããŒã¹ã¯éçºè ãç Žå£ããŸããã
DAOã¡ãœããã¯ãã¹ãã®å¯Ÿè±¡å€ã§ãããCIã§æ€èšŒãããŠããŸãã
éçºããã³ãããã°æã«ãDAOã¡ãœããã¯ãå€åŽã®ãã³ãã«ãæ°å±€äžã«åŒãããšã«ãã£ãŠåŒã³åºãããŸããããã«ããããã€ã¯ããµãŒãã¹ãšããŒã¿ããŒã¹éã®ç¹å®ã®çžäºäœçšã§ã¯ãªããããžãã¹ããžãã¯ã®ã·ããªãªå šäœãå ¬éãããŸãã
å°æ¥äœã厩å£ããªããšããä¿èšŒã¯ãããŸããããã€ã¯ããµãŒãã¹ã®å質ãšä¿å®æ§ãäœäžããŸãã
ã¡ãã£ã¢ã®éå圢æ§
倿Žã«ãŒãããã¹ããšæ¬çªç°å¢ã§ç°ãªãæ¹æ³ã§é ä¿¡ãããå Žåãåãããã«æ©èœãããã©ããã¯ããããŸãããç¹ã«ãéçºãšãããã°ãå®éã«ãã¹ãã§å®è¡ãããå Žåã
ãã¹ãäžã®ãªããžã§ã¯ãã¯ãéçºè ãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¢ã«ãŠã³ãã§äœæã§ããŸãã婿éã¯ã©ã³ãã ã«æž¡ãããéåžžã¯ãã¹ãŠã®ç¹æš©ãä»äžããŸããã¢ããªã±ãŒã·ã§ã³ã®å©æéã¯ãããã°ã«ãšã©ãŒã衚瀺ãããŸã-婿éãåºããŸãããšããååã«åºã¥ããŠçºè¡ãããŸãã婿éã¯ãªãªãŒã¹æã«å¿ããããããšããããããŸãããªãªãŒã¹åŸãsmokãã¹ãããã¹ãŠã®æ°æ©èœãã«ããŒããŠãããã婿éã®æ¬ åŠãããã«çºçããªãå ŽåããããŸãã
çç£ã«è»¢ããéããŠå£ããããããã»ã¹
æ¬çªç°å¢ãžã®ããŒã«ã€ã³ã¯æåã§è¡ãããŸããããOracleã®ããã»ã¹ãšåæ§ã«ãDBAããªãªãŒã¹ãããŒãžã£ãŒã®æ¿èªããªãªãŒã¹ãšã³ãžãã¢ã«ããããŒã«ãã©ã¯ãŒããè¡ãããŸããã
ããã«ããããªãªãŒã¹ãé ããªããŸãããŸããåé¡ãçºçããå ŽåãããŠã³ã¿ã€ã ãå¢å ããéçºè ã®ããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ãè€éã«ãªããŸããOracle以å€ã®ãããèšå®æšæºããªãããã¹ããæåŸãŸã§è¡ãããŠãããããexec.sqlã¹ã¯ãªãããšrollback.sqlã¹ã¯ãªããã¯ãã¹ãã§ãã¹ããããªãããšããããããŸããã
ãããã£ãŠãéçºè ã¯ããã®ããã»ã¹ããŸã£ããè¡ããã«ãéèŠã§ã¯ãªããµãŒãã¹ã«å€æŽãå ããããšããããŸãã
ã©ãããã°è¯ããªãããšãã§ããŸãã
Dockerã³ã³ããå ã®ããŒã«ã«DBã§ã®ãããã°
äžéšã®äººã«ãšã£ãŠã¯ããã®èšäºã§èª¬æãããŠãããã¹ãŠã®æè¡ç解決çã¯æçœã«æãããããããŸãããããããã©ãããããããæ¯å¹Žãåãã¬ãŒããç±å¿ã«èžã人ãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒããèšè¿°ããŠãããã°ããããã«sshçµç±ã§ãã¹ããµãŒããŒã«ã¢ã¯ã»ã¹ããããšã¯ãããŸãããïŒãã¹ãDBã€ã³ã¹ã¿ã³ã¹ã§ããŒã¿ããŒã¹ã³ãŒããéçºããã³ãããã°ããã®ã¯ã°ãããŠãããšæããŸããäŸå€ã¯ãããŸãããããŒã¿ããŒã¹ãããŒã«ã«ã§ç«ã¡äžããããšã¯éåžžã«é£ããå ŽåããããŸããããããéåžžã軜éã§ã¬ã¬ã·ãŒã§ã¯ãªããã®ã«ã€ããŠè©±ããŠããå ŽåãããŒã«ã«ã§ããŒã¹ãäžããŠããã¹ãŠã®ç§»è¡ãäžè²«ããŠããŒã«ããããšã¯é£ãããããŸããããã®èŠè¿ããšããŠãä»ã®éçºè ã«ãã£ãŠè¡ãè©°ãŸãããšãªããã¢ã¯ã»ã¹ã倱ãããããšãªããéçºã«å¿ èŠãªæš©éãæã€å®å®ããã€ã³ã¹ã¿ã³ã¹ãèªåã®åŽã§ååŸã§ããŸãã
ããŒã«ã«ããŒã¿ããŒã¹ãç°¡åã«èµ·åã§ããäŸã次ã«ç€ºããŸã
ã2è¡ã®DockerfileãäœæããŠã¿ãŸãããã
FROM postgres:12.3
ADD init.sql /docker-entrypoint-initdb.d/
init.sqlã§ããã¯ãªãŒã³ãªãããŒã¿ããŒã¹ãäœæããŸããããã¯ããã¹ããšæ¬çªã®äž¡æ¹ã§ååŸããäºå®ã§ããæ¬¡ã®ãã®ãå«ãŸããŠããå¿ èŠããããŸãã
- ã¹ããŒãã®ææè ãšã¹ããŒãèªäœã
- ã¹ããŒãã䜿çšããæš©éãæã€ã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒã
- å¿ èŠãªæ¡åŒµæ©èœ
Init.sqlã®äŸ
create role my_awesome_service
with login password *** NOSUPERUSER inherit CREATEDB CREATEROLE NOREPLICATION;
create tablespace my_awesome_service owner my_awesome_service location '/u01/postgres/my_awesome_service_data';
create schema my_awesome_service authorization my_awesome_service;
grant all on schema my_awesome_service to my_awesome_service;
grant usage on schema my_awesome_service to my_awesome_service;
alter role my_awesome_service set search_path to my_awesome_service,pg_catalog, public;
create user my_awesome_service_app with LOGIN password *** NOSUPERUSER inherit NOREPLICATION;
grant usage on schema my_awesome_service to my_awesome_service_app;
create extension if not exists "uuid-ossp";
䟿å®äžãdbã¿ã¹ã¯ãMakefileã«è¿œå ã§ããŸããããã«ãããã³ã³ãããŒãããŒã¹ã§ïŒåïŒéå§ãããæ¥ç¶çšã«ããŒããçªãåºãŸãã
db:
docker container rm -f my_awesome_service_db || true
docker build -t my_awesome_service_db docker/db/.
docker run -d --name my_awesome_service_db -p 5433:5432 my_awesome_service_db
æ¥çæšæºã®ããŒãžã§ã³å€æŽã»ãã
ãŸããæãããªããã«èŠããŸããç§»è¡ãèšè¿°ããããŒãžã§ã³å¶åŸ¡ã·ã¹ãã ã«ä¿æããå¿ èŠããããŸãããããããã€ã³ãã£ã³ã°ã®ãªãã裞ã®ãsqlã¹ã¯ãªãããããç®ã«ããŸãããããŠããã¯ã誰ããäœãããã€ãã³ãããããšããããŒã«ããã¯ãšããŒã«ããã¯ãå¶åŸ¡ã§ããªãããšãæå³ããŸããæ§é ã倿ŽãããŠããå¯èœæ§ããããããSQLã¹ã¯ãªããããã¹ãããã³æ¬çªããŒã¿ããŒã¹ã§å®è¡ã§ãããšããä¿èšŒãããããŸããã
äžè¬çã«ãããªãã¯ã³ã³ãããŒã«ãå¿ èŠã§ããç§»è¡ã·ã¹ãã ã¯ã»ãŒå¶åŸ¡ã§ãã
ç°ãªãããŒã¿ããŒã¹ã¹ããŒãããŒãžã§ã³ç®¡çã·ã¹ãã ã®æ¯èŒã«ã€ããŠã¯èª¬æããŸãããFlyWay vsLiquibaseã¯ãã®èšäºã®ãããã¯ã§ã¯ãããŸãããLiquibaseãéžã³ãŸããã
ç§ãã¡ã®ããŒãžã§ã³ïŒ
- DDL-ããŒã¿ããŒã¹ãªããžã§ã¯ãã®æ§é ïŒããŒãã«ã®äœæïŒã
- ã«ãã¯ã¢ããããŒãã«ã®DMLã³ã³ãã³ãïŒæ¿å ¥ãæŽæ°ïŒã
- UZã¢ããªã±ãŒã·ã§ã³ã®DCLèš±å¯ïŒèš±å¯ã®éžæãæ¿å ¥...ïŒã
ããŒã«ã«ããŒã¿ããŒã¹ã§ãã€ã¯ããµãŒãã¹ãèµ·åããŠãããã°ããå Žåãéçºè ã¯å©æéãåŠçããå¿ èŠã«çŽé¢ããŸãããã®ããã®å¯äžã®åæ³çãªæ¹æ³ã¯ãDCLã¹ã¯ãªããã倿Žã»ããã«è¿œå ããããšã§ããããã«ããã婿éã確å®ã«è²©å£²ãããŸãã
sqlãããã»ããã®äŸ
0_ddl.sql:
1_dcl.sql:
2_dml_refs.sql:
Fixtures. dev
3_dml_dev.sql:
rollback.sql:
create table my_awesome_service.ref_customer_type
(
customer_type_code varchar not null,
customer_type_description varchar not null,
constraint ref_customer_type_pk primary key (customer_type_code)
);
alter table my_awesome_service.ref_customer_type
add constraint customer_type_code_ck check ( (customer_type_code)::text = upper((customer_type_code)::text) );
1_dcl.sql:
grant select on all tables in schema my_awesome_service to ru_svc_qw_my_awesome_service_app;
grant insert, update on my_awesome_service.some_entity to ru_svc_qw_my_awesome_service_app;
2_dml_refs.sql:
insert into my_awesome_service.ref_customer_type (customer_type_code, customer_type_description)
values ('INDIVIDUAL', '. ');
insert into my_awesome_service.ref_customer_type (customer_type_code, customer_type_description)
values ('LEGAL_ENTITY', '. ');
insert into my_awesome_service.ref_customer_type (customer_type_code, customer_type_description)
values ('FOREIGN_AGENCY', ' . ');
Fixtures. dev
3_dml_dev.sql:
insert into my_awesome_service.some_entity_state (state_type_code, state_data, some_entity_id)
values ('BINDING_IN_PROGRESS', '{}', 1);
rollback.sql:
drop table my_awesome_service.ref_customer_type;
Changeset.yamlã®äŸ
databaseChangeLog:
- changeSet:
id: 1
author: "mr.awesome"
changes:
- sqlFile:
path: db/changesets/001_init/0_ddl.sql
- sqlFile:
path: db/changesets/001_init/1_dcl.sql
- sqlFile:
path: db/changesets/001_init/2_dml_refs.sql
rollback:
sqlFile:
path: db/changesets/001_init/rollback.sql
- changeSet:
id: 2
author: "mr.awesome"
context: dev
changes:
- sqlFile:
path: db/changesets/001_init/3_dml_dev.sql
Liquibaseã¯ãããŒã¿ããŒã¹äžã«databasechangelogããŒãã«ãäœæããŸãããã®ããŒãã«ã«ã¯ããã³ãã¢ããããããã§ã³ãžã»ãããèšé²ãããŸãã
ããŒã¿ããŒã¹ã«ããŒã«ããå¿ èŠããã倿Žã»ããã®æ°ãèªåçã«èšç®ããŸãã
ããŒã¿ããŒã¹ã«ããŒã«ã€ã³ããå¿ èŠãããããã€ãã®ãã§ã³ãžã»ããããã¹ã¯ãªãããçæããæ©èœãåããmavenããã³gradleãã©ã°ã€ã³ããããŸãã
ããŒã¿ããŒã¹ç§»è¡ã·ã¹ãã ã®ã¢ããªã±ãŒã·ã§ã³èµ·åãã§ãŒãºãžã®çµ±å
ããã¯ãç§»è¡å¶åŸ¡ã·ã¹ãã ãšã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããŠãããã¬ãŒã ã¯ãŒã¯ã®ä»»æã®ã¢ããã¿ãŒã§ããå¯èœæ§ããããŸããå€ãã®ãã¬ãŒã ã¯ãŒã¯ããããORMã«ãã³ãã«ãããŠããŸããããšãã°ãRuby-On-RailsãYii2ãNest.JSã
ãã®ã¡ã«ããºã ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã®éå§æã«ç§»è¡ãããŒã«ããããã«å¿ èŠã§ãã
äŸãã°ïŒ
- ãã¹ãããŒã¿ããŒã¹ã§ã¯ããããã»ãã001ã002ã003ã
- pogromistã¯ãããã»ãã004ã005ãéçºããã¢ããªã±ãŒã·ã§ã³ããã¹ãã«ãããã€ããŸããã§ããã
- ãã¹ãã«ãããã€ããŸãããããã»ãã004ã005ãå±éãããŠããŸãã
ããããå転ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯èµ·åããŸãããããŒãªã³ã°ã¢ããããŒãã¯å€ãããããæ®ºããŸããã
ã¹ã¿ãã¯ã¯JVM + Springã§ãããORMã䜿çšããŠããŸããããããã£ãŠãSpringãšLiquibaseã®çµ±åãå¿ èŠã§ããã
åœç€Ÿã«ã¯éèŠãªã»ãã¥ãªãã£èŠä»¶ããããŸããã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã¯ãéãããäžé£ã®èš±å¯ãæã£ãŠããå¿ èŠããããã¹ããŒãææè ã¬ãã«ã®ã¢ã¯ã»ã¹æš©ãæã£ãŠã¯ãªããŸãããSpring-Liquibaseã䜿çšãããšãã¹ããŒãææè ãŠãŒã¶ãŒã«ä»£ãã£ãŠç§»è¡ãããŒã«ããããšãã§ããŸãããã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®æ¥ç¶ããŒã«ã¯LiquibaseDataSourceã«ã¢ã¯ã»ã¹ã§ããŸããããããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã¯ã¹ããŒãææè ãŠãŒã¶ãŒããã¢ã¯ã»ã¹ãååŸããŸããã
Application-testing.yamlã®äŸ
spring:
liquibase:
enabled: true
database-change-log-lock-table: "databasechangeloglock"
database-change-log-table: "databasechangelog"
user: ${secret.liquibase.user:}
password: ${secret.liquibase.password:}
url: "jdbc:postgresql://my.test.db:5432/my_awesome_service?currentSchema=my_awesome_service"
CIã¹ããŒãžã§ã®DAOãã¹ãã¯æ€èšŒããŸã
ç§ãã¡ã®äŒç€Ÿã«ã¯ãã®ãããªCIã¹ããŒãžããããŸã-確èªããŠãã ããããã®æ®µéã§ã倿Žãå éšåè³ªåºæºã«æºæ ããŠãããã©ããããã§ãã¯ãããŸãããã€ã¯ããµãŒãã¹ã®å Žåãããã¯éåžžãã³ãŒãã¹ã¿ã€ã«ããã§ãã¯ããããã®ãªã³ã¿ãŒå®è¡ã§ããããã°ããŠããããã¹ãã®å®è¡ãããã³ã³ã³ããã¹ããã€ã¹ãã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®èµ·åã§ããããã§ãæ€èšŒæ®µéã§ãããŒã¿ããŒã¹ã®ç§»è¡ãšãã¢ããªã±ãŒã·ã§ã³DAOã¬ã€ã€ãŒãšããŒã¿ããŒã¹ã®çžäºäœçšã確èªã§ããŸãã
ããŒã¿ããŒã¹ã䜿çšããŠã³ã³ãããèµ·åãããããã»ãããããŒãªã³ã°ãããšãäœæ¥äžã®ãã·ã³ã®èœåãšãããã»ããã®æ°ã«å¿ããŠãSpringã³ã³ããã¹ãã®éå§æéã1.5ã10ç§é·ããªããŸãã
ãããã¯å®éã«ã¯ãŠããããã¹ãã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®DAOã¬ã€ã€ãŒãããŒã¿ããŒã¹ã«çµ±åããããã®ãã¹ãã§ãã
ããŒã¿ããŒã¹ããã€ã¯ããµãŒãã¹ã®äžéšãšåŒã¶ããšã§ã1ã€ã®ãã€ã¯ããµãŒãã¹ã®2ã€ã®éšåã®çµ±åããã¹ãããŠãããšèšããŸããå€éšäŸåé¢ä¿ã¯ãããŸããããããã£ãŠããããã®ãã¹ãã¯å®å®ããŠãããæ€èšŒãã§ãŒãºã§å®è¡ã§ããŸãããã€ã¯ããµãŒãã¹ãšããŒã¿ããŒã¹ã®å¥çŽãä¿®æ£ããå°æ¥ã®æ¹åã«å®å¿ãæäŸããŸãã
ããã¯ãDAOããããã°ããããã®äŸ¿å©ãªæ¹æ³ã§ããããŸããRestControllerãåŒã³åºããŠãäžéšã®ããžãã¹ã·ããªãªã§ãŠãŒã¶ãŒã®åäœãã·ãã¥ã¬ãŒããã代ããã«ãå¿ èŠãªåŒæ°ã䜿çšããŠDAOãããã«åŒã³åºããŸãã
ãµã³ãã«DAOãã¹ã
@Test
@Transactional
@Rollback
fun `create cheque positive flow`() {
jdbcTemplate.update(
"insert into my_awesome_service.some_entity(inn, registration_source_code)" +
"values (:inn, 'QIWICOM') returning some_entity_id",
MapSqlParameterSource().addValue("inn", "526317984689")
)
val insertedCheque = chequeDao.addCheque(cheque)
val resultCheque = jdbcTemplate.queryForObject(
"select cheque_id from my_awesome_service.cheque " +
"order by cheque_id desc limit 1", MapSqlParameterSource(), Long::class.java
)
Assert.assertTrue(insertedCheque.isRight())
Assert.assertEquals(insertedCheque, Right(resultCheque))
}
æ€èšŒãã€ãã©ã€ã³ã§ãããã®ãã¹ããå®è¡ããã«ã¯ã2ã€ã®é¢é£ã¿ã¹ã¯ããããŸãã
- ãã«ããšãŒãžã§ã³ãã¯ãæšæºã®PostgreSQLããŒã5432ãŸãã¯éçããŒãã§ããžãŒç¶æ ã«ãªãå¯èœæ§ããããŸãããã¹ããå®äºããåŸã誰ããããŒã¹ãšäžç·ã«ã³ã³ãããåºããªãã£ãããšã¯ãããªãã¯æ±ºããŠç¥ããŸããã
- ãããã2çªç®ã®ã¿ã¹ã¯ïŒãã¹ããå®äºããåŸãã³ã³ãããæ¶ãå¿ èŠããããŸãã
TestContainers ã©ã€ãã©ãªã¯ãããã2ã€ã®ã¿ã¹ã¯ã解決ããŸããæ¢åã®ããã«ãŒã€ã¡ãŒãžã䜿çšããŠãããŒã¿ããŒã¹ã³ã³ãããŒãinit.sqlç¶æ ã«ããŸãã
TestContainersã®äœ¿çšäŸ
@TestConfiguration
public class DatabaseConfiguration {
@Bean
GenericContainer postgreSQLContainer() {
GenericContainer container = new GenericContainer("my_awesome_service_db")
.withExposedPorts(5432);
container.start();
return container;
}
@Bean
@Primary
public DataSource onlineDbPoolDataSource(GenericContainer postgreSQLContainer) {
return DataSourceBuilder.create()
.driverClassName("org.postgresql.Driver")
.url("jdbc:postgresql://localhost:"
+ postgreSQLContainer.getMappedPort(5432)
+ "/postgres")
.username("my_awesome_service_app")
.password("my_awesome_service_app_pwd")
.build();
}
@Bean
@LiquibaseDataSource
public DataSource liquibaseDataSource(GenericContainer postgreSQLContainer) {
return DataSourceBuilder.create()
.driverClassName("org.postgresql.Driver")
.url("jdbc:postgresql://localhost:"
+ postgreSQLContainer.getMappedPort(5432)
+ "/postgres")
.username("my_awesome_service")
.password("my_awesome_service_app_pwd")
.build();
}
éçºãšãããã°ãçè§£ãããŸãããæ¬¡ã«ãããŒã¿ããŒã¹ã¹ããŒãã®å€æŽãæ¬çªç°å¢ã«é ä¿¡ããå¿ èŠããããŸãã
Kubernetesããã®çãã§ãïŒè³ªåã¯äœã§ããïŒ
ãããã£ãŠãCI / CDããã»ã¹ãèªååããå¿ èŠããããŸããå®çžŸã®ããããŒã ã·ãã£ã¢ãããŒãããããŸããå¥ã®èšäºã®çç±ã¯ã©ãã«ããããã«æãããŸããïŒ
ãããŠãçç±ããããŸããå®èšŒæžã¿ã®ã¢ãããŒãã«å ããŠãå€§äŒæ¥ã®éå±ãªåé¡ããããŸãã
- 誰ã«ãšã£ãŠãååãªããŒã ã·ãã£ãã«ããŒã¯ãããŸããã
- ã©ã€ã»ã³ã¹ã«ã¯ãéãããããŸãã
- virtualok buildagentsã®èšå®ã¯ãconfigsãšpuppetãåãããªããžããªãä»ããŠãæãªããã®æ¹æ³ã§è¡ãããŸãã
- ãã«ããŒããã¿ãŒã²ãããããã¯ãŒã¯ãžã®ã¢ã¯ã»ã¹ã¯ãæãªããã®æ¹æ³ã§è¡ãå¿ èŠããããŸãã
- ãã°ã€ã³-ããŒã¿ããŒã¹ãžã®å€æŽãããŒãªã³ã°ããããã®ãã¹ã¯ãŒãããæãªããã®æ¹æ³ã§ä¿åãããŸãã
ãããŠããã®ãã¹ãŠã®ãæãªããã®æ¹æ³ãã§ã®åé¡ã¯ã誰ããæããæªæ¥ã«åãã£ãŠèµ°ã£ãŠããŠãã¬ã¬ã·ãŒããã®ãµããŒãã§ã...ããªããç¥ã£ãŠãããããã¯åäœãã倧äžå€«ã§ããåäœããŸãã-åŸã§åŠçããŸãããã€ãã仿¥ã§ã¯ãããŸããã
æããæªæ¥ã«ãã§ã«èãŸã§ã®æ·±ãã®èã1ã€ãããKubernetesã€ã³ãã©ã¹ãã©ã¯ãã£ããã§ã«ãããšããŸããå¥ã®ãã€ã¯ããµãŒãã¹ãçæããæ©äŒããããŸãããã®ãã€ã¯ããµãŒãã¹ã¯ããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã§ããã«éå§ãããå¿ èŠãªæ§æãšã·ãŒã¯ã¬ãããååŸããå¿ èŠãªã¢ã¯ã»ã¹æš©ãæã¡ããµãŒãã¹ã¡ãã·ã¥ã€ã³ãã©ã¹ãã©ã¯ãã£ã«ç»é²ããŸãããããŠããã®ãã¹ãŠã®å¹žçŠã¯ã* OPSã®åœ¹å²ãæã€äººãå·»ã蟌ãããšãªããéåžžã®éçºè ãåŸãããšãã§ããŸããKubernetesã«ã¯ãããçš®ã®ãµãŒãã¹äœæ¥ãç®çãšããäžçš®ã®ãžã§ãã¯ãŒã¯ããŒããããããšãæãåºããŸããããŠãç§ãã¡ã¯Kotlin + Spring-Liquibaseã§ã¢ããªã±ãŒã·ã§ã³ãäœæããããã«é転ããkuberaã®JVMã§ã®ãã€ã¯ããµãŒãã¹ã®ããã«äŒç€Ÿã«ååšããã€ã³ãã©ã¹ãã©ã¯ãã£ãå¯èœãªéãåå©çšããããšããŸããã
次ã®åŽé¢ãåå©çšããŸãããã
- ãããžã§ã¯ãã®çæã
- ãããã€ããŸãã
- èšå®ãšã·ãŒã¯ã¬ããã®é ä¿¡ã
- ã¢ã¯ã»ã¹ã
- ãã°ã®èšé²ãšELKãžã®ãã°ã®é ä¿¡ã
ç§ãã¡ã¯ãã®ãããªãã€ãã©ã€ã³ãæã«å ¥ããŸãïŒã¯ãªãã¯å¯èœ
ç§ãã¡ã¯ä»æã£ãŠããŸã
- ãã§ã³ãžã»ããã®ããŒãžã§ã³ç®¡çã
- å®çŸå¯èœæ§ã®æŽæ°âããŒã«ããã¯ã確èªããŸãã
- DAOã®ãã¹ããäœæããŸããTDDã«åŸãããšããããŸãããã¹ãã䜿çšããŠDAOãããã°ãå®è¡ããŸãããã¹ãã¯ãTestContainersã§æ°ããäœæãããããŒã¿ããŒã¹ã§å®è¡ãããŸãã
- dockerããŒã¿ããŒã¹ãæšæºããŒãã§ããŒã«ã«ã«å®è¡ããŸããããŒã¿ããŒã¹ã«æ®ã£ãŠãããã®ã調ã¹ãŠãããã°ããŠããŸããå¿ èŠã«å¿ããŠãããŒã«ã«ããŒã¿ããŒã¹ãæåã§ç®¡çã§ããŸãã
- ãã€ã¯ããµãŒãã¹ãšåæ§ã«ãteamcityã®æšæºãã€ãã©ã€ã³ã䜿çšããŠãããã»ããããã¹ãããã³èªåãªãªãŒã¹ããŸãããã€ãã©ã€ã³ã¯ãããŒã¿ããŒã¹ãææãããã€ã¯ããµãŒãã¹ã®åã§ãã
- ããŒã ã·ãã£ã®ããŒã¿ããŒã¹ããã®ã¯ã¬ãžããã¯ä¿åãããŸããããŸããä»®æ³ãã«ããŒããã®ã¢ã¯ã»ã¹ã«ã€ããŠã¯æ°ã«ããŸããã
å€ãã®äººã«ãšã£ãŠãããã¯å瀺ã§ã¯ãªãããšãç§ã¯ç¥ã£ãŠããŸããããããããªããèªã¿çµããã®ã§ãã³ã¡ã³ãã§ããªãã®çµéšãå ±æãããŠããã ããŸãã