ã¯ããã« ããã«ã¡ã¯ã2020幎5æã«å
¥ç€ŸããŸããMAåºç€ããŒã ã®èŸ»å²¡ã§ãã MAåºç€ããŒã ã§ã¯ãããŒã±ãã£ã³ã°ã«é¢ããæ§ã
ãªãããã¯ããã·ã¹ãã ã®æœçéçºã»éçšãè¡ã£ãŠããŸãããã®äžã®1ã€ã«ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ãšãããã®ããããŸãã ãããŸã§ãã®ã·ã¹ãã ã«ã¯æ€èšŒç°å¢ãååšããŸããã§ãããããã§ãæ€èšŒç°å¢ãæ°ãã«äœãäºã§ã·ã¹ãã ã®éçºãéçšã®å¹çå䞊ã³ã«åè³ªã®æ
ä¿ã«è²¢ç®ããäºã«ã€ããŠç޹ä»ããŸãã ãŸããæ€èšŒãã§ãŒãºã®å¹çåææ®µãšããŠDigdagãå©çšããããŒã¿è»¢éæ©èœã¯äœ¿ã£ãŠã¿ããšæ³å以äžã«äŸ¿å©ã ã£ãã®ã§ãå®è£
æ¹æ³ã«ã€ããŠè©³ãã玹ä»ããŸããå¹çåææ®µã®1ã€ãšããŠåèã«ããŠé ããã幞ãã§ãã ç®æ¬¡ ã¯ããã« ç®æ¬¡ ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ã®æŠèŠ ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ãããé
ä¿¡ã·ã¹ãã analyzer ãããé
ä¿¡ã·ã¹ãã ã®åŠçã®æµã ãŠãŒã¶æœåºã»ã³ã³ãã³ãçæã®å®è£
æ¹æ³ ãŠãŒã¶æœåºã®å®è£
äŸ ä»æ§ å®è£
æ¹æ³ å®éçšã§ã®èª²é¡ ã³ã³ãã³ãçæã®SQLæã¯é·ãè€é ããŒã«ã«ã§ã®æ€èšŒãå°é£ æ€èšŒç°å¢ãå°å
¥ãããå æ¢åæ¹ä¿®ãæ€èšŒããæ¹æ³ã¯ãæ¬çªã«åœ±é¿ãäžããªãããã«æ°ãã€ããªãã詊è¡é¯èª€ãã®ã¿ ä¿®æ£ãšç¢ºèªã®ãªãŒãã¿ã€ã ãé·ããªã ç£èŠæ
åœã«äœèšãªè² è·ãããã æ€èšŒç°å¢ãå°å
¥ããåŸã®å¹çåé¡ ãããã€ã®èªåå ããŒã¿è»¢éã®èªåå ããŒã¿è»¢éæ©èœã®å®è£
æ¹æ³ æ¬çªç°å¢ãšæ€èšŒç°å¢éã®æ¥ç¶ã«ã€ã㊠digãã¡ã€ã«æ§æ PostgreSQLã®ããŒã¿è»¢éæ¹æ³ SQL Serverã®ããŒã¿è»¢éæ¹æ³ IDENTITYèšå®ã®å£ bcpã䜿ã£ãããŒã¿è»¢é ymlãã¡ã€ã«ãå©çšããããŒã¿å®çŸ© æ€èšŒããŒã¿ã®å®çŸ©ãä¿æããããã¥ã¡ã³ããšããŠã®æçšæ§ æ¹åããæ€èšŒç°å¢ã§æ€èšŒãè¡ãã¡ãªãã æ¬çªçšŒåããŠãããã®ãæ¹ä¿®ããéã®æ€èšŒã楜ã«ãªã ä¿®æ£ãšç¢ºèªã®ãªãŒãã¿ã€ã ãçããªã äœèšãªç£èŠéç¥ãæå¶ã§ãã æ°ä»ããå€ããªã ãŸãšã ãããã« ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ã®æŠèŠ ãããã玹ä»ããã·ã¹ãã ã«ã€ããŠãããã€ãã®ç»å Žäººç©ã説æããŸãã ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ãããé
ä¿¡ã·ã¹ãã analyzer ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã 以äžã®å€å®ïŒæé©åïŒãè¡ã£ãäžã§å¯Ÿè±¡ã®ã客æ§ïŒãŠãŒã¶ïŒã«å¯ŸããŠããããã®ååïŒã³ã³ãã³ãïŒãé
ä¿¡ããŠããã®ããªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ã§ãã ããèŠããã£ãã«ïŒLINEãã¡ãŒã«çïŒã«é
ä¿¡ãã ããèŠãæé垯ã«é
ä¿¡ãã næ¥ã«1éã®é »åºŠã§é
ä¿¡ãã åãããããããã«å
·äœäŸã1ã€ãããŸããã©ã³ãã³ã°æ¥äžæäžã®ã¢ã€ãã ã®ãã¡ãããããååã玹ä»ãããå Žåãã客æ§ã«åãããé©åãªãã£ãã«ã»æé垯ã»é »åºŠãå€å®ããŠéãäºã§ãããã³ã³ãã³ããèŠãŠé ããããã«ãªããŸãã以äžãå®éã®ã¡ãŒã«ã§ã®é
ä¿¡äŸã§ãã ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ãšããååã§ããããªã¢ã«ã¿ã€ã ã®é
ä¿¡ã ãã§ãªããããã§ã®é
ä¿¡ãè¡ã£ãŠããŸããä»åã¯ãã®ãããé
ä¿¡ã·ã¹ãã ã®ãã£ã³ããŒã³å®è£
ã«ã€ããŠåãäžããŸãã ãããé
ä¿¡ã·ã¹ãã ç¹å®æ¡ä»¶ã®ãŠãŒã¶ãç¹å®æéã«æœåºããæé©åããäžã§ã³ã³ãã³ããé
ä¿¡ããä»çµã¿ããããé
ä¿¡ã·ã¹ãã ãšåŒãã§ããŸãã analyzer æé©åãé«éã§è¡ãã·ã¹ãã ã®ã³ã¢ãšãªãã¢ããªã±ãŒã·ã§ã³ãanalyzerãšåŒãã§ããŸãã ããã¯JBoss Enterprise Application PlatformïŒJBoss EAPïŒäžã§åããŠãããé¢é£æ©èœãè€æ°å©çšããŠããŸããäŸãã°ãExcelã§ã«ãŒã«å€å®ãè¡ãããã®Decision Managerãæé©åã«å©çšãã忣ãã£ãã·ã¥ã¹ãã¢ã§ããJBoss Data GridïŒJDGïŒãåŠçã®é«éåã®ããã«å©çšããŠããŸãã ãããé
ä¿¡ã·ã¹ãã ã®åŠçã®æµã ãããé
ä¿¡ã¯ä»¥äžã®ãããªæµãã§è¡ãããŸãã ããŒã¿ã®æµãã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã åŠçã®äžã§SQL ServerãšPostgreSQLã®2çš®é¡ã®DBãå©çšããŠããŸããåŠçã®èª¬æåã«ãã®2ã€ã®çšéã«ã€ããŠèšèŒããŸãã SQL Serverã¯ãZOZOTOWNã®åDBãã¬ããªã±ãŒã·ã§ã³ããDBã§ãããŠãŒã¶ãååãæ³šææ
å ±çZOZOTOWNã«é¢ããããŒã¿ãæ ŒçŽããŠããŸãã PostgreSQLã¯ããªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã å°çšã®DBã§ããåŸç¶åŠçã§å©çšããããŒã¿ãJDGã«æ ŒçŽããå®çžŸãéèšçµæãBigQueryãDWHçå€éšã§çæããããŒã¿ãæ ŒçŽããŠããŸããå€éšããŒã¿ã®é£æºã«ã¯Digdagãå©çšããŠããŸãã ã§ã¯åŠçã®æµãã説æããŠãããŸãã ãŠãŒã¶æœåºã¯ãé
ä¿¡ããã察象ã®ãŠãŒã¶ã®ãªã¹ããååŸããåŠçã§ãããªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ã§ã¯MyBatisãæ¡çšããŠãããããMyBatisã®Mapper XMLãå©çšããŠSQL Serverçµç±ã§ããŒã¿æœåºãè¡ãããã®SQLæã远å ããŠãããŸããããŒã¿æœåºåŸãçµæã察象ãŠãŒã¶ããŒãã«ïŒPostgreSQLïŒã«æ ŒçŽããŸããåŸç¶åŠçããã®ããŒã¿ãèªã¿èŸŒã¿ãŸãã æé©åèšå®ã¯analyzeräžã§è¡ãããŸããå®è£
ã¯Decision Managerãå©çšããŠããããExcelã«èšå®å€ã远èšããŸããä»åã®å©çšçšéã§ã¯ãæ©æµã¯ããŸãåããªãã®ã§è©³çްã¯å²æããŸãããã®æ©èœã«ãããæé©ãªæé垯ã«é
信察象ããŒãã«ïŒPostgreSQLïŒãžå¯Ÿè±¡ãŠãŒã¶IDãé
ä¿¡ãã£ã³ããŒã³IDçãæžã蟌ã¿ãã³ã³ãã³ãçæãè¡ãåŠçããã®ããŒã¿ãèªã¿èŸŒã¿ãŸãã ã³ã³ãã³ãçæã¯ã察象ãŠãŒã¶ã«é
ä¿¡ã³ã³ãã³ãã衚瀺ã»é
ä¿¡ããããã®æ
å ±ãååŸããŸããäŸãã°æ°åãã¡ãŒã«ã¢ãã¬ã¹ãåååãç»ååãéé¡çã該åœããŸããé
信察象ããŒãã«ãèªã¿èŸŒã¿ãæé©åèšå®ã§å€å®ãããã£ãã«ã«åãããŠå¿
èŠæ
å ±ãååŸããŸããã¡ãŒã«ã®å Žåã¯ãŠãŒã¶æœåºãšåæ§ãMapper XMLçµç±ã§ããŒã¿æœåºãè¡ããçµæãcsvãã¡ã€ã«åºåããŸããLINEã®å Žåã¯analyzerããçŽæ¥SQLæãå®è¡ããçµæãjsonã«æ ŒçŽããŸãã é
ä¿¡åŠçã¯ããŠãŒã¶ã«ã³ã³ãã³ãããã£ãã«å¥ã«é
ä¿¡ããåŠçã§ããã¡ãŒã«ã®å Žåã¯ãåºåããcsvãMPSEïŒMailPublisher Smart EditionïŒãšããã¡ãŒã«é
ä¿¡ãµãŒãã¹ã«APIã§éã£ãŠããŸããéã£ãcsvã®å€ãMPSEåŽã«äºãã»ãããããã¶ã€ã³ãã³ãã¬ãŒãïŒhtml, txtïŒãžå·®èŸŒãäºã§é
ä¿¡ããŸããLINEã®å Žåã¯ãanalyzerã§æ ŒçŽããjsonãLINEã®APIãªã¯ãšã¹ãã«æãããŠã¢ã¯ã»ã¹ããäºã§é
ä¿¡ããŸãã ãã®ã·ã¹ãã ã®å
šäœçãªä»çµã¿ã®è©³çްã«ã€ããŠã¯ å
ã®ããã° ããåç
§ãã ããã techblog.zozo.com ãã®ãã¡Mapper XMLã䜿ã£ããŠãŒã¶æœåºãšã¡ãŒã«é
ä¿¡æã®ã³ã³ãã³ãçæã®SQLæå®è£
ã¯ãæ€èšŒã®å¹çåã«ããæ©æµã倧ããåããŸãããã€ã¡ãŒãžãã€ãããã詳ããå®è£
æ¹æ³ã説æããŸãã ãŠãŒã¶æœåºã»ã³ã³ãã³ãçæã®å®è£
æ¹æ³ æ¶ç©ºã®Tã·ã£ã蚎æ±ãã£ã³ããŒã³ã®ãŠãŒã¶æœåºã®å®è£
æ¹æ³ãäŸã«èª¬æããŸãããŠãŒã¶æœåºãšã³ã³ãã³ãçæã®åºæ¬æ§æã¯åãã§ãSQLæã ããç°ãªããŸãã ãŠãŒã¶æœåºã®å®è£
äŸ ä»æ§ 忥ã®Tã·ã£ãã®ã¢ã¯ã»ã¹ã100å以äžã®äŒå¡ã察象ã ããŒã¿ã®æœåºæ¹æ³ã«ã€ããŠèª¬æããŠãããŸãã 以äžã®2ããŒãã«ãå©çšããŸãã access_aggregation at PostgreSQL user at SQL Server æœåºæ¹æ³ã®æµãã¯ããŸãaccess_aggregationããŒãã«ã§ã category ã tshirt ã access ã100以äžã® userid ã®ãªã¹ããæœåºããŸãããã®ããšç޹ä»ããæ¹æ³ã䜿ã£ãŠãSQL Serverãã該åœã®PostgreSQLã®ããŒã¿ãæœåºãtempããŒãã«ïŒ #aggregation ïŒã«æ ŒçŽããŸãããããŠãuserããŒãã«ããéäŒãã©ã°ïŒ isleave ïŒã0ã〠#aggregation ã«è©²åœãã id ãæœåºããŸãã ãã®ãããªããŒãã«æ§æã€ã¡ãŒãžã§ãã å®è£
æ¹æ³ 以äžã®ãããªãªãœãŒã¹ã®ãã¡ã€ã«æ§æã®ç¶æ
ã§ããã£ã³ããŒã³ã®ãŠãŒã¶æœåºçšã®SQLæãèšèŒããxmlã远å ããŸãã resources âââmybatis âââmappers â âââcommon.xml #å
±éãã¡ã€ã« â âââcampaign_tshirt.xml #æ°èŠè¿œå âââconfig.xml #å
±éãã¡ã€ã« 以äžã®ãããªSQLã«ãããããŒã¿ãæœåºããŸãã common.xml <sql id = "create_tmp_aggregation" > <![ CDATA [ CREATE TABLE #aggregation ( userid INT NOT NULL PRIMARY KEY (userid) ); ]]> </sql> <sql id = "aggregation" > <include refid = "create_tmp_aggregation" > <![ CDATA [ INSERT INTO #aggregation ( userid ) SELECT userid FROM openquery(rds, ' SELECT userid FROM access_aggregation WHERE category = ''tshirt'' AND access >= 100 AND date = current_date + interval ''-1DAY'' GROUP BY userid ') LFD; ]]> </sql> campaign_tshirt.xml <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <mapper namespace = "jp.zozo.marketing.realtime.campaign" > ã ã <include refid = "aggregation" > <select id = "campaign_tshirt" resultType = "map" > SELECT id FROM user INNER JOIN #aggregation ON user.id = userid WHERE isleave = 0 </select> </mapper> PostgreSQLã®ããŒã¿ã¯ãSQL Serverã®SQLæãã ãªã³ã¯ãµãŒã ãšããä»DBã«ã¢ã¯ã»ã¹ã§ããããŒã¿ããŒã¹ãšã³ãžã³ãçµç±ãååŸããŸãã ãªã³ã¯ãµãŒããçµç±ããããŒã¿æœåºã¯å
šãŠ common.xml ãšãããã¡ã€ã«ã«èšèŒããŸããTã·ã£ããã£ã³ããŒã³ã®mapperçšxmlïŒ campaign_tshirt.xml ïŒã« userid æœåºã®ããã«ãSQL Serverã®SQLæãèšèŒããŸãã ããšã¯ campaign_tshirt.xml ããã¢ããªã±ãŒã·ã§ã³ãèªã¿èŸŒãããèšå®ãããŠãã config.yml ã«è¿œèšããŸãã config.xml <!-- æ¢å --> <mapper url = "../mappers/common.xml" /> <!-- æ°èŠè¿œå --> <mapper url = "../mappers/campaign_tshirt.xml" /> ããã«ãããã¢ããªã±ãŒã·ã§ã³ãTã·ã£ããã£ã³ããŒã³ã®å¯Ÿè±¡è
ãæœåºãã察象ããŒã¿ããŒãã«ïŒPostgreSQLïŒã«insertããäºã§åŸç¶åŠçã«ç¶ããŸããã¡ãŒã«ã³ã³ãã³ãçæãåæ§ã®æ¹æ³ã§SQLæãçæããcsvãåºåããŠåŸç¶åŠçã«ç¶ããŸãã å®è£
ã¯ããã§å®äºã§ããå®è£
ã®æµãã¯äžèŠåçŽãªãã®ã§ãããå®éçšã§ã¯ä»¥äžã®èª²é¡ãæœãã§ããŸãã å®éçšã§ã®èª²é¡ ããã§ã¯ãå®éçšã§çºçãã課é¡ã2ã€ç޹ä»ããŸãã ã³ã³ãã³ãçæã®SQLæã¯é·ãè€é ã³ã³ãã³ãçæãããããã«ã¯ãè€éã§é·ãSQLæãäœæããäºãæ®ã©ã§ãã ååŸã§ããããŒã¿ãšSQLæãé§äœ¿ããŠã³ã³ãã³ãã«å¿
èŠãªããŒã¿ãæœåºããããã仿§ã®è€éåã«ãã圱é¿ãåããããäºãåå ã§ããäŸãã°ä»¥äžã®ãããªSQLæãæããããŸãã åºåã«ã©ã æ°200å ã«ã©ã ãçµã¿åãããå æžä¹é€ã®èšç®åŒ caseããšã«åå²ãããããŒã¿å å·¥ æ¡ä»¶å€å®åŸã®çªå·ïŒrow_numberçïŒæ¯ãçŽã å
¥ãåç¶æ
ã®ãµãã¯ãšãªïŒãµãã¯ãšãªã®ãµãã¯ãšãªã®ãµãã¯ãšãªïŒ 説æã®ããã«å®éã®ãã®ãç°¡çŽ åããDBæ
å ±çãå€ããŠããŸããã以äžã®ãããªã€ã¡ãŒãžã§ãã <!-- 察象ãŠãŒã¶ã®ååæ
å ± --> <sql id = "item_info" > <![ CDATA [ CREATE TABLE #ITEM_INFO ( MEMBER_ID INT NOT NULL ,ITEMID INT NOT NULL ,IMAGENAME VARCHAR(50) NOT NULL ,ITEMNAME NVARCHAR(100) NOT NULL ,BRANDNAME NVARCHAR(100) NOT NULL ,PRICE NVARCHAR(15) NOT NULL ,DISCOUNT NVARCHAR(10) ,DISCOUNTCOLOR VARCHAR(10) ,COUPONCOLOR NVARCHAR(10) ,COUPONPOINT NVARCHAR(15) ,CMTST NVARCHAR(10) ,CMTEND NVARCHAR(10) ,RANK SMALLINT NOT NULL PRIMARY KEY (MEMBER_ID, RANK) ); INSERT INTO #ITEM_INFO SELECT MEMBER_ID ,ITEMID ,IMAGENAME ,CASE WHEN LEN(ITEMNAME) <= 36 THEN ITEMNAME ELSE LEFT(ITEMNAME, 34) + '...' END AS ITEMNAME --ååå ,CASE WHEN LEN(BRANDNAME) <= 15 THEN TBNAME ELSE LEFT(BRANDNAME, 14) + '...' END AS BRANDNAME --ãã©ã³ãå LTRIM(RTRIM(FORMAT(ROUND((PRICE * TAXRATE), 0), N'#,0'))) AS PRICE ,CONVERT(VARCHAR(3), FLOOR((1.0 - (SALEPRICE * TAXRATE) / (SALEPRICE * TAXRATE)) * 100)) + '%OFF' AS DISCOUNT --å²åŒç ,CASE WHEN DISCOUNTFLAG = 1 THEN 'discounted' ELSE NULL END AS DISCOUNTCOLOR --äŸ¡æ Œã®æåè² ,COUPONCOLOR ,COOUPONPOINT ,CASE WHEN COOUPONPOINT IS NULL THEN '<!--' ELSE NULL END AS CMTST --ã¯ãŒãã³ããªãå Žåã³ã¡ã³ãã¢ãŠã ,CASE WHEN COOUPONPOINT IS NULL THEN '-->' ELSE NULL END AS CMTEND --ã¯ãŒãã³ããªãå Žåã³ã¡ã³ãã¢ãŠã ,ROW_NUMBER() OVER (PARTITION BY MEMBER_ID ORDER BY RANK) AS RANK --æ¡ä»¶å€å®åŸã«æ²èŒé ãæ¯ãçŽã FROM #TARGET_MEMBER_ITEM AS MODEL --PostgreSQLã§æœåºããé
信察象xã¢ãã«åããŒã¿xå€éšé£æºããŒã¿ (äœæSQLæç¥) INNER JOIN ITEM ON MODEL.ITEMID = ITEM.ITEMID INNER JOIN SHOP ON ITEM.SHOPID = SHOP.SHOPID ã» ã» ã» LEFT OUTER JOIN #EXCLUDED_ITEM AS EXCLUDED ON ITEM.ITEMID = EXCLUDED.ITEMID --æ²èŒå¯Ÿè±¡å€ã®ååæ
å ±(äœæSQLæç¥) LEFT OUTER JOIN #COUPON_INFO AS COUPON ON SHOP.SHOP_ID = COUPON.SHOP_ID --ã¯ãŒãã³æ
å ±(äœæSQLæç¥) WHERE EXCLUDED.ITEMID IS NULL --察象å€ã®ååãé€å€ãã ã» ã» ) AS BASE WHERE RANK <= 18; ]]> </sql> <!-- 察象ååããã¶ã€ã³ãã³ãã¬ãŒã差蟌ã®ããã¡ã³ããŒããšã«æšªå€æ --> <sql id = "main_info" > <![ CDATA [ SELECT /* ã«ã©ã åã¯ãã¶ã€ã³ãã³ãã¬ãŒãäŸå */ /* ãŠãŒã¶æ
å ± */ EMAIL ,NAME ,MEMBER_ID ,TEMPLATEID --ãã¶ã€ã³ãã³ãã¬ãŒãID /* ã¡ã€ã³ã³ã³ãã³ãæ
å ± */ /* åå1 */ ,MITEMID01 ,MITEMNAME01 ,MIMAGENAME01 ,MBRANDNAME01 ,MPRICE01 ,MDISCOUNTRATE01 ,MDISCOUNT01 ,MCOUPONCOLOR01 ,MCOUPONPOINT01 ,MCMTST01 ,MCMTEND01 /*åå2*/ ,MITEMDETAILID02 ,MITEMID02 ã» ã» ã» ,MCMTST18 ,MCMTEND18 /* MAT察象è
ã¯ã³ã¡ã³ãã¢ãŠã */ ,CASE WHEN MAT_MEMBER_ID IS NOT NULL THEN '<!--' ELSE NULL END AS COMMENDSTART ,CASE WHEN MAT_MEMBER_ID IS NOT NULL THEN '-->' ELSE NULL END AS COMMENDEND ,DATEPART(year, CURRENT_TIMESTAMP) AS CURRENTYEAR ,DATEPART(month, CURRENT_TIMESTAMP) AS CURRENTMONTH ,DATEPART(day, CURRENT_TIMESTAMP) AS CURRENTDAY ,DATEPART(hour, CURRENT_TIMESTAMP) AS CURRENTHOUR ,DATEPART(minute, CURRENT_TIMESTAMP) AS CURRENTMINUTE FROM #TARGET_MEMBER AS TARGET --MODELããçæãã察象è
xMAT察象æ
å ±(äœæSQLæç¥) INNER JOIN( SELECT MEMBER_ID ,ITEMID AS MITEMID01 ã» ã» ã» ,CMTEND AS MCMTEND01 FROM #ITEM_INFO WHERE RANK = 1 ) AS ITEM01 ON TARGET.MEMBER_ID = ITEM01.MEMBER_ID ã» ã» ã» INNER JOIN( SELECT MEMBER_ID ,ITEMDETAILID AS MITEMDETAILID18 ã» ã» ã» FROM #ITEM_INFO WHERE RANK=18 ïŒAS ITEM18 ON ITEM17.MEMBER_ID ïŒ ITEM18.MEMBER_ID ]]> </sql> <!-- PCçšã³ã³ãã³ã --> <select id = "pc_select" parameterType = "map" resultType = "java.util.LinkedHashMap" > <include refid = "target_member_item" /> <include refid = "target_member" /> <include refid = "excluded_item" /> <include refid = "coupon_info" /> <include refid = "item_info" /> <include refid = "main_info" /> <![ CDATA [ SELECT /* main_infoã§selectããé
ç®å
šéš */ EMAIL ã» ã» ã» /* PCçã®ã¿ãããŒæ
å ± */ ,HEADERBANNER ,HEADERURL ,FOOTERFILENAME01 ,FOOTERURL01 ã» ã» ã» ,FOOTERURL06 FROM ( <include refid="main_info" /> ) AS MAININFO CROSS JOIN BANNER_INFO; ]]> <!-- ã»ãã·ã§ã³ã«æ®ããªãããã«tmpããŒãã«åé€ --> DROP #TARGET_MEMBER_ITEM; DROP #TARGET_MEMBER; DROP #EXCLUDED_ITEM; DROP #ITEM_INFO; DROP #COUPON_INFO; </select> <!-- ã¢ãã€ã«çšã³ã³ãã³ã --> <select id = "mobile_select" parameterType = "map" resultType = "java.util.LinkedHashMap" > <include refid = "target_member_item" /> <include refid = "target_member" /> <include refid = "excluded_item" /> <include refid = "coupon_info" /> <include refid = "item_info" /> <include refid = "main_info" /> <!-- ã»ãã·ã§ã³ã«æ®ããªãããã«tmpããŒãã«åé€ --> DROP #TARGET_MEMBER_ITEM; DROP #TARGET_MEMBER; DROP #EXCLUDED_ITEM; DROP #ITEM_INFO; DROP #COUPON_INFO; </select> æ
£ããŠããŸãã°äžçºã§æ³å®SQLæãæžãäºãå¯èœã§ãããæ
£ããŠããªããšSQLæããã¯å®è¡çµæã®æšæž¬ããé£ããã§ãããã ããŒã«ã«ã§ã®æ€èšŒãå°é£ ãŠãŒã¶æœåºã®å®è£
äŸã§ããªã³ã¯ãµãŒããçµç±ããŠPostgreSQLããããŒã¿ãæœåºããå·¥çšããã£ãã®ãèŠããŠããŸããããªã³ã¯ãµãŒãã®ååšãããŒã«ã«ç°å¢ã§ã®æ€èšŒãå°é£ã«ããçç±ã®1ã€ã§ãã ãªã³ã¯ãµãŒãçµç±ã®æ¥ç¶ã®ããã«OLE DBãšããããŒã¿ãœãŒã¹ã¢ã¯ã»ã¹æ©èœãå©çšããå¿
èŠããããŸãããã®ãããOLE DBã§æ¥ç¶ãè¡ãããã®ãOLE DBãããã€ããŒããå¿
èŠã§ãããWindowsç°å¢ã§ããã°ãããã€ããŒãååšããŸãããéçºè
ã®å€§åãmacOS/Linuxç°å¢ãå©çšããŠããã察å¿ãããã€ããŒãèŠã€ãããªãã£ãããæå¿µããŸããã ãã£ãŠãããŒã«ã«ã§ãããé
ä¿¡ã·ã¹ãã ãåãããŠããªã³ã¯ãµãŒãçµç±ã®æ¥ç¶ãã§ããªããããããŒã«ã«ã§ã¯åŠçãé貫ããŠç¢ºãããäºã¯ã§ããªãç¶æ
ã§ããã æ€èšŒç°å¢ãå°å
¥ãããå æ°ãã人ã®å¢å ãçµç¹ãå€åããäžãå®è£
é »åºŠãå¢ã仿§ã¯ããè€éåããŠããŸããããããå
ã®éãããŒã«ã«ç°å¢ããªããæ¬çªç°å¢ã§ããæ€èšŒãã§ããªãç¶æ³ã§ãããåœæã®ç§ã®ããã«æ
£ããŠããªã人ã®å Žåã以äžã®ãããªç¶æ³ã«é¥ããŸããã æ¢åæ¹ä¿®ãæ€èšŒããæ¹æ³ã¯ãæ¬çªã«åœ±é¿ãäžããªãããã«æ°ãã€ããªãã詊è¡é¯èª€ãã®ã¿ æ¢ã«ãªãªãŒã¹ããããã£ã³ããŒã³ãä¿®æ£ããå¿
èŠãããå Žåãæ¬çªçšŒåäžã®ãã®ãã£ã³ããŒã³ã«åœ±é¿ããªãããã圱é¿ãäžããªãç¯å²ã§è©Šè¡é¯èª€ãå°ããã€ããŠç¢ºèªãè¡ã£ãŠããŸãããç¢ºèªæ¹æ³ãæ€èšããã ãã§é·ãæéãèŠããäºããããŸããã ä¿®æ£ãšç¢ºèªã®ãªãŒãã¿ã€ã ãé·ããªã å
¥å¿µã«ç®èŠç¢ºèªãè¡ã£ãåŸã«æ¬çªãªãªãŒã¹ãæ€èšŒããªãªãŒã¹åŸã®æ€èšŒãåãããŠäœãèŠã€ããã°ä¿®æ£ããã®ãããªãªãªãŒã¹ãäœåºŠãç¹°ãè¿ããŸããåäœç¢ºèªããŠãªãããã€æ¬çªãªãªãŒã¹ãªã®ã§ãèªç¶ãšç¢ºèªæéãé·ããªããŸããç§ã¯å
¥ç€ŸåœåãäœåºŠããã®ãããªæ¬çªãªãªãŒã¹ãç¹°ãè¿ããŸããã ç£èŠæ
åœã«äœèšãªè² è·ãããã æ¬çªç°å¢ã§ã¯ç£èŠèšå®ãããããšã©ãŒã¯Slackã®æ¬çªç£èŠçšãã£ãã«ã«éç¥ããä»çµã¿ãå
¥ã£ãŠããŸããä»åã®æ€èšŒæã®ãšã©ãŒãäŸå€ã§ã¯ãããŸãããããã¯ä»ã®ç£èŠã®åŠšãã«ããªãããããäœèšãªç£èŠã¢ã©ãŒãéç¥ã¯çã«è² è·ããããè¡çºã§ããç¹°ãè¿ãã®æ¬çªãªãªãŒã¹ã«å ããŠããã®ç¶æ³ã¯ç§ã®äœæ¥å¹çãäžããŠãããŸããã ãããã®èª²é¡ã解決ãããããAWSäžã«ãªã¢ã«ã¿ã€ã ããŒã±ãã£ã³ã°ã·ã¹ãã ãåããæ€èšŒç°å¢ãäœããŸãããåæã«ãæ€èšŒç°å¢ã§ãããé
ä¿¡ã·ã¹ãã ã®æ€èšŒãå¯èœã«ããŸãããããããåé¡ãçºçããŸããã®ã§ããã®åé¡ã«ã€ããŠèª¬æããŸãã æ€èšŒç°å¢ãå°å
¥ããåŸã®å¹çåé¡ æ€èšŒç°å¢ãå°å
¥ããæ¬çªç°å¢ã«äŸåããŠäœåã«å¢ããŠããäœæ¥æéã¯ççž®ãããŸãããããããæ€èšŒç°å¢ã§æ€èšŒãããããã®æºåã«æéãããããšããåé¡ãæ®ã£ãŠããŸããã ããã解決ããããã«äžèš2ç¹ãè¡ããŸããã ãããã€ã®èªåå ããŒã¿è»¢éã®èªåå ãããã€ã®èªåå åœåãæ€èšŒç°å¢ã§ã®ãããã€ã¯å
šãŠæåã§è¡ã£ãŠããŸããããæ€èšŒçšãã©ã³ãïŒstagingïŒã«ããŒãžåŸãCircleCIãèªåã§æ€èšŒç°å¢ã«ãã¡ã€ã«ãã³ããŒããããããããã€æé ãèªååããŸããã ããŒã¿è»¢éã®èªåå æ€èšŒç°å¢ã«ãããåŠçã®æµãã確èªã§ããããã«ãªããŸããããåŠçãããããã®ããŒã¿ãå
¥ã£ãŠããªããšæ³å®çµæãè¿ããã©ããã®ç¢ºèªãã§ããŸãããåœæã¯ãã®æ€èšŒç°å¢ã®ããŒã¿äžåã«ãããæ¬çªç°å¢ã§æ°ä»ããåŸã«ãåæ€èšŒãè¡ããšããæ€èšŒç°å¢ã®å°å
¥åãšåæ§ã®ç¶æ³ã«ãªããŸããã ãã®åŸãéœåºŠæ¬çªããæ€èšŒã«å¿
èŠãªããŒã¿ãååŸããŠinsertããããã«ããŸãããå©çšããããŒãã«ãã±ãŒã¹ãå€ãããããŒã¿ã®æºåã«ãšãŠãæéãããããŸããã ããã§ãDigdagã䜿ã£ãããŒã¿è»¢éæ©èœã远å ããŸããã Digdagã䜿ã£ãããŒã¿è»¢éã«ã€ããŠã¯ããã£ãŠã¿ããšå¹çåã ãã§ãªããå質æ
ä¿ã«ãæçšã§ããã ãããã®æ¹åã«ãããæ€èšŒãããªãªãŒã¹ãŸã§ã®ãããŒã¯ä»¥äžã®ããã«å¹çæ¹åãããŸããã Digdagãéžæããçç±ã¯ãæ¢ã«ä»ã®ããŒã¿é£æºã®å®è£
ã§å€çšããŠããããç¥èŠããããæ¯èŒçå°å
¥ããããã£ãäºãäž»ãªçç±ã§ããããããå®éã«äœ¿ã£ãŠã¿ããšãæ€èšŒã±ãŒã¹ãæžãããããã¥ã¡ã³ããšããŠæ®ããããè¿œå æ¹ä¿®ã®æã«æµçšããããã£ãããšå©ç¹ãå€ããããŸããããã®ãããçµæçã«ãã®éžæã¯æ£ãããã®ã§ããã Digdagã䜿ã£ãããŒã¿è»¢éã«ã€ããŠã以äžã§å®è£
æ¹æ³ãšå
±ã«èª¬æããŠãããŸãã ããŒã¿è»¢éæ©èœã®å®è£
æ¹æ³ PostgreSQLãšSQL Serverã®æ¬çªããŒã¿ãæ€èšŒç°å¢ã«è»¢éããæ©èœã®å®è£
æ¹æ³ã«ã€ããŠèª¬æããŸãã SQL Serverã§ã¯ããŒãã«å®çŸ©ã«ããå£ããããå®çªã®Embulkã§ã¯ãªãå¥ã®æ¹æ³ã䜿ã£ãŠããŸããåãå£ã«ã¶ã€ãã£ãæ¹ã®åèã«ãªãã°ãšæããŸãã ãªããç°å¢å€æ°ãsecretsã®èšå®æ¹æ³ãå©çšããŠããDockerã€ã¡ãŒãžã®è©³çŽ°èª¬æã«ã€ããŠã¯ãããã¯ããå€ããããäžéšçç¥ããŠããŸããäºããäºæ¿ãã ããã ãŸããæ¬çªç°å¢ã«å人æ
å ±ãæ
å ±åºåã®é«ããã®ãããå Žåã¯åãæ±ãã«æ³šæããŠãã ããã æ¬çªç°å¢ãšæ€èšŒç°å¢éã®æ¥ç¶ã«ã€ã㊠ç°å¢ãè·šãã VPCéã®æ¥ç¶ã§ã¯ AWS Transit Gateway ãå©çšããŠããŸããTransit Gatewayã¯ã«ãŒã¿ãŒã®ãããªåœ¹å²ã§ãVPCãæ¥ç¶ïŒAttachmentïŒããéä¿¡ãããããµãŒãã®æ¥ç¶æ
å ±ãã«ãŒãããŒãã«ã«èšå®ããäºã§VPCéã®éä¿¡ãå®çŸããŸããã»ãã¥ãªãã£ã°ã«ãŒãã®å¶åŸ¡ã«ããåäžæ¹åã®ã¿æ¥ç¶ãèš±å¯ããŠããŸãã digãã¡ã€ã«æ§æ ãã£ã³ããŒã³ããšã«ã©ã®ããŒã¿å®çŸ©ããããå€å¥ãããããããããå°çšã®å®è¡digãã¡ã€ã«ïŒ TestDataxxxx.dig ïŒãšããŒã¿å®çŸ©ã®èšå®ïŒ config/xxxx )ãçšæããŸãããã£ã³ããŒã³ã«äŸåããªãå
±éåŠçã¯subãtaskãã£ã¬ã¯ããªã«ä¿æããŠããŸãã config ããŒã¿å®çŸ©ã«é¢ããæ
å ±ãèšããèšå®ãã¡ã€ã«çŸ€ sub å®è¡digãã¡ã€ã«ã®äžã§å®è¡ãããµãã¿ã¹ã¯çŸ€ tasks ãµãã¿ã¹ã¯ã®äžã§å®è¡ããã¹ã¯ãªãã矀 以äžã®ãããªæ§æã§ç®¡çããŠããŸããäžã®ãã¡ã€ã«ã«ã€ããŠã¯åŸè¿°ããŸãã ProductionToStaging âââ TestDataCampaignA_postgres.dig âââ TestDataCampaignA_sqlserver.dig âââ config â âââ campaignA â âââ postgres â â âââ ranking.yml.liquid â âââ sqlserver â âââ target.yml âââ sub â âââ build_query_parameter.dig â âââ copy_sqlserver.dig â âââ postgresql_environment.dig â âââ prepare_environment.dig #ç°å¢å€æ°ã®èšå® â âââ run_embulk.dig â âââ secrets.dig #secretsèšå® âââ tasks âââ bcp_copy.sh âââ query_parameter.rb PostgreSQLã®ããŒã¿è»¢éæ¹æ³ PostgreSQLå士ã§ã®ããŒã¿è»¢éã«ã¯Embulkãå©çšããŸãããinputãoutputå
±ã«PostgreSQLçšã®JDBCãã©ã°ã€ã³ãå©çšããŸãã embulk-input-postgresql embulk-output-postgresql Embulkã¯ç°ãªãDBãã¹ãã¬ãŒãžéã§ããŒã¿è»¢éã§ããäºãç¹åŸŽã§ãããä»åã®ãããªPostgreSQLå士ã®ããŒã¿è»¢éã§ãå©çšã§ããŸãã以äžã®äŸã®ããã«ãèšå®ãliquidãšãããã³ãã¬ãŒããšã³ãžã³ã䜿ã£ãŠinputïŒ in: ïŒãšoutputïŒ out: ïŒæ
å ±ãèšèŒããäºã§å®çŸããŸãã target.yml.liquid in : type : postgresql host : {{ production_postgres_hostname }} port : {{ production_postgres_port }} user : {{ production_posrgres_user }} password : {{ production_postgres_password }} database : {{ database }} query : #人æ°ã©ã³ãã³ã°äžäœ3äœ SELECT user_id ,item_id ,rank FROM ranking WHERE rank <= 3 out : type : postgresql host : {{ staging_postgres_hostname }} port : {{ staging_postgres_port }} user : {{ staging_postgres_user }} password : {{ staging_postgres_password }} database : {{ database }} table : ranking mode : truncate_insert äžèšã®ããã«inputã«èšèŒã® query ã§è»¢éããŒã¿ãå®çŸ©ããŠããŸãã digãã¡ã€ã«ã«å¯Ÿè±¡ããŒãã«åïŒ=liquidãã¡ã€ã«åïŒãymlã®é
åååŒã§æå®ããEmbulkãå®è¡ããŸããæ€èšŒããŒã¿ãå¢ããéã«ããŒãã«ãå¢ãããããã«ããããã§ãã TestDataCampaignA_postgres.dig timezone : Asia/Tokyo +prepare_environment : !include : sub/prepare_environment.dig _export : wf : name : Transfer production data to staging for testing campaignA campaign_id : campaignA target_table_names : - ranking +prod_to_staging_postgres : for_each> : target_table_name : ${target_table_names} _parallel : false _do : +psql_to_psql : !include : sub/run_embulk.dig run_embulk.dig _export : docker : image : ${embulk_docker_image} pull_always : true sh> : embulk -J-Duser.timezone=Asia/Tokyo run -b /var/lib/embulk config/${campaign_id}/postgres/${target_table_name}.yml.liquid SQL Serverã®ããŒã¿è»¢éæ¹æ³ Embulkãå©çšãããã£ãã®ã§ããã以äžã®ãããªå£ããããŸããã IDENTITYèšå®ã®å£ SQL Serverã§ã¯IDENTITYèšå®ãããã«ã©ã ãååšããããŒãã«ã転éããå¿
èŠããããŸãããäœãèšå®ããªãå Žåãinsertæã«ãšã©ãŒãšãªããŸãã äŸãã°ä»¥äžã®ãããªããŒãã«ãinsertããå ŽåãèããŠã¿ãŸãã # IDENTITYèšå®ãããããŒãã«äœæ create table target_user(id integer identity primary key, name varchar ( 100 )); # ããŒã¿insert insert into target_user(id,name) values ( 1 , ' username ' ); ãããšã以äžã®ãããªãšã©ãŒã¡ãã»ãŒãžãã§ãŸãã [S0001][544] Cannot insert explicit value for identity column in table 'target_user' when IDENTITY_INSERT is set to OFF. IDENTITY_INSERTèšå®ãOFFã®å ŽåãIDENTITYèšå®ã®ã«ã©ã ã®å€ã¯èªåä»äžããã®ã§èšå®ã§ããªããšãããšã©ãŒã§ããäŸã ãšãid=1ã®æå®ãå€ãã°insertãã§ããŸãã ä»åã¯IDENTITYèšå®ããããã«ã©ã ã®å€ããã®ãŸãŸè»¢éãããã£ãã®ã§ã以äžã®ãããªã¹ããŒãã¡ã³ããå®è¡ããŠãIDENTITYèšå®ã«ã©ã ã«å€ãæå®ã§ããããã«èšå®ãçŽãå¿
èŠããããŸããã SET IDENTITY_INSERT target_user ON ; åäžã»ãã·ã§ã³å
ã§ SET IDENTITY_INSERT ãå®è¡ããæ¹æ³ãèŠã€ãããªãã£ããããEmbulkå©çšãæå¿µããŸããããã®ãããSQL Serverã®ããŒã¿ã¯bcpïŒbulk copy programïŒãå©çšããŠè»¢éããäºã«ããŸããã bcpã䜿ã£ãããŒã¿è»¢é bcp ã¯äžæ¬ã§ããŒã¿ãã³ããŒãããŠãŒãã£ãªãã£ã§ããã€ã³ããŒãæã« -E ãªãã·ã§ã³ãã€ããäºã§ãIDENTITYèšå®ã«ã©ã ã§ãå€ãå²ãåœãŠãã«ããŒã¿ãã¡ã€ã«ã®å€ãå©çšããããã転éãå¯èœã«ãªããŸãã ããã«ããã©ã«ãã§ã¯ããªã¬ãŒãå®è¡ããªãããããã³ããªãã·ã§ã³ -h ã« FIRE_TRIGGES åŒæ°ãæå®ããäºã§ã€ã³ããŒãæã«insertããªã¬ãŒãå®è¡ããŸãã ã€ã³ããŒãåã«éè€ããŒã¿ãåé€ããéã«ã¯sqlcmdãå©çšããŠããŸããsqlcmdã¯ã³ãã³ãã©ã€ã³ããSQLæãå®è¡ã§ãããŠãŒãã£ãªãã£ã§ãã 以äžã®ãããªã·ã§ã«ãçšæããäºã§è»¢éãå®çŸã§ããŸããã bcp_copy.sh #!/usr/bin/env bash set -e BIN_PATH="/opt/mssql-tools/bin" # 察象ããŒãã«ã»æ¡ä»¶ã®ããŒã¿ããšã¯ã¹ããŒã ${BIN_PATH}/bcp "SELECT * FROM rtm.dbo.${table_name} WHERE ${where}" queryout data.dat -N -S ${sqlserver_host},${sqlserver_port} -d rtm -U digdag -P ${secret_db_sqlserver_password} # éè€ãšã©ãŒã«ãªããªãããã忡件ã®ããŒã¿ãåé€ ${BIN_PATH}/sqlcmd -S ${staging_sqlserver_host},${staging_sqlserver_port} -d rtm -U ${staging_sqlserver_user} -P ${secret_db_sqlserver_stg_password} -Q "DELETE FROM rtm.dbo.${table_name} WHERE ${where}" # ãšã¯ã¹ããŒãããããŒã¿ãã€ã³ããŒã ${BIN_PATH}/bcp rtm.dbo.${table_name} in data.dat -E -N -S ${staging_sqlserver_host},${staging_sqlserver_port} -U ${staging_sqlserver_user} -P ${secret_db_sqlserver_stg_password} -h FIRE_TRIGGERS copy_sqlserver.dig _export : table_name : ${condition.table_name} where : ${condition.where} docker : image : ${mssql-tools_image} sh> : tasks/bcp_copy.sh ymlãã¡ã€ã«ãå©çšããããŒã¿å®çŸ© bcpã®ã·ã§ã«ã«èšèŒã® ${table_name} ãš ${where} ã«å
¥ãæ
å ±ã¯ãymlãã¡ã€ã«å
ã«ä»¥äžã®ãããªjson圢åŒã§ãã£ã³ããŒã³ã®ã±ãŒã¹æ¯ã«ããŒãã«ãæ¡ä»¶ãæãããŠããŸãã target.yml - { table_name : User, where : user_id = 1111111 } # æ
åœè
ã®user_id - { table_name : Item, where : 'item_id in (10000, 100001, 100002)' } # ã©ã³ãã³ã°ã§å©çšããåå SQL ServerããŒã¿è»¢éã®å Žåããã®target.ymlã«æ€èšŒããŒã¿ãå®çŸ©ããŠããŸãã ymlã«èšèŒããæ
å ±ã¯Rubyã§ä»¥äžã®ããã«jsonæ
å ±ããã©ã¡ãŒã¿ãšããŠæž¡ããŸãã query_parameter.rb require ' yaml ' module Tasks class QueryParameter def load # digãã¡ã€ã«ã§å®çŸ©ããcampaign_idãã©ã¡ãŒã¿ campaign_id = Digdag .env.params.fetch( " campaign_id " , 0 ) # ããŒã¿ã®å®çŸ©ãã¡ã€ã«ãèªã¿èŸŒã File .open( " config/ #{ campaign_id } /sqlserver/target.yml " , " r " ) do |f| params = YAML .load(f, symbolize_names : true ) # æ€èšŒããŒã¿ã®æ¡ä»¶ãåŸç¶ã¿ã¹ã¯ïŒbcpïŒã§å©çšãããããDigdagã®storeãã©ã¡ãŒã¿ãšããŠæ ŒçŽ Digdag .env.store( " sqlserver_conditions " .to_sym => params) end end end end query_parameter.dig _export : docker : image : ruby:2.6.1 rb> : Tasks::QueryParameter.load require : 'tasks/query_parameter' ããããdigãã¡ã€ã«ã«èšèŒããŠããŒã¿è»¢éãå®çŸããŸãã TestDataCampaignA_sqlserver.dig _export : wf : name : Transfer production data to staging for testing campaignA campaign_id : campaignA +prod_to_staging : +load_sqlserver_params : !include : sub/query_paramter.dig +loop_sqlserver : for_each> : condition : ${sqlserver_conditions} _do : +run_sqlserver_copy : !include : sub/copy_sqlserver.dig 以äžãSQL Serverã®ããŒã¿è»¢éæ¹æ³ã§ãã ãããã®ããŒã¿è»¢éæ©èœãéçšããäžã§ä»¥äžã®å©ç¹ããããŸããã æ€èšŒããŒã¿ã®å®çŸ©ãä¿æããããã¥ã¡ã³ããšããŠã®æçšæ§ ããŒã¿è»¢éæ©èœã§å®è£
ããã¯ãšãªã¯ãæ€èšŒããŒã¿ã®å®çŸ©ãä¿æããããã¥ã¡ã³ããšããŠãæçšã§ããã åããã£ã³ããŒã³éçšäžã«äœãè¿œå æ¹ä¿®ãå¿
èŠã«ãªã£ãå Žåã¯ãåäžããŒã¿ãŸãã¯è¿œå ã®æ€èšŒã±ãŒã¹ã远èšããŠæ€èšŒãã§ãããããè¿œå æ¹ä¿®æã®å¹çåãè¡ããŸãã ç§ãã¡ã®å Žåã¯çŸåšãšæªæ¥ã®å®è£
ãæ£ç¢ºã«çŽ æ©ãè¡ãããã®ææ®µãšããŠãDigdagã®ããŒã¿è»¢éæ©èœã¯é©ããææ®µã§ããã æ¹åããæ€èšŒç°å¢ã§æ€èšŒãè¡ãã¡ãªãã ä»åã®çµéšã«ãããæŽåãããæ€èšŒç°å¢ã§æ€èšŒãè¡ãã¡ãªãããšããŠä»¥äžãæããããŸãã æ¬çªçšŒåããŠãããã®ãæ¹ä¿®ããéã®æ€èšŒã楜ã«ãªã ä¿®æ£ãšç¢ºèªã®ãªãŒãã¿ã€ã ãçããªã äœèšãªç£èŠéç¥ãæå¶ã§ãã æ°ä»ããå€ããªã æ¬çªçšŒåããŠãããã®ãæ¹ä¿®ããéã®æ€èšŒã楜ã«ãªã æ€èšŒç°å¢ã§æ¬çªç°å¢ãšåæ§ã®æ€èšŒãã§ããããã«ãªã£ãçµæãæ¢ã«åããŠããã£ã³ããŒã³ã«åœ±é¿ããªãããã«æ€èšŒããããã®è©Šè¡é¯èª€ãæ¬çªç°å¢ã§ããå¿
èŠã¯ãªããªããŸããã ä¿®æ£ãšç¢ºèªã®ãªãŒãã¿ã€ã ãçããªã äºåã«æ€èšŒç°å¢ã§æ€èšŒãã§ããããã«ãªã£ãçµæãäºåæ€èšŒãå¯èœã«ãªããªãªãŒã¹æã®ç¢ºèªç¹ãæžããããšãã§ããŸãããæ€èšŒãããã®ã¯æ€èšŒç°å¢ãªã®ã§æ¬çªã«åœ±é¿ãäžããäºãªããè¿
éã«ä¿®æ£ã»ç¢ºèªã宿œã§ããŸãã äœèšãªç£èŠéç¥ãæå¶ã§ãã ç£èŠæ
åœã«äœèšãªè² è·ããããè¡çºãããè±åŽããäºãã§ãããããå
šäœã®å¹çåã«ãã€ãªãããŸãã æ°ä»ããå€ããªã äœæ¥å¹çãè¯ããªãäœæ¥æéã«äœè£ãçãŸããäºã§æ¬æ¥èããã¹ãäºãžéäžã§ããããã«ãªããŸããå®éã«ãæ€èšŒç°å¢ãã§ããŠãã仿§ã®éäžè¶³ãå¿
èŠãªæ€èšŒã±ãŒã¹ã«ã€ããŠæ
åœè
ãšããåããããæ©äŒãå¢ããŸããããã®ãããã£ã³ããŒã³ã®å質æ
ä¿ãžãè²¢ç®ã§ããŠãããšèšããŸãã 以äžã®ããã«ãæŽåãããæ€èšŒç°å¢ã®ååšã«ãã£ãŠå質ãšå¹çãäžããäºãã§ããŸããã ãŸãšã æåãŸã§äœåºŠã倱æãç¹°ãè¿ãããšã®ã§ããæ€èšŒç°å¢ã¯ãã·ã¹ãã ã«æ
£ããŠããäººãšæ
£ããŠããªã人ã®å·®ãã«ããŒããææ®µãšããŠå€§ããæ©èœããŸããã æ€èšŒç°å¢ãå©çšããåŸã®å¹çäœäžã®ãªã¹ã¯ã«ã€ããŠã¯ãCircleCIãDigdagãå©çšããŠå¹çåãäžããäºã§ã«ããŒã§ããŸãããæ¬çªãªãªãŒã¹ç¹æã®ç¢ºèªæéãæžããäœèšãªç£èŠéç¥ããªããªããããå
šäœå¹çã¯äžãã£ãŠãããšèšããŸãã ããã«Digdagã«ããããŒã¿è»¢éèªååã¯ãå¹çåã ãã§ãªãå質æ
ä¿ã«ãç¹ãããŸããã çãããæ§ã
ãªæ¹æ³ã§å質ãšå¹çã®ãã©ã³ã¹ãä¿ã€ããã«è©Šè¡é¯èª€ããŠãããšæããŸããç§ãã¡ã®ãããã£ãéçšæ¹åãå°ãã§ãçããã®ã圹ã«ç«ãŠã°å¹žãã§ãã ãããã« ç§ãã¡ã¯ä»ã«ãå€ãã®ããŒã±ãã£ã³ã°ã«é¢ããã·ã¹ãã ãéçºã»éçšããŠããŸããä»åã®ãããªç°å¢æŽåãå«ããŠãæ¢åã·ã¹ãã ã®å質ãšå¹çã®ãã©ã³ã¹ãä¿ã¡ãªãããæ°ããæœçã®ããã®æ°èŠæ©èœããªãã¬ã€ã¹ãæ€èšããŠããŸãã èå³ãæãããæ¹ã¯æ¡çšããŒãžçããã§ãã¯ããŠã¿ãŠãã ããïŒ https://hrmos.co/pages/zozo/jobs/0000016 hrmos.co