ãããªæ¹ãžç¹ã«ãããã 倿 管çã·ã¹ãã ãžã®ç³è«ãç¹ã«çްããªäœæ¥æéã®å
¥åãé¢åãªæ¹ ã¿ã¹ã¯ããšã«ã©ã®ãããã®æéãããã£ãŠããããæèŠã§ããåãããªãæ¹ ç°¡åã«Pythonã®ã¢ããªãéçºãããæ¹ æŠèŠ ããã«ã¡ã¯ããµã€ãªã¹ãã¯ãããžãŒã®ã¯ãã¡ããã§ãïŒä»å4æ¬ç®ã®ããã°å·çã§ãã ä»åã¯ç§ãäœæããã¹ããããŠã©ããã¢ããªã®ç޹ä»ãšããã®éçºéçšããããŠçããã®å€æ 管çãäœæ¥å¹çåäžã«åœ¹ç«ã€ãã³ãããäŒãããŸãã ãªãèªäœã¹ããããŠã©ããã¢ããªãå¿
èŠã ã£ãã®ãïŒ ç§ã®è·å Žã§ã¯ã倿 å ±åã§äœæ¥ã®çš®é¡ããšã«å·¥æ°ã確èªããå¿
èŠããããŸããã ããããããžã§ã¯ãã®èšèšããâ³â³ã¿ã¹ã¯ã®ã³ãŒãã£ã³ã°ããå®äŸäŒè°ããªã©ãäœæ¥ããšã«æéãæž¬ãããââã ãããªæ³ãããèªåã§äœã£ãŠèªç±ã«ã«ã¹ã¿ã ã§ããã¢ããªãäœãããšèããŸããã ç°¡åïŒã¹ããããŠã©ããã®äœãæ¹ ä»¥äžã®ãããªåçŽãªæ©èœããã€ã¢ããªãäœã£ãŠããããšæããŸãã ãã¹ã¯ãããã«è¡šç€ºãããŸã æ©èœãšããŠã¯äžãã ã©ãã«ã«å
¥å ã¿ã€ããŒè¡šç€º éå§ã忢ãã¿ã³ã®ã¯ãªã㯠ã¿ã€ããŒåæ°ã®å¢æžãã¿ã³ã®ã¯ãªã㯠ãè¡ããŸãã åææ¡ä»¶ VSCodeã®ã€ã³ã¹ããŒã« Pythonã®éçºç°å¢ ã¹ãããïŒïŒãã¹ãOSã®æºå ãŸããã³ã³ãããŒã®GUIãPCæ¬äœã®ç»é¢ã«æ ãåºãããã®ãXãµãŒããŒããšãããœãããã€ã³ã¹ããŒã«ããŸããããã¯ååã®ã¿å¿
èŠãªäœæ¥ã§ãã XãµãŒããŒãã€ã³ã¹ããŒã«ããã Windowsã®å Žå: VcXsrv ãã€ã³ã¹ããŒã«ããŠèµ·åããŸãã Macã®å Žå: XQuartz ãã€ã³ã¹ããŒã«ããŠèµ·åããŸãã Display settings: ã Multiple windows ããéžæããŠã次ãžãã Client startup: ã Start no client ããéžæããŠã次ãžãã Extra settings: ãDisable access controlã ã« å¿
ããã§ã㯠ãå
¥ããŠã次ãžãã ãå®äºããã¯ãªãã¯ããŠVcXsrvãèµ·åããŸãã ãã®ãããªèšå®ç»é¢ãèµ·åããŸãã ã¹ãããïŒïŒã¹ããããŠã©ããã¢ããªã®å®è£
ãã®Pythonã³ãŒããã³ããŒããŠãã¡ã€ã«ã«ä¿åããã ãã§ããã«åããããšãã§ããŸãã stopwatch.py import tkinter as tk import time class StopwatchApp: def __init__(self, parent): # Frameãäœæãã芪ãŠã£ãžã§ãã(parent)ã«é
眮 self.frame = tk.Frame(parent) self.frame.pack(side=tk.LEFT, padx=15, pady=15) # --- ã¹ããããŠã©ããã®ç¶æ
ã管çãã倿° --- self.running = False self.start_time = 0.0 self.elapsed_time = 0.0 # --- ã©ãã«ç·šééšå --- self.label_var = tk.StringVar() self.label_var.set("ã¿ã€ããŒ") self.label_entry = tk.Entry(self.frame, textvariable=self.label_var, font=("Arial", 10), justify="center", width=8) self.label_entry.pack(pady=(0,2)) # --- ç»é¢ã®éšåïŒãŠã£ãžã§ããïŒãäœæ --- self.time_label = tk.Label(self.frame, text="00:00", font=("Arial", 40, "bold")) self.time_label.pack(pady=4) self.toggle_button = tk.Button(self.frame, text="Start", width=13, command=self.toggle) self.toggle_button.pack(pady=4) self.update() def toggle(self): """ãã¿ã³ãæŒããããšãã®åŠç""" if self.running: # ã¹ãããåŠç self.running = False self.toggle_button.config(text="Start") else: # ã¹ã¿ãŒãåŠç self.running = True self.toggle_button.config(text="Stop") self.start_time = time.time() - self.elapsed_time def update(self): """æéãèšç®ããŠè¡šç€ºãæŽæ°ããåŠç""" if self.running: self.elapsed_time = time.time() - self.start_time self._display_time() self.frame.after(10, self.update) def _display_time(self): """çµéæéãèŠããã圢åŒã«å€æããŠã©ãã«ã«è¡šç€ºïŒæé:åïŒ""" hours = int(self.elapsed_time // 3600) minutes = int((self.elapsed_time % 3600) // 60) time_string = f"{hours:02}:{minutes:02}" self.time_label.config(text=time_string) # --- ã¢ããªã±ãŒã·ã§ã³ã®å®è¡ --- class StopwatchManager: def __init__(self, root): self.root = root self.stopwatches = [] self.frame = tk.Frame(root) self.frame.pack() # ãã¿ã³é
眮 btn_frame = tk.Frame(root) btn_frame.pack(pady=4) self.add_btn = tk.Button(btn_frame, text="â", font=("Arial", 12), width=4, command=self.add_stopwatch) self.add_btn.pack(side=tk.LEFT, padx=4) self.remove_btn = tk.Button(btn_frame, text="Ã", font=("Arial", 12), width=4, command=self.remove_stopwatch) self.remove_btn.pack(side=tk.LEFT, padx=4) # åæ2〠self.add_stopwatch() self.add_stopwatch() def add_stopwatch(self): sw = StopwatchApp(self.frame) self.stopwatches.append(sw) self.update_window_size() def remove_stopwatch(self): if self.stopwatches: sw = self.stopwatches.pop() sw.frame.destroy() self.update_window_size() def update_window_size(self): width = max(205 * len(self.stopwatches), 205) self.root.geometry(f"{width}x200") # --- ã¢ããªã±ãŒã·ã§ã³ã®å®è¡ --- if __name__ == "__main__": root = tk.Tk() root.title("StopWatch") root.resizable(False, False) root.attributes("-topmost", True) manager = StopwatchManager(root) # åæãŠã£ã³ããŠãµã€ãº root.geometry("410x200") root.mainloop() ã¹ãããïŒïŒå®è¡ ã¿ãŒããã«ã§ä»¥äžã®ã³ãã³ããå
¥åãããšã¢ããªãèµ·åããŸãã bash python3 stopwatch.py å®è¡ã§ããªããšãã¯âŠ è§£æ±ºçïŒïŒã©ã€ãã©ãªã®ããŠã³ããŒããã Pythonã«ã¯ã Tkinter ããšããGUIïŒç»é¢ä»ãã¢ããªïŒãäœãããã®ã©ã€ãã©ãªãæšæºã§ä»å±ããŠããããã远å ã®ã€ã³ã¹ããŒã«ãªãã§ããã«éçºãå§ããããŸãã ããããLinuxã§æäœããŠããå Žåã¯æåã§ã®ããŠã³ããŒããå¿
èŠã§ãã bash sudo apt update sudo apt install python3 python3-tk 解決çïŒïŒãã¡ã€ã¢ãŠã©ãŒã«ã®èšå®ã確èªãã VcXsrvãåããŠèµ·åãããšããWindows Defenderãã¡ã€ã¢ãŠã©ãŒã«ãèŠåç»é¢ã衚瀺ããã¯ãã§ãã ããã§ã ã¢ã¯ã»ã¹ãèš±å¯ãã ããéžæããªããšãéä¿¡ããããã¯ãããŠããŸããŸãã Windowsã®æ€çŽ¢ããŒã§ã ãã¡ã€ã¢ãŠã©ãŒã« ããšæ€çŽ¢ããã Windows Defender ãã¡ã€ã¢ãŠã©ãŒã«ã«ããã¢ããªã®èš±å¯ ããéããŸãã ãèšå®ã®å€æŽããã¯ãªãã¯ãããå¥ã®ã¢ããªã®èš±å¯ããã¯ãªãã¯ããŸãã ãåç
§ãããVcXsrvã®å®è¡ãã¡ã€ã«ïŒé垞㯠C:\Program Files\VcXsrv\vcxsrv.exe ïŒãéžæããŠè¿œå ããŸãã äžèЧã«è¿œå ããããvcxsrvãã®ã ãã©ã€ããŒã ããšã ãããªã㯠ãã®äž¡æ¹ã®ãã§ãã¯ããã¯ã¹ããªã³ã«ããŠãOKããã¯ãªãã¯ããŸãã ãŸãšã ä»åã¯ãã¹ããããŠã©ããã®ã¢ããªéçºãéããŠãPythonãšTkinterã䜿ãã°ãæ¥åžžã®ã¡ãã£ãšããäžäŸ¿ãè§£æ¶ããã¢ããªãèªäœã§ããæ¥œãããåŠãã§ãããŸããã Github ã§ããç§ã®éçºã³ãŒããå
¬éããŠããã®ã§ãèªç±ã«ã³ãŒããæžãæ¿ããŠäœ¿ã£ãŠã¿ãŠãã ãããã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 1人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post 倿 管çã®ä»æ¹ïœTkinterã§èªäœã¹ããããŠã©ãã first appeared on SIOS Tech. Lab .
OSSããããµããŒãæ
åœã®ç¥ïšã§ãã ä»å㯠Dify ã«ã€ããŠãœãŒã¹ã³ãŒããããã¥ã¡ã³ããæ€èšŒãè¡ã£ãéã®ç¥èŠã«ã€ããŠãã§ã«å
¬éãããŠããåŒç€Ÿã®èšäºãšéãªããªãç¯å²ã§è»œããŸãšããŠãããŸãã Dify ã«ã€ã㊠Difyã®æŠèŠãå
šäœåã«ã€ããŠã¯ã åŒç€Ÿãšã³ãžãã¢ã®è§£èª¬èšäº ããããŸãã®ã§ããåç
§ãã ããã Dify ã®åŒç§°ã«ã€ã㊠äžèšèšäºã«æ²èŒãããŠããªãäžå£ã¡ã¢ãšã㊠Dify ã®èªã¿æ¹ã«ã€ããŠèª¬æããŸãã Dify ã®ããšãçè
ã¯æè¿ãŸã§ããã£ãã¡ã€ããšåŒãã§ããŸããããæ£åŒãªåŒç§°ã¯ããã£ãã£ããšãªã£ãŠãããŸãã åèïŒ https://xtech.nikkei.com/atcl/nxt/column/18/03236/061200004/ Dify + Amazon Bedrock ã«ã€ã㊠åŒç€Ÿã§ã¯ AzureAI ãå©çšãã Dify ã®èšäºãæ°å€ãå
¬éãããŠããŸãããä»å㯠AWS ã® Amazon Bedrock ãšãã LLM ã§æ€èšŒããŸããã Dify ã§ Amazon Bedrock ãèšå®ããããæ¹ã«ã€ããŠãã åŒç€Ÿãšã³ãžãã¢ã®è§£èª¬èšäº ãã確èªãã ããã åŒç€Ÿã§å
¬éããŠãããã£ãã bot ãã¯ãŒã¯ãããŒã RAG ãäœæããŠã¿ãŸããããåé¡ãªãåäœããŸããã ã¢ããªã±ãŒã·ã§ã³ãäœæããããã§ã®æ³šæç¹ Amazon Bedrock äžã§æå¹åããã¢ãã«ä»¥å€ãéžæããå ŽåãLLM ããŒãã«ãããŠãšã©ãŒãåºåãããŠããŸãããæå¹åããã¢ãã«ãæ£ããéžæããå¿
èŠãããããšã«ã泚æãã ããã Dify ã®ãšã©ãŒåŠç Dify ã®åããŒãã§åºåããããšã©ãŒã«ã€ããŠãŸãšããŠãããŸãã åèïŒ ãšã©ãŒåŠç – ãšã©ãŒã¿ã€ãæŠèŠ ãã£ãããããŒïŒã¯ãŒã¯ãã㌠ã·ã¹ãã ãšã©ãŒ ãµãŒãã¹ãæ£ããèµ·åããŠããªãããããã¯ãŒã¯åé¡ãªã© æäœãšã©ãŒ ããŒãã®èšå®ãæäœã«å€±æããéã®ãšã©ãŒ ã³ãŒãããŒã ã³ãŒããšã©ãŒïŒCodeNodeErrorïŒ éçºè
ã®èšå®ããã³ãŒãå
ã«ãšã©ãŒãããå Žåã«çºçãããšã©ãŒ ãµã³ãããã¯ã¹ã®ãããã¯ãŒã¯åé¡ïŒSystem ErrorïŒ ãããã¯ãŒã¯ã®ãã©ãã£ãã¯ã æ¥ç¶åé¡ã«ãã£ãŠçºçãããšã©ãŒ ãã¹ãå¶éãšã©ãŒïŒDepthLimitErrorïŒ ããŒãã®ãã¹ãæ§é ã 5局以äžã®å Žåã«çºçãããšã©ãŒ åºåæ€èšŒãšã©ãŒïŒOutputValidatioã®nErrorïŒ åºå倿°ã®åãäžèŽããªãå Žåã«çºçãããšã©ãŒ LLM ããŒã 倿°ãèŠã€ãããªãïŒVariableNotFoundErrorïŒ æå®ããã倿°ãèŠã€ãããªãå Žåã«çºçãããšã©ãŒ ã³ã³ããã¹ãæ§é ã®ç¡å¹ (InvalidContextStructureError) Â äžæ£ãªããŒã¿æ§é (æåå以å€) ãåãåã£ãå Žåã«çºçãããšã©ãŒ ç¡å¹ãªå€æ°ã¿ã€ãïŒInvalidVariableTypeErrorïŒ ã·ã¹ãã ããã³ããã®åœ¢åŒãäžè¬çãªããã¹ãã Jinja syntax ã§ãªãå Žåã«çºçãããšã©ãŒ ã¢ãã«ãååšããªãïŒModelNotExistErrorïŒ LLM ããŒãã«ã¢ãã«ãèšå®ãããŠããªãå Žåã«çºçãããšã©ãŒÂ LLMã®èªèšŒãå¿
èŠïŒLLMModeRequiredErrorïŒ éžæãããã¢ãã«ã« API ããŒãèšå®ãããŠããªãå Žåã«çºçãããšã©ãŒ ããã³ãããèŠã€ãããªãïŒNoPromptFoundErrorïŒ LLM ããŒãã®ããã³ããã空ã®å Žåã«çºçãããšã©ãŒ HTTPããŒã èªèšŒèšå®ãšã©ãŒïŒAuthorizationConfigErrorïŒ èªèšŒæ
å ±ãèšå®ãããŠããªãå Žåã«çºçãããšã©ãŒ ãã¡ã€ã«ååŸãšã©ãŒïŒFileFetchErrorïŒ ãã¡ã€ã«å€æ°ãååŸã§ããªãå Žåã«çºçãããšã©ãŒ äžæ£ãªHTTPãªã¯ãšã¹ãã¡ãœããïŒInvalidHttpMethodErrorïŒ ãªã¯ãšã¹ãã¡ãœããã GETãHEADãPOSTãPUTãPATCHãDELETE ã®ãããã«ã該åœããªãå Žåã«çºçãããšã©ãŒ ã¬ã¹ãã³ã¹ãµã€ãºè¶
éïŒResponseSizeErrorïŒ HTTPã¬ã¹ãã³ã¹ã³ãŒããšã©ãŒïŒHTTPResponseCodeErrorïŒ ã¬ã¹ãã³ã¹ã³ãŒãã 200系以å€ïŒäŸïŒ400ã404ã500ãªã©ïŒã®å Žåã«çºçãããšã©ãŒ â»äŸå€åŠçãæå¹ã§ããã°ããããã®ã¹ããŒã¿ã¹ã³ãŒãã«ãããšã©ãŒãå ±åããã ããŒã«ããŒã ããŒã«å®è¡ãšã©ãŒïŒToolNodeErrorïŒ ããŒã«èªäœã®å®è¡ã«åé¡ããã£ãå Žåã«çºçãããšã©ãŒ ããŒã«ãã©ã¡ãŒã¿ãšã©ãŒïŒToolParameterErrorïŒ ããŒã«ããŒããèŠæ±ãããã©ã¡ãŒã¿ãšç°ãªãå€ãå
¥åãããå Žåã«çºçãããšã©ãŒ ããŒã«ãã¡ã€ã«åŠçãšã©ãŒïŒToolFileErrorïŒ ããŒã«ããŒãã®åŠçã«å¿
èŠãªãã¡ã€ã«ãèŠã€ãããªãå Žåã«çºçãããšã©ãŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Dify ã®ãã¥ãŒããªã¢ã«ãçµããŠã®ç¥èŠ (åºåããããšã©ãŒãªã©) first appeared on SIOS Tech. Lab .
ããªã¶ã³ã¿ãŒÂ® Pleasanter® ã¯æ ªåŒäŒç€Ÿã€ã³ããªã ã®ç»é²åæšã§ãã ã¯ããã« ä»åã¯ã9/19ïŒéïŒã«åå€å±ã§ãªãã©ã€ã³éå¬ãããã ããªã¶ã³ã¿ãŒãã³ãºãªã³ã»ãã㌠ãã«åå ããŠãŸãããŸããã®ã§ããã®ã¬ããŒãããããŠããã ããŸãã æ¬ã»ãããŒã¯ãç¹ã«ããªã¶ã³ã¿ãŒã䜿ã£ãããšããªãæ¹ãã䜿ãå§ããã°ããã®åå¿è
ã®æ¹åãã®å
容ãšããŠæ§æãããŠããããã®åºæ¬æäœãå®éã«æãåãããªããäœéšã§ãã貎éãªæ©äŒã§ããã ã¢ã€ãã£ããã¯åœæ¥ããã ããã¢ã³ãã¬ã©ããŒã«ãŒãã¯ãªã¢ãã¡ã€ã«ãã¹ããã«ãŒã§ãã ããªã¶ã³ã¿ãŒÂ® Pleasanter® ã¯æ ªåŒäŒç€Ÿã€ã³ããªã ã®ç»é²åæšã§ãã ã€ãã³ãã®æŠèŠ æ¬ã»ãããŒã¯åå€å±ã«ãŠãªãã©ã€ã³åœ¢åŒã§éå¬ãããŸããã é嬿¥æïŒ2025幎9æ19æ¥(é) 16:30ã18:00 äŒå ŽïŒæç¥çåå€å±åžäžæåºå€ªé€1äžç®20-13 ç§å¹žãã« ïŒé 601å· (ãªãã©ã€ã³éå¬) äž»å¬ïŒæ ªåŒäŒç€Ÿã€ã³ããªã å
±å¬ïŒãã¬ã·ã£ã¹ãæ ªåŒäŒç€Ÿ è²»çšïŒç¡æ å®å¡ïŒ15åïŒå
çé ïŒ 60æ¥éç¡æã§å
šæ©èœã詊ãããã¢ç°å¢ ã䜿ã£ãŠã®ãã³ãºãªã³ã»ãããŒã§ããã PleasanterïŒããªã¶ã³ã¿ãŒïŒãšã¯ Pleasanterã¯ããŒã³ãŒãã§æ¥åã¢ããªãäœæã§ãããã©ãããã©ãŒã ã§ããExcelã®ãããªèŠªãã¿ãããæäœæã§ãããã°ã©ãã³ã°ã®ç¥èããªããŠãç°¡åã«æ¥åã¢ããªãäœæããããšãã§ããŸãã顧客管çããããžã§ã¯ã管çãæ¥å ±ã®ç®¡çãªã©ã®æ£åšããã¡ãªæ
å ±ãäžå
åããŠç®¡çãã§ããããšã倧ããªç¹é·ã§ãã ã·ã¹ãã å°å
¥ã«ãããŠãæè»æ§ãé«ããã¯ã©ãŠãã§ã®å©çšã¯ãã¡ãããã€ã³ã¿ãŒãããã«æ¥ç¶ã§ããªããªã³ãã¬ãã¹ç°å¢ãžã®å°å
¥ã«ã察å¿ããŠããŸãã Pleasanterã®ç¹åŸŽçãªæ©èœ Pleasanterã¯ãæ¥åå¹çåãšæ
å ±ã»ãã¥ãªãã£ãäž¡ç«ããã倿§ãªæ©èœãåããŠããŸãã 鲿ã®å¯èŠå æšæºæ©èœãšããŠã¬ã³ããã£ãŒããã«ã³ãã³æ©èœãªã©ãæèŒãããŠãããæ¥åã®é²æç¶æ³ã®å¯èŠåãããŒã å
ã§ã®æ
å ±å
±æãå¹çåããããšãã§ããŸãã è±å¯ãªãã³ãã¬ãŒã 顧客æ
å ±ãFAQãè³ç£ç®¡çãªã©ãå¹
åºãæ¥åã«å¯Ÿå¿ããæ¥åã¢ããªã倿°çšæãããŠããŸãã éç¥ã»ãªãã€ã³ã ã¢ããªã±ãŒã·ã§ã³å
ã®æŽæ°æ
å ±ãã¡ãŒã«éç¥ããããã¿ã¹ã¯ã®ææ¥åã«ãªãã€ã³ãéç¥ãéãèšå®ãå¯èœã§ãã ã¢ã¯ã»ã¹å¶åŸ¡ å人æ
å ±ãªã©ã®æ©å¯æ§ã®é«ãæ
å ±ããç¹å®ã®æ
åœè
ã®ã¿ãé²èЧã»ç·šéã§ããããã«ã¢ã¯ã»ã¹å¶åŸ¡ãå¯èœã§ãã ããªã¶ã³ã¿ãŒã§ã§ããããš ææç©ã®çŽ¹ä» ä»åã®ãã³ãºãªã³ã§ã¯æ¡ä»¶ç®¡çã§çšããã¢ããªãããªã¶ã³ã¿ãŒã§äœæããŸããã ãã³ãºãªã³ã§ã®ææç© ä»åäž»ã«äœæããã®ã¯ããã©ã«ãããšãããŒãã«ãã§ãã ããã©ã«ããã¯çãããæ®æ®µPCã§äœ¿ã£ãŠãããã©ã«ããã€ã¡ãŒãžããŠããã ãããšãããããããšæããŸããPleasanterã§ã¯ããŒãã«ãä»ã®ãã©ã«ããæ ŒçŽãããªãŒæ§é ã§ããŒã¿ã管çããŸãã ãã®ãã©ã«ãã®äžã«ããŒãã«ãäœæããããšãã§ããŸããããŒãã«ã¯2çš®é¡ãããã¿ã¹ã¯ç®¡çãªã©ã®æéã®ç®¡çãè¡ããæéä»ãããŒãã«ããšãè³ç£ç®¡çãªã©ã®æ
å ±ã®ç®¡çã«äœ¿çšãããèšé²ããŒãã«ãã®äºã€ããããŸããããŒãã«ã®äžã«ã¯ãã¬ã³ãŒãããç»é²ããããšãã§ããåã¿ã¹ã¯ãèšé²ã®å
容ã¯ãã®ã¬ã³ãŒããç»é²ããããšã§ç®¡çãããŸãã ä»åã®ãã³ãºãªã³ã§ã¯ãå¶æ¥éšããšããååã®ãã©ã«ããäœæãããã®çŽäžã«ãåè«ããšããæéä»ãããŒãã«ãšã顧客ãã¹ã¿ããšããèšé²ããŒãã«ãäœæããŸãããäœæããåããŒãã«å
ã«ã¬ã³ãŒããäœæããåè«æ
å ±ã顧客æ
å ±ã管çã§ããããã«ããŸããã ããã«ãå®è·µçãªæ©èœãšããŠãã¬ã³ãŒããžã®ç»åã®æ·»ä»ãããŒãã«ã«èŠªåé¢ä¿ãæãããŠã®ããŒã¿é£æºãéèšããã£ã«ã¿ã®èšå®ãšãã£ããå®éã®æ¥åã§åœ¹ç«ã€æäœã宿œããŸããã åå ããŠã®ææ³ãšææ äœ¿çšããææ³ãšããŠã¯ããã©ã«ããããŒãã«ã®äœæãããŒãã«ã®ç®¡çãªã©ã®æäœãçŽæçã«åããããããæè¡çãªç¥èããªãæ¹ã§ãæäœãããããšæããŸããã å人çã«äŸ¿å©ã ãšæããã®ã¯ãããŒãã«ã®èšèšãã¬ã³ãŒãã®å
容ã倿Žããéã«æŽæ°ãå¿ãããšãã€ã¢ãã°ãåºããããæŽæ°å¿ãããªã䟿å©ã ãšæããŸããã ã»ãããŒå
šäœãéããŠãé²è¡ã®ãã³ãã驿£ã§ãæžæãããšãªãèªåã®ããŒã¹ã§æãåãããããã£ãç¹ããäž»å¬è
æ§ã®ãé
æ
®ãæãããã€ã³ãã§ããã ããªã¶ã³ã¿ãŒã®ã»ãããŒã¯ãä»åã®åå€å±éå¬ã®ããã«åå°ã§éæéå¬ãããŠãããŸãããèå³ããæã¡ã®æ¹ã¯ããã²åå ãããŠã¿ãŠã¯ãããã§ããããã ã»ãããŒæ
å ±ãªã© åèæç® Pleasanter Pleasanterã®æŽ»çšã·ãŒã³ Pleasanterå°å
¥äºäŸ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ãã»ãããŒã¬ããŒããããªã¶ã³ã¿ãŒãã³ãºãªã³ã»ãããŒïŒ åå€å±ã«åå ããŠããŸããïŒ first appeared on SIOS Tech. Lab .
ïœå²äžæå€§çŽã®npmèªå·±å¢æ®åã¯ãŒã æ»æãShai-Huludããšãã®é²åŸ¡çïœ 2025幎9æ15æ¥ãnpmãªããžããªã«å¯Ÿããå²äžæå€§çŽã®ãœãããŠã§ã¢ãµãã©ã€ãã§ãŒã³æ»æãShai-HuludããçºèŠãããŸããããã®æ»æã¯ãããã1é±éã§20çš®é¡ä»¥äžã®æªæããOSSããã±ãŒãžãå©çšãã200äžå以äžããŠã³ããŒããããå€§èŠæš¡ãªãã®ã§ããç¹ã«ãã£ã³ããã¯äŒæ¥ïŒã³ã€ã³ååŒæãéè¡ã蚌åžãªã©ïŒãæ»æã®å¯Ÿè±¡ãšãããããšãå€ããšãããŠããŸãã Shai-Huludã¯ãåŸæ¥ã®æ»æãšã¯ç°ãªããæ°ããèªå·±å¢æ®åãã«ãŠã§ã¢ïŒã¯ãŒã ïŒãšããŠèªå·±æ¡æ£ãç¶ããŸããæ»æã¯å€æ®µéã§å®è¡ããããŸããã£ãã·ã³ã°ã«ãã£ãŠéçºè
ã®GitHubãnpmããŒã¯ã³ãªã©ã®èªèšŒæ
å ±ãçã¿ãŸããéçºè
ãææããã±ãŒãžãã€ã³ã¹ããŒã«ã`postinstall`ã¹ã¯ãªãããå®è¡ããããšãæªæã®ããã³ãŒããæ³šå
¥ãããŸãã ãã®ã³ãŒãã¯ãç°å¢å
ã®æ©å¯ããŒã¿ïŒGitHubã®PATãSSHããŒãAWSãGCPãAzureãªã©ã®ã¯ã©ãŠããããã€ããŒã®ããŒïŒã培åºçã«ã¹ãã£ã³ïŒã¯ã¬ãã³ã·ã£ã«ããŒãã¹ãã£ã³ã°ïŒããŸããçãŸããããŒã¿ã¯è€æ°åãšã³ã³ãŒãããããShai-Huludããšããååã®ãããªãã¯GitHubãªããžããªãªã©ã«æµåºããŸãã æãå±éºãªç¹åŸŽã¯ãã¯ãŒã ã®æ¡æ£ã¡ã«ããºã ã§ããæå¹ãªnpmããŒã¯ã³ãçºèŠãããšããããå©çšããŠã¡ã³ããã管çããä»ã®ããã±ãŒãžã®æªæããããŒãžã§ã³ãå
¬éããææããšã³ã·ã¹ãã å
šäœã«åºããèªå·±åççãªãµã€ã¯ã«ãçã¿åºããŸããããã¯ãnpmãšã³ã·ã¹ãã ã«ãããæåã®æåããèªå·±å¢æ®åã¯ãŒã ã®äžã€ã§ãããæ¥µããŠæ·±å»ãªè
åšããããããŠããŸãã ã³ãã¥ããã£ããŒã¹ã®OSSã¯ããã®å
¬éæ§ãè€éãªäŸåé¢ä¿ãã»ãã¥ãªãã£ãã¹ãã®äžååããã³ãã¥ããã£å
ã®ä¿¡é Œã®æªçšãªã©ããããµã€ããŒæ»æã®æ Œå¥œã®æšçãšãªã£ãŠããŸãã ä»åã®äºä»¶ã§ã¯ãå€ãã®JFrogãŠãŒã¶ãŒäŒæ¥ããã®ãªã¹ã¯ãé²ãããšå ±åãããŠããŸããJFrog Platformã¯ããœãããŠã§ã¢ãµãã©ã€ãã§ãŒã³ã®ã»ãã¥ãªãã£ã¬ããã³ã¹ãå
šäœçã«å®ãçµ±åãã©ãããã©ãŒã ã§ããã以äžã®äž»èŠãªæ©èœã§é²åŸ¡çãæäŸããŸãã 1. Curationæ©èœ: æªæã®ããããã±ãŒãžããµãã©ã€ãã§ãŒã³ã«å
¥ãåã«ããŠã³ããŒãã黿¢ãã峿ã®ã¬ããã³ã¹ãæäŸããŸãã 2. JFrog Xray: çŸåšã®éçºç°å¢ããã³æ¬çªç°å¢ã®ããã±ãŒãžããªã¢ã«ã¿ã€ã ã¹ãã£ã³ãããæªæåºŠã¹ã³ã¢ããä»äžããŠæ©æã«è
åšãçºèŠã»å¯ŸçããŸãã 3. Artifactoryã®ãªã¢ãŒããªããžããªæ©èœ: å€éšããã±ãŒãžãªããžããªããã®ãã£ãã·ã¥ã管çããæªæããã¢ãŒãã£ãã¡ã¯ãã®äŸµå
¥ãé²ããŸãã ãã圱é¿ãåããããã±ãŒãžãã€ã³ã¹ããŒã«ããŠããå ŽåãGitHubãNPMãAWSãGCPãAzureãªã©ã§äœ¿çšããŠããã¢ã¯ã»ã¹ããŒã¯ã³ãçŽã¡ã«å転ãããããšãå¿
é ã§ããJFrogã¯ãã®è
åšã«å¯Ÿããç ç©¶ãç¶ç¶ããŠããŸãã æ¬èšäºã®è©³çŽ°ã¯ ãã¡ã ããã確èªãã ãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post 泚æåèµ·ïŒå²äžæå€§ãªNpmãœãããŠãšã¢ãµãã©ã€ãã§ãŒã³æ»æïŒShai-Hulud first appeared on SIOS Tech. Lab .
ããã§ã¯ãé£èŒåœ¢åŒã§å
¬éããŠãããGit & GitLabå
¥éãã·ãªãŒãºã®èšäºãžã®ãªã³ã¯ãšãšãã«ãååã®æŠèŠãæŽçããŸãã Gitã®åºæ¬ãšGitLab / GitHubã«ã€ã㊠ããŒãžã§ã³ç®¡çã®åºç€ãšãªãGitã®åºæ¬æŠå¿µïŒãªããžããªãã³ããããªã©ïŒã解説ãããã®ããŒã«ã§ããGitãšããããžã§ã¯ãããã¹ãããGitLab/GitHubãšã®é¢ä¿æ§ãæŽçããå
¥éé£èŒã®ç¬¬1åã§ãã Git & GitLab å
¥é (1) ïœGit ãã¹ã¿ãŒãžã®éïœãGit ã®åºæ¬ãš GitLab/GitHubã Gitæäœå
¥é GitãšVS Codeã®ã€ã³ã¹ããŒã«ããŠãŒã¶ãŒèšå®ãšãã£ãç°å¢æ§ç¯ãããããŒã«ã«ãªããžããªäžã§ã®å€æŽã»ã¹ããŒãžã³ã°ã»ã³ããããšããããŒãžã§ã³ç®¡çã®åæ©çãªæäœæé ã解説ããŠããŸãã Git & GitLab å
¥é (2) ïœGit ãã¹ã¿ãŒãžã®éïœãGitæäœå
¥éã GitæäœããŒã å©çšã³ãã³ãã ããŒã«ãã㯠ããŒã éçºã§å¿
èŠãšãªãå±¥æŽè¡šç€ºïŒgit logïŒãå·®å確èªïŒgit diffïŒãã¿ã°ä»ãïŒgit tagïŒãããŒãžã§ã³ç®¡ç察象å€ã®èšå®ïŒ.gitignoreïŒãšãã£ãæäœãšãç¶æ³ã«å¿ããŠäœ¿ãåããå¿
èŠãããã³ããããåãæ¶ãã³ãã³ãïŒgit revertãgit resetãgit restoreïŒã«ã€ããŠè§£èª¬ããŠããŸãã Git & GitLab å
¥é (3) ïœGit ãã¹ã¿ãŒãžã®éïœãGitæäœããŒã å©çšã³ãã³ãã ããŒã«ããã¯ã ãªã¢ãŒããªããžããªãšããŒã«ã«ãªããžã㪠ãªã¢ãŒããªããžããªã®åœ¹å²ã解説ããSSHããŒã®ç»é²ããããžã§ã¯ãã®äœæãã¯ããŒã³ããããŠããŒã«ã«ã®å€æŽããªã¢ãŒããžåæ ãããadd/commit/pushãšãã£ããªã¢ãŒããªããžããªãšããŒã«ã«ãªããžããªã®é£æºæäœã解説ããŠããŸãã Git & GitLab å
¥é (4) ïœGit ãã¹ã¿ãŒãžã®éïœããªã¢ãŒããªããžããªãšããŒã«ã«ãªããžããªã Git ã®ãã©ã³ãã«ã€ã㊠Gitã®ãã©ã³ãã®åºæ¬æŠå¿µãšãGit FlowãGitHub Flowãªã©ã®äž»èŠãªãã©ã³ãæŠç¥ã解説ããããŒã éçºã«ãããããŒãžãªã¯ãšã¹ãïŒãã«ãªã¯ãšã¹ãïŒã®äœæããã³ã³ããªã¯ãã®çºçãšæåã«ããè§£æ¶æé ãŸã§ã解説ããŠããŸãã Git & GitLab å
¥é (5) ïœGit ãã¹ã¿ãŒãžã®éïœãGit ã®ãã©ã³ãã«ã€ããŠã GitLabã®ç»é¢èª¬æãšããå©çšãããæ©èœèª¬æ GitLabãæäŸããããããžã§ã¯ãããCI/CDãã»ãã¥ãªãã£æ©èœãIssue管çãããŒãžãªã¯ãšã¹ããšãã£ãDevSecOpsã©ã€ããµã€ã¯ã«å
šäœãã«ããŒããçµ±åãã©ãããã©ãŒã ãšããŠã®äž»èŠãªæ©èœããå€éšããŒã«ãšã®é£æºãéèŠããGitHubãšã®éãã亀ããªãã解説ããŠããŸãã Git & GitLab å
¥é (6) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ç»é¢èª¬æãšããå©çšãããæ©èœèª¬æã GitLabã®ãããžã§ã¯ãã«ã€ã㊠GitLabã«ãããã°ã«ãŒããšãããžã§ã¯ãã®é¢ä¿ãããªããžããªãšã®éãã解説ããŠããŸãããŸããããŒãžãªã¯ãšã¹ããCI/CDãå«ããããžã§ã¯ãã®çµ±åçãªæ©èœã説æãããŠãŒã¶ãŒæåŸ
ãä¿è·ãã©ã³ããWikiã®èšå®ãšãã£ãéçºãå§ããããã®å
·äœçãªåææºåæé ã解説ããŠããŸãã Git & GitLab å
¥é (7) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ãããžã§ã¯ãã«ã€ããŠã GitLabã®CICDèšå® ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã»ç¶ç¶çããªããªãŒïŒCI/CDïŒã®æŠèŠã解説ããKubernetesäžã«GitLab Runnerãã»ããã¢ããããŠé£æºãããäžã§ã.gitlab-ci.ymlãçšããŠã³ã³ããã€ã¡ãŒãžã®ãã«ããããã·ã¥ããããã€ã¡ã³ããŸã§ãäžè²«ããŠèªååãããã€ãã©ã€ã³ã®æ§ç¯æé ã解説ããŠããŸãã Git & GitLab å
¥é (8) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®CICDèšå®ã ã³ãŒãã¬ãã¥ãŒã®é²ãæ¹ GitLabã®ããŒãžãªã¯ãšã¹ãïŒMRïŒãã³ãŒãã¬ãã¥ãŒã®å ŽãšããŠæŽ»çšããæ¹æ³ã解説ããŠãããã¬ãã¥ã¢ãŒãšã¬ãã¥ãŒã€åæ¹ã®èŠç¹ãããã¬ãã¥ãŒãåæ»ã«é²ããããã®å
·äœçãªæé ïŒMRèšå®ãã³ã¡ã³ããæ¿èªãææ¡ã®é©çšïŒã解説ããŠããŸãã Git & GitLab å
¥é (9) ïœGit ãã¹ã¿ãŒãžã®éïœãã³ãŒãã¬ãã¥ãŒã®é²ãæ¹ã GitLabã§DevSecOps éçºã¹ããŒããšå®å
šæ§ãäž¡ç«ãããDevSecOpsãã®æŠå¿µãšãGitLabãCI/CDãã€ãã©ã€ã³ãžã®ã»ãã¥ãªãã£ã¹ãã£ã³çµ±åãéããŠãããå®çŸããHilti瀟ãCarfax瀟ãªã©ã®å
·äœçãªäŒæ¥äºäŸã«ãããéçºå¹çåãã»ãã¥ãªãã£åäžãšãã£ãå°å
¥ææã解説ããŠããŸãã Git & GitLab å
¥é (10) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã§DevSecOpsã ãã®é£èŒãéããŠãGit/GitLabãå©çšããå人ã»ããŒã éçºã®ããã»ã¹ãäœç³»çã«çè§£ããããšãã§ããŸããGitã®åºæ¬æäœã¯ãã¡ãããCI/CDãDevSecOpsæ©èœãçµã¿èŸŒãã GitLabã®åºç€ãåŠã¶ããšãã§ããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Git & GitLab å
¥é ïœGit ãã¹ã¿ãŒãžã®éïœããŸãšãã first appeared on SIOS Tech. Lab .
ã¯ããã« æšä»ãçæAIãæµè¡ã£ãŠããã®ã¯èšããŸã§ããããŸãããChatGPTããå§ãŸãããããŠRAGïŒRetrieval Augmented GenerationïŒãšåŒã°ããæè¡ã泚ç®ãããããã«AIãšãŒãžã§ã³ããªããŠããã®ãåºãŠããŠããŸãããããŠãä»ãæãç±ãã®ã¯MCP(Model Context Protocol)ã§ãããã ä»åã¯ããããªMCPã®ãã¯ãããžãŒãšMoodle(ãªãŒãã³ãœãŒã¹ã®åŠç¿ç®¡çã·ã¹ãã )ãçµã¿åãããMCPãµãŒããŒãäœæããŸããã®ã§ããã®ç޹ä»ãããããšæããŸãã以äžã®Gitãªããžããªã«ãŠãœãŒã¹ã³ãŒããå
¬éããŠããŸãã https://github.com/ntakei-sti/moodle-mcp-server ãã®MCPãµãŒããŒã¯ãååŠã«å±ãåŠçãåªããæ¯ããAIããŒã«ã§ãã ãã£ãããã£ãŠããŸããšãäŸãã°äžå³ã®ããã«ãã£ãã圢åŒã®ã¢ããªã«ãã®MCPãµãŒããŒãçµã¿èŸŒãããšã§ãåŠçããã£ãã圢åŒã§è³ªåããå
容ã«å¿ããŠãMoodleã®æ
å ±ãååŸããŠãåçããããšãã§ããŸãã äŸãã°ããã®ãã£ããã¿ããã«ãã¡ãã£ãšåŒ±æ°ãªçºèšããããšãéå»ã®æçžŸãéã¿ãŠããªã¹ã¹ã¡ã®ææãææ¡ããŠå±ãŸããŠãããããç· åéè¿ã®å®¿é¡ãå¿ããªãããã«æããŠããããããŸãã MCPãµãŒããŒãšã¯ïŒ MCPãšã¯ãModel Context Protocolã®ç¥ã§ã仿µè¡ãã®AIãšãŒãžã§ã³ãã«ç°¡åã«æ©èœã远å ããããã®ãããã³ã«ã§ãã AIãšãŒãžã§ã³ãã«é¢ãã詳ãã説æã¯ä»¥äžã®èšäºãåèã«ããŠãã ããã https://tech-lab.sios.jp/archives/42867 ãããŠããã®MCPãšããããã³ãã«ã«æºæ ããŠäœæããããµãŒããŒãMCPãµãŒããŒã§ãã ã§ã¯ããã®MCPãµãŒããŒã®æ©èœãçè§£ããããã«ããMCPããªãäžçããšãMCPãããäžçããæ¯èŒããŠã¿ãŸãããã MCPããªãäžç MCPããªãäžçã§ã¯ãä»ã®AIãšãŒãžã§ã³ãAã§ãšãŠã圹ç«ã€æ©èœã䜿ã£ãŠãããšããŠããããããAIãšãŒãžã§ã³ãBã§äœ¿ãããšããå ŽåãAIãšãŒãžã§ã³ãBåãã«ãã®æ©èœãå®è£
ãçŽãå¿
èŠããããŸãã ãšããã®ã¯ãä»ãŸã§ã¯LLMã¢ããª(DifyãClaudeãªã©)ã¯ããããç¬èªã®å®è£
æ¹åŒãæã£ãŠããããŸãAIãšãŒãžã§ã³ãã䜿ãããŒã«ãããããç¬èªã®å®è£
æ¹åŒããã£ãŠãããããããã®å®è£
æ¹åŒã«åãããŠãããŒã«ã®æ¹ãæ¹ä¿®ããå¿
èŠããããŸããã äŸãã°AIãšãŒãžã§ã³ãAã§ã¯ã¯ã©ãŠãã¹ãã¬ãŒãžã«ã¢ã¯ã»ã¹ããŠããã¡ã€ã«ã®äžèЧãäžèº«ãååŸããæ©èœããã£ããšããŠããAIãšãŒãžã§ã³ãBã§ã¯ãã®ã¯ã©ãŠãã¹ãã¬ãŒãžã«ã¢ã¯ã»ã¹ããæ¹æ³ãç°ãªã£ãŠããå ŽåãAIãšãŒãžã§ã³ãBåãã«ã¯ã©ãŠãã¹ãã¬ãŒãžã«ã¢ã¯ã»ã¹ããæ©èœãå®è£
ãçŽãå¿
èŠããããŸãã MCPãããäžç MCPãããäžçã§ã¯ãAIãšãŒãžã§ã³ãAã§å®è£
ããæ©èœããã®ãŸãŸAIãšãŒãžã§ã³ãBã§ãå©çšããããšãã§ããŸãããªããªããMCPã«æºæ ããã€ã³ã¿ãŒãã§ãŒã¹ãéããŠãç°ãªãAIãšãŒãžã§ã³ãéã§æ©èœãå
±æã§ããããã§ãã ããã§ã¯ããMCPãµãŒããŒããªãäžçãã§ãããŒã«ããšèšãããŠãããã®ã¯ãMCPãµãŒããŒããšåŒã°ããããã«ãªããŸãããåœç¶ããµãŒããŒããšåŒã°ããããããªã®ã§ãããã«ã©ã¯ã»ã¹ããã¯ã©ã€ã¢ã³ãã§ãããMCPã¯ã©ã€ã¢ã³ãããå¿
èŠã«ãªããŸãã MCPã¯ã©ã€ã³ããšMCPãµãŒããŒãçšæãããã®éã®éä¿¡ãMCPã«æºæ ãããã®ã«ããŠãMCPãµãŒããŒåŽã§ã¯ã€ã³ã¿ãŒããããã¯ã©ãŠãã¹ãã¬ãŒãžãªã©åçš®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããŠãMCPã¯ã©ã€ã¢ã³ãã«çµæãè¿ãããã«ããŸãã ãã®ããã«ããŠãMCPãµãŒããŒãçšæããããšã§ãç°ãªãAIãšãŒãžã§ã³ãéã§æ©èœãå
±æã§ããããã«ãªããŸãã ä»åã®èšäºã§ã¯ãMCPã®è©±ãæ¬çã§ã¯ãªãã®ã§ãMCPã«é¢ãã詳ãã説æã¯å²æããŸããMCPã«é¢ãã詳ãã説æã¯ä»¥äžã®YouTubeãåèã«ããŠãã ããã https://www.youtube.com/live/f7x6flxAfak?si=XDNt7xYWWpaZVHkP Moodleãšã¯ïŒ MoodleïŒã ãŒãã«ïŒã¯ãåŠæ ¡ãäŒæ¥ã®åŠç¿ããªã³ã©ã€ã³ã§éå¶ããããã®ãåŠç¿ç®¡çã·ã¹ãã ïŒLMSïŒãã§ãããªãŒãã³ãœãŒã¹ã§ç¡åå©çšã§ãããã©ãŠã¶ããããã°åè¬ããèª²é¡æåºãæ¡ç¹ãæçžŸç®¡çãŸã§äžéãè¡ããŸãã äž»ãªç»å Žäººç©ã¯ç®¡çè
ã»æåž«ã»åŠç¿è
ã®3ã€ã«ãªããŸãã 管çè
ã¯ãµã€ãããŠãŒã¶ãŒãçµ±æ¬ããããMoodleã®åºæ¬çãªèšå®(æš©é管çãã¡ãŒã«ãµãŒããŒãªã©ã®èšå®)ãè¡ããŸãã æåž«ã¯ã³ãŒã¹ïŒç§ç®ïŒãäœã£ãŠææããã¹ããé
眮ããåŠçãžã®åçš®äŒéã課é¡ã®æåºç®¡çãæ¡ç¹ãè¡ããŸãã åŠç¿è
ã¯åŠçã®ããšã§ãæåž«ããã®æç€ºã«åºã¥ããŠã課é¡ãªã©ã®åè¬ã»æåºã»ç¢ºèªãè¡ããŸãã ãã£ãããããªæµã ãã®MCPãµãŒããŒã®åŠçã®æµãããã£ãã説æããŸãã â èªèšŒ ãŠãŒã¶ãŒãIdPã§èªèšŒããŸãããã®IdPã¯KeyCloakãOktaãªã©ã®OpenID Connectã«å¯Ÿå¿ãããã®ã®å©çšãæ³å®ããŠããŸãã ⡠質å LLMã¢ããªïŒDifyãClaudeãªã©ïŒã§è³ªåããŸãããã®ãšãâ ã§ååŸããIDããŒã¯ã³ãHTTPããã㌠Authorization ã«ã»ããããŠãLLMã¢ããªã«æž¡ããŸãã ⢠ããŒã«ååŸ MCPã®ãããã³ã«ã«åããMCPã¯ã©ã€ã¢ã³ãããMCPãµãŒããŒã«å¯ŸããŠãå©çšå¯èœãªããŒã«ã®äžèЧãååŸããŸãã ⣠ããŒã«éžå® â¢ã§ååŸããããŒã«äžèЧãAzure OpenAI Serviceãªã©ã®LLMã«æž¡ãã質åã«å¯ŸããŠé©åãªããŒã«ãéžå®ããŸãã †ããŒã«è¿åŽ LLMããè¿åŽãããããŒã«ãLLMã¢ããªãåãåããŸãã ⥠ããŒã«åŒã³åºã LLMã¢ããªãMCPã¯ã©ã€ã¢ã³ããéããŠãMCPãµãŒããŒã«å¯ŸããŠããŒã«ãåŒã³åºããŸãããã®ãšããâ¡ã§ååŸããIDããŒã¯ã³ãããšã«ãMCPãµãŒããŒã«å¯ŸããŠããŠãŒã¶ãŒæ
å ±ãæž¡ããŸãã ⊠APIå®è¡ MCPãµãŒããŒã¯ãŠãŒã¶ãŒæ
å ±ãã³ãŒã¹æ
å ±ãªã©ãããšã«ãMoodleã®REST APIãåŒã³åºããŠãå¿
èŠãªæ
å ±ãååŸããŸãã MCPãµãŒããŒã®åºæ¬æ©èœ ä»åäœæããMCPãµãŒããŒã¯ãMoodleã®REST APIãå©çšããŠãMoodleã®æ
å ±ãååŸããæ©èœãæã£ãŠãããŸããå
·äœçã«ã¯ä»¥äžã®æ©èœãæäŸããŠããŸãã â  æçžŸãäœã課é¡ã®ã³ãŒã¹ã«é¢ãããã¡ã€ã«äžèЧãååŸ ãŠãŒã¶ãŒã®å±¥ä¿®ã³ãŒã¹ã®ãã¡ãæçžŸã®åççã äžå®å€ãäžåãã³ãŒã¹ã«æ·»ä»ããããã¡ã€ã«ãåæããŸãã â æªæåºã®èª²é¡ã®ååŸ ãŠãŒã¶ãŒã®æªæåºãšå€å®ããã課é¡ãæ€çŽ¢ããŠè¿ããŸãã â ãŠãŒã¶ãŒã履修ããŠããã³ãŒã¹äžèЧã®ååŸ ãŠãŒã¶ãŒã履修ããŠããã³ãŒã¹ã®äžèЧãååŸããŸãã â ã³ãŒã¹æ€çŽ¢ å
šã³ãŒã¹ããããŒã¯ãŒãæ€çŽ¢ãè¡ããŸãã衚瀺åïŒdisplaynameïŒãæŠèŠïŒsummaryïŒãåºåã«å«ããŸãã â ç· ãåãéè¿ã®èª²é¡ååŸ ãŠãŒã¶ãŒã®æªæåºãšå€å®ããã課é¡ã®ãã¡ãç· ãåããè¿ããã®ãæ€çŽ¢ããŠè¿ããŸãã MCPãµãŒããŒã®è©³çްæ©èœ MCPãµãŒããŒã®ããè©³çŽ°ãªæ©èœã«ã€ããŠèª¬æããŸãã get_resources_under_specific_grade ãŠãŒã¶ãŒã®å±¥ä¿®ã³ãŒã¹ã®ãã¡ãæçžŸã®åççãç°å¢å€æ° COMPLETION_THRESHOLD ãäžåãã³ãŒã¹ã«æ·»ä»ããããã¡ã€ã«ãåæããŸãã ãŠãŒã¶ãŒå㯠REMOTE_USER ç°å¢å€æ°ããŸã㯠X-Remote-User ããããŒãããã㯠ID ããŒã¯ã³ã§æå®ããŸãã get_my_unsubmitted_assignments ãŠãŒã¶ãŒã®æªæåºãšå€å®ããã課é¡ãæ€çŽ¢ããŠè¿ããŸãã課é¡ã®æåºå€å®ã«ã¯ ç°å¢å€æ° mod_assign_get_submission_status ãåªå
å©çšãã ãŠãŒã¶ãŒå㯠REMOTE_USER ç°å¢å€æ°ããŸã㯠X-Remote-User ããããŒãããã㯠ID ããŒã¯ã³ã§æå®ããŸãã get_my_enrolled_courses ãŠãŒã¶ãŒã履修ããŠããã³ãŒã¹äžèЧãè¿ããŸãã ãŠãŒã¶ãŒå㯠REMOTE_USER ç°å¢å€æ°ããŸã㯠X-Remote-User ããããŒãããã㯠ID ããŒã¯ã³ã§æå®ããŸãã find_my_courses_by_keyword(keyword) core_course_search_courses ãå©çšããŠå
šã³ãŒã¹ããããŒã¯ãŒãæ€çŽ¢ãè¡ããŸãã衚瀺åïŒdisplaynameïŒãæŠèŠïŒsummaryïŒãåºåã«å«ããŸãã get_upcoming_deadlines ç°å¢å€æ° UPCOMING_DEADLINES_DAYS æ¥ä»¥å
ã«ç· åãæ¥ã課é¡ãéçŽããŠè¿ããŸãã mod_assign_get_assignments ãåªå
ããŠäœ¿ãã ãã©ãŒã«ããã¯ã§ gradereport ããç· åãæ¢ããŸãã ãŠãŒã¶ãŒå㯠REMOTE_USER ç°å¢å€æ°ããŸã㯠X-Remote-User ããããŒãããã㯠ID ããŒã¯ã³ã§æå®ããŸãã ã·ã¹ãã æ§æ ãã®MCPãµãŒããŒã§æ§æããããšã®åºæ¥ãã·ã¹ãã æ§æã®äŸãããã€ã玹ä»ããŸãã ä¿¡é Œã§ãããããã¯ãŒã¯å
ã«MCPã¯ã©ã€ã³ããšMCPãµãŒããŒãããå Žå ãã®å ŽåãMCPã¯ã©ã€ã¢ã³ããšMCPãµãŒããŒã¯åãä¿¡é Œã§ãããããã¯ãŒã¯å
ã«ãããããã€ãŸãããã®MCPãµãŒããŒã«ã¢ã¯ã»ã¹ã§ããã®ã¯ãLLMã¢ããªã®ã¿ã®ãããHTTPããã㌠X-Remote-User ã䜿ã£ãŠãŠãŒã¶ãŒåãæž¡ãããšãã§ããŸãã åŸè¿°ããIDããŒã¯ã³ã䜿ãå Žåãšæ¯ã¹ãŠãLLMã¢ããªã®å®è£
ãç°¡åã«ãªããŸãã ä¿¡é Œã§ãããããã¯ãŒã¯å€ã«MCPã¯ã©ã€ã³ããšMCPãµãŒããŒãããå Žå ãã®å ŽåãMCPã¯ã©ã€ã¢ã³ããšMCPãµãŒããŒã¯åãä¿¡é Œã§ãããããã¯ãŒã¯å
ã«ã¯ãªããããã€ãŸãããã®MCPãµãŒããŒã«ã¢ã¯ã»ã¹ã§ããã®ã¯ãäžç¹å®å€æ°ã®ãŠãŒã¶ãŒãå©çšããå¯èœæ§ããããããHTTPããã㌠X-Remote-User ã䜿ã£ãŠãŠãŒã¶ãŒåãæž¡ãããšã¯ã§ããŸããã ãã®å ŽåãIDããŒã¯ã³ã䜿ã£ãŠãŠãŒã¶ãŒåãæž¡ãå¿
èŠããããŸããMCPãµãŒããŒã¯IDããŒã¯ã³ãæ€èšŒãããŠãŒã¶ãŒåãååŸããŸãã MCPã¯ã©ã€ã¢ã³ããšMCPãµãŒããŒãåãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒäžã«ããå Žå ãã®å ŽåãMCPã¯ã©ã€ã¢ã³ããšMCPãµãŒããŒã¯åãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒäžã«ãããããéä¿¡æ¹åŒãšããŠSTDIOãçšããŸããç°å¢å€æ° REMOTE_USER ã䜿ã£ãŠãŠãŒã¶ãŒåãæž¡ãããšãã§ããŸãã èµ·åæ¹æ³ ãã®MCPãµãŒããŒã¯Pythonã§äœæãããŠããã pip ã³ãã³ãã§ã€ã³ã¹ããŒã«ããŠå©çšããŸãã äºåæºå 以äžã®ã³ãã³ããå®è¡ããŠãå¿
èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŠãã ããã $ git clone https://hogehoge.git $ cd moodle-mcp-server $ ppip install -r requirements.txt ç°å¢å€æ°ã®èšå® ãã®ãããžã§ã¯ãã¯ç°å¢å€æ°ã§åçš®æåãå¶åŸ¡ããŸãã .env  ãã¡ã€ã«ãäœæããããã·ã§ã«ã®ç°å¢å€æ°ãšããŠèšå®ããŠãã ãããéä¿¡æ¹åŒïŒMCP_TRANSPORTïŒã«ããå¿
èŠãªç°å¢å€æ°ãç°ãªããŸãã å
±é MOODLE_API_URL (å¿
é ): Moodle ãµã€ãã®ããŒã¹ URLïŒäŸ: < https://moodle.example.com >ïŒ MOODLE_WSTOKEN (å¿
é ): Moodle ã® Webservice ããŒã¯ã³ COMPLETION_THRESHOLD (ä»»æ): æçžŸã®ãåççãéŸå€ïŒããã©ã«ã 80ïŒ UPCOMING_DEADLINES_DAYS (ä»»æ): get_upcoming_deadlines ãåç
§ããæ¥æ°ãŠã£ã³ããŠïŒããã©ã«ã 7ïŒ MCP_TRANSPORT (ä»»æ): éä¿¡æ¹åŒã sse ïŒæ¢å®ïŒãŸã㯠stdio SSE ã¢ãŒãïŒMCP_TRANSPORT=sseïŒãããã¯Streamable HTTPã¢ãŒãïŒMCP_TRANSPORT=streamable-httpïŒã§äž»ã«äœ¿çšãã倿° MCP_SERVER_HOST (ä»»æ): ãµãŒãã®ãã€ã³ãã¢ãã¬ã¹ïŒããã©ã«ã 0.0.0.0 ïŒ MCP_SERVER_PORT (ä»»æ): ãµãŒãã®ããŒãïŒããã©ã«ã 8000 ïŒ ACCEPT_REMOTE_USER_HEADERS (ä»»æ): true ã§ X-Remote-User ããããåªå
ïŒããã©ã«ã true ïŒ Bearer ããŒã¯ã³æ€èšŒã䜿ãå Žåã«å¿
èŠ: OIDC_METADATA_URL : OpenID Provider ã®ã¡ã¿ããŒã¿ URLïŒå¿
é ïŒ OIDC_AUDIENCE (ä»»æ): æåŸ
ãã audience OIDC_USERNAME_CLAIM (ä»»æ): ãŠãŒã¶ãŒèå¥åã«äœ¿ãã¯ã¬ãŒã åïŒããã©ã«ã sub ïŒ STDIO ã¢ãŒãïŒMCP_TRANSPORT=stdioïŒã§äœ¿çšãã倿° REMOTE_USER (å¿
é ): å®è¡äžããã»ã¹ã§æ±ã Moodle ã® username 泚æ: ACCEPT_REMOTE_USER_HEADERS ãæå¹ã«ããå Žåã ãªã¢ãŒããããã¯ä¿¡é Œã§ãããããã·ããã®ã¿æž¡ã  ããã«ããŠãã ããã äŸ: `.env` ãã¡ã€ã«ãã³ãã¬ãŒãïŒSSEãããã¯Streamable HTTPïŒ MOODLE_API_URL=https://moodle.example.com MOODLE_WSTOKEN=your_moodle_ws_token COMPLETION_THRESHOLD=80 OIDC_METADATA_URL=https://idp.example.com/.well-known/openid-configuration OIDC_AUDIENCE=your-client-id OIDC_USERNAME_CLAIM=preferred_username ACCEPT_REMOTE_USER_HEADERS=true UPCOMING_DEADLINES_DAYS=7 MCP_TRANSPORT=sse MCP_SERVER_HOST=0.0.0.0 MCP_SERVER_PORT=8000 äŸ: `.env` ãã¡ã€ã«ãã³ãã¬ãŒãïŒSTDIOïŒ MOODLE_API_URL=https://moodle.example.com MOODLE_WSTOKEN=your_moodle_ws_token REMOTE_USER=your-username MCP_TRANSPORT=stdio èµ·å 以äžã®ã³ãã³ããå®è¡ããŠãMCPãµãŒããŒãèµ·åããŸãã $ python moodle_mcpserver.py åäœç¢ºèª MCP InspectorãšããããŒã«ã䜿ããšç°¡åã«åäœç¢ºèªãã§ããŸããMCP Inspectorã¯MCPãµãŒããŒã«å¯ŸããŠãMCPã®ãããã³ã«ã«åã£ãéä¿¡ãè¡ãããšãã§ããããŒã«ã§ããåäœããããã«ã¯Node.jsã®ç°å¢ãå¿
èŠã§ãã 以äžã®ã³ãã³ãã§MCP Inspectorãèµ·åããŸãã $ npx @modelcontextprotocol/inspector STDIOã§åäœç¢ºèªããå Žå ãŸãåºæ¬çãªèšå®ãè¡ããŸãã â Transportã§ `stdio` ãéžæããŸãã â¡ Commandã« `python ` ãéžæããŸãã ⢠Commandã«moodle_mcp_server.pyã®ãã¹ãå
¥åããŸãã ⣠`MOODLE_API_URL` ã `MOODLE_WSTOKEN` ã `REMOTE_USER` ã®ç°å¢å€æ°ãèšå®ããŸãã MCPãµãŒããŒã«æ¥ç¶ããŸãã `Connect` ãã¿ã³ãæŒããŸãã ã ããŒã«ã®äžèЧãååŸããŠå®è¡ããŸãã `Tools` ã¿ããéžæã(â )ã `List Tools` ãã¿ã³ãæŒããŸã(â¡)ãããŒã«ã®äžèЧãååŸãããŸã(â¢)ãããŒã«ãéžãã§ã `Run Tool` ãã¿ã³ãæŒããšãããŒã«ãå®è¡ãããŸã(â£)ã ã ããŒã«ã®å®è¡ã«æåãããšã以äžã®ããã«çµæã衚瀺ãããŸãã Stremable HTTPãããã¯SSEã§åäœç¢ºèªããå Žå ãŸãåºæ¬çãªèšå®ãè¡ããŸãã â Transport Typeã¯ã `Streamable HTTP` ããã㯠`sse` ãéžæããŸãã â¡ Transport Typeã `Streamable HTTP` ã®å Žåã `http://[MCPãµãŒããŒã®ãã¹ãå]/mcp` ãå
¥åããŸããTransport Typeã `sse` ã®å Žåã `http://[MCPãµãŒããŒã®ãã¹ãå]/sse` ãå
¥åããŸãã ⢠HTTPãããã远å ããŸãã `ACCEPT_REMOTE_USER_HEADERS` ã `true` ã«èšå®ããŠããå Žåã `X-Remote-User` ããããŒã远å ããŸããIDããŒã¯ã³ã䜿ãå Žåã `Authorization` ããããŒã远å ããŸããäž¡æ¹ãšãå€ã¯Moodleã®ãŠãŒã¶ãŒåã§ãã †`Connect` ãã¿ã³ãæŒããŸãã åŸã®æé ã¯ãSTDIOã§åäœç¢ºèªããå Žåãšåæ§ã§ãã ããå®è·µçãªã·ã¹ãã ãæ§ç¯ ç°¡åãªåäœç¢ºèªãåºæ¥ããšããã§ããã®MCPãµãŒããŒãåããããã®ãããå®è·µçãªã·ã¹ãã ãæ§ç¯ããŠã¿ãŸãããã以äžã®å³ããã®ã·ã¹ãã æ§æã§ãã LLM ã¢ããªãšã㊠Dify ãå©çšããŸããDify 㯠MCP ã«å¯Ÿå¿ããŠãããããMCP ã¯ã©ã€ã¢ã³ããšããŠåäœããŸãã Dify èªäœã«ã¯èªèšŒæ©èœããªããããå¥éãã£ãã UI ãæäŸããã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãçšæããŸããããã§ã¯ Streamlit ãå©çšããŸããStreamlit 㯠OpenID Connect ã«å¯Ÿå¿ããŠãããããKeyCloak ã§ãŠãŒã¶ãŒãèªèšŒããåŸã« ID ããŒã¯ã³ãååŸã§ããŸãã ãŠãŒã¶ãŒãèªèšŒãçµãããšãååŸãã ID ããŒã¯ã³ã Streamlit ã«æž¡ãããStreamlit åŽã§ããŒã¯ã³ã®æ€èšŒãè¡ããMoodle ã®ãŠãŒã¶ãŒåãååŸããŸãããã®ããã§ Streamlit ãã Dify ã«å¯Ÿã㊠API ãåŒã³åºããŸããDify ã¯å
¬é API ãæäŸããŠãããããã«è³ªåãéãããšã§åçãåŸãããšãã§ããŸãããã®éãID ããŒã¯ã³ããååŸãããŠãŒã¶ãŒåã API ã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšã§ãDify ããŠãŒã¶ãŒåãèªèã§ããããã«ããŸãã Dify 㯠MCP ã¯ã©ã€ã¢ã³ããšããŠãMCP ãµãŒããŒã«å¯Ÿã㊠Moodle ã®æ
å ±ãååŸããããã®ããŒã«äžèЧã®ååŸãããŒã«å®è¡ãè¡ããŸããããããå
㯠MCP ã®ãããã³ã«ã«åŸã£ãŠéä¿¡ãé²ã¿ãŸãã ã§ã¯æ§ç¯æé ã説æããŠãããŸãã KeyCloakã®èšå® ã¯ã©ã€ã¢ã³ããäœæããããã«ãKeyCloakã®ç®¡çã³ã³ãœãŒã«ã«ãã°ã€ã³ãã `Clients` ã¡ãã¥ãŒããã `Create client` ãã¿ã³ãæŒããŸãã ã `Client ID` ã«ä»»æã®åç§°ãå
¥åãã `Next` ãã¿ã³ãæŒããŸãã ã `Client authentication` ã `ON` (â )ã `Authorization` ã `OFF` (â¡)ã«ããŠã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããã«ããèªèšŒãæå¹ã«ããŸããèªå¯ã³ãŒããããŒã«å¯Ÿå¿ããããã«ã `Standrd flow` ã«ãã§ãã¯ãå
¥ããŸã(â¢)ãæåŸã« `Next` ãã¿ã³ãæŒããŸã(â£)ã ã Valid redirect URIsã« `http[s]://[Streamlitã®ãã¹ãå]/oauth2callback` ãå
¥åã(â )ã `Save` ãã¿ã³ãæŒããŸã(â¡)ã ã ã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããã確èªããããã«ã `Credentials` ã¿ããéžæããŸã(â )ã `Secret` ã®å€ãæ§ããŠãããŸã(â¡)ãåŸã§Streamlitã®èšå®ã§å©çšããŸãã Streamlitã®èšå® Streamlitã§ã¯ãKeyCloakãªã©ã®OpenID Connectã«å¯Ÿå¿ããIdPãå©çšããŠããŠãŒã¶ãŒèªèšŒãè¡ããDifyã®APIãåŒã³åºãå¿
èŠããããŸãããã®ã¢ããªã±ãŒã·ã§ã³ã¯ã以äžã®GitHubãªããžããªã§å
¬éããŠããŸãã®ã§ãCloneããŠå©çšããŠãã ããã https://github.com/ntakei-sti/streamlit4dify CloneãããããŸãã `.env` ã以äžã®ããã«èšå®ããŸãã `DIFY_API_URL` ã¯Difyã®APIãšã³ããã€ã³ããæå®ããŸãã `DIFY_API_KEY` ã¯Difyã®APIããŒãæå®ããŸãã `OIDC_USERNAME_CLAIM` ã¯KeyCloakã®ãŠãŒã¶ãŒåã«å¯Ÿå¿ããã¯ã¬ãŒã åãæå®ããŸããKeyCloakã®ããã©ã«ãã§ã¯ `preferred_username` ã§ãããç°å¢ã«ãã£ãŠç°ãªãå ŽåããããŸãã®ã§ãé©å®å€æŽããŠãã ããã DIFY_API_URL=http[s]://<Difyã®ãã¹ãå>/v1/chat-messages DIFY_API_KEY=<Difyã®APIããŒ> OIDC_USERNAME_CLAIM=<KeyCloakã®ãŠãŒã¶ãŒåã«å¯Ÿå¿ããã¯ã¬ãŒã å>  次ã«ã `secrets.toml` ã以äžã®ããã«èšå®ããŸãã `redirect_uri` ã¯KeyCloakã®ã¯ã©ã€ã¢ã³ãèšå®ã§æå®ãã `Valid redirect URIs` ãæå®ããŸãã `cookie_secret` ã¯ä»»æã®æååãæå®ããŸãã `client_id` ã¯KeyCloakã®ã¯ã©ã€ã¢ã³ãIDãæå®ããŸãã `client_secret` ã¯KeyCloakã®ã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ãããæå®ããŸãã `server_metadata_url` ã¯KeyCloakã®ã¡ã¿ããŒã¿URLãæå®ããŸãã [auth] redirect_uri = "http[s]://<Streamlitã®ãã¹ãå>/oauth2callback" cookie_secret = "<ä»»æã®æåå>" client_id = "<KeyCloakã®ã¯ã©ã€ã¢ã³ãID>" client_secret = "<KeyCloakã®ã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ãã>" server_metadata_url = "http[s]://<KeyCloakã®ãã¹ãå>/realms/<ã¬ã«ã å>/.well-known/openid-configuration"  Streamlitã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã $ streamlit run app.py Difyèšå® ãŸããDifyã®ããŒã±ãããã¬ã€ã¹ããMCPãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸããDifyã®ç®¡çã³ã³ãœãŒã«ã«ãã°ã€ã³ãã `Plugins` ã¡ãã¥ãŒããã `Agent Strategies` ã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãã ã ãããŠãã¯ãŒã¯ãããŒå
ã§MCPãã©ã°ã€ã³ãå©çšããããã«èšå®ããŸãã `Agent` ãšãããããã¯ã远å åºæ¥ãããã«ãªã£ãŠããã®ã§ããããã¯ãŒã¯ãããŒã«è¿œå ããŸãã ã `Agentic Strategy` 㯠`Function Calling (Support MCP Tools)` ãéžæããŸã(â )ã `MCP SERVERS CONFIG` ã¯ã以äžã®ããã«èšå®ããŸã(â¡)ã {  "server_name1": {  "transport": "sse", "headers": { "X-Remote-User": 🏡Start/{x}sys.user_id }, "url": "http[s]://<MCPãµãŒããŒã®ãã¹ãå>/sse" } } ã `INSTRUCTIONS` ã¯ä»¥äžã®ããã«èšå®ããŸã(â¢)ããã®ã·ã¹ãã ã¡ãã»ãŒãžãå®çŸ©ããããšã«ããããŠãŒã¶ãŒã®åŒ±æ°ãªçºèšãæŸã£ãŠãMoodleã®æ
å ±ãååŸããŠãåªããå±ãŸãããšãã§ããŸãã ããªãã¯moodleããããããªæ
å ±ãååŸããè³¢ããšãŒãžã§ã³ãã§ãã ãŠãŒã¶ãŒãããæçžŸãåºãªããŠå°ã£ãããªã©ã®é¡ã®åŒ±æ°ãªè¶£æšã®è³ªåãããå Žåã«ã¯ãããŒã«get_resources_under_specific_gradeãåŒãã§ãã ããããã®åçã¯ãæçžŸãæãããç¡ãã³ãŒã¹ã®è³æã§ãã®ã§ããããã®è³æãåªããææ¡ããŠãããŠãã ããã MCPãµãŒããŒã®èšå® MCPãµãŒããŒãèµ·åããŸããèµ·åããããã®ç°å¢å€æ°ã®èª¬æã¯èª¬ææžã¿ã§ãã®ã§å²æããŸããä»åã®æ§æã§ã¯ãéä¿¡æ¹åŒãSSEãMCPãµãŒããŒã¯Difyããã®ã¿ã¢ã¯ã»ã¹ãããããšãåæãšããŠã `ACCEPT_REMOTE_USER_HEADERS` ã `true` ã«èšå®ããŸãã以äžã¯ `.env` ãã¡ã€ã«ã®äŸã§ãã MOODLE_API_URL=<Moodleã®URL> MOODLE_WSTOKEN=<Moodleã®WebãµãŒãã¹ã®ããŒã¯ã³> COMPLETION_THRESHOLD=80 MCP_TRANSPORT=sse ACCEPT_REMOTE_USER_HEADERS=true MCPãµãŒããŒãèµ·åããŸãã $ python moodle_mcp_server.py åäœç¢ºèª Streamlitã®ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŸããKeyCloakã®ãã°ã€ã³ç»é¢ã衚瀺ãããã®ã§ããŠãŒã¶ãŒåãšãã¹ã¯ãŒããå
¥åããŠãã°ã€ã³ããŸãã ã KeyCloakã®ãã°ã€ã³ç»é¢ã衚瀺ãããã®ã§ããŠãŒã¶ãŒåãšãã¹ã¯ãŒããå
¥åããŠãã°ã€ã³ããŸãã ã ãã°ã€ã³ã«æåãããšããã£ããç»é¢ã衚瀺ãããŸãããã£ããç»é¢ã§è³ªåãå
¥åããŠã `Send` ãã¿ã³ãæŒããŸãã ãŸãšã ãããã§ããã§ããããïŒååŠã«å±ãåŠçãåªããå
ãAIã£ãŠçŽ æµã§ããããšãã«å³ããããããŠç¹ã«åªãããåŠçãæ¯ããMoodle察å¿ã®MCPãµãŒããŒããã²ã掻çšãã ããã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post çæAIã®åŠè¡å©çšãå éãã!!ååŠã«å±ãåŠçãåªãããµããŒãããMoodle察å¿ã®MCPãµãŒããŒãäœããŸãã!! first appeared on SIOS Tech. Lab .
ã¯ããã« ååã®èšäºã§ã¯ãGitLabãšOpenShiftãGatekeeperãçµã¿åãããDevSecOpsã¢ãã«ã±ãŒã¹ç°å¢ã®æ§ç¯æ¹æ³ã玹ä»ããŸããã æ¬èšäºã§ã¯ãããããçµã¿åãããŠéåç°å¢ã«ãããDevSecOpsã¢ãã«ã±ãŒã¹ãæ§ç¯ãããã¢ã¢ããªã䜿ã£ãŠCI/CDã®æµãã«ã»ãã¥ãªãã£ãã©ã®ããã«çµã¿èŸŒãŸããã®ãã確èªããŸãã éèãå
Œ
±åéãªã©é«ãã»ãã¥ãªãã£èŠä»¶ãæ±ããããã·ã¹ãã ã§ã¯ãã€ã³ã¿ãŒããã鿥ç¶ã®ç°å¢ã§ãã£ãŠããéçºã®ã¹ããŒããšå®å
šæ§ãäž¡ç«ããããšãæ±ããããŸãã GitLabãšGatekeeperãæŽ»çšããããšã§ããã®èª²é¡ãã©ã®ããã«è§£æ±ºã§ããã®ããå
·äœçã«ç€ºãã®ãä»åã®ç®çã§ãã DevSecOpsãšã¯ãDevOpsã®è¿
éãªéçºã»éçšããã»ã¹ã«ãã»ãã¥ãªãã£ããçµã¿èŸŒã¿ãã¹ããŒããšå®å
šæ§ãäž¡ç«ãããææ³ã§ããåŸæ¥ã¯ãéçºãå®äºããåŸã«ã»ãã¥ãªãã£ãã§ãã¯ãè¡ããããšãäžè¬çã§ãããããããã®æ¹æ³ã§ã¯ãæçµæ®µéã§è匱æ§ãèŠã€ãã£ãéã«å€§ããªä¿®æ£ãå¿
èŠãšãªããæéãã³ã¹ãã®å¢å€§ããªãªãŒã¹ã®é
å»¶ãæããŠããŸããŸãã DevSecOpsã§ã¯ãéçºã©ã€ããµã€ã¯ã«ã®å段éã«ã»ãã¥ãªãã£ãçµ±åããããšã§ãæ©ã段éãããªã¹ã¯ãæ€ç¥ããå°èŠæš¡ãªä¿®æ£ã§å¯ŸåŠã§ããŸãããã®çµæãéçºã®ã¹ããŒããç¶æããªãããã³ã¹ãåæžãšå®å
šæ§ã®åäžãåæã«å®çŸã§ããŸãã DevSecOpsã¯ãäžå³ã®ããã«éçºïŒDevïŒãšéçšïŒOpsïŒã®ã©ã€ããµã€ã¯ã«ã«ã»ãã¥ãªãã£ïŒSecïŒãçµã¿èŸŒãèãæ¹ã§ãã DevSecOpsã®è©³çްã«ã€ããŠã¯ä»¥äžã®èšäºã§è§£èª¬ããŠããŸãã®ã§ããåç
§ãã ããã DevSecOpsãšã¯ïŒå®å
šæ§ãšã¹ããŒããäž¡ç«ããéçºææ³ | SIOS Tech. Lab æ¬èšäºã®ãã¢ã¯ã以äžã®æµãã§é²ããŸãã ãŽãŒã« æ¬èšäºã®ãŽãŒã«ã¯æ¬¡ã®ãšããã§ãã DevSecOpsã®ã©ã€ããµã€ã¯ã«ãå®éã®CI/CDãã€ãã©ã€ã³ãéããŠçè§£ãã GitLabãšGatekeeperãçµã¿åãããã»ãã¥ãªãã£çµ±å¶ã®ä»çµã¿ãææ¡ãã åææ¡ä»¶ æ¬èšäºã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã¯ã以äžã®ç°å¢ãåæãšããŠããŸãã GitLab ãµãŒããŒïŒãœãŒã¹ã³ãŒã管çã»CI/CDå®è¡ïŒ OpenShift ã¯ã©ã¹ã¿ãŒïŒéåç°å¢ã«ãŠæ§ç¯æžã¿ãã¢ããªã±ãŒã·ã§ã³å®è¡ç°å¢ïŒ GitLab RunnerïŒOpenShift å
ã«ãããã€æžã¿ïŒ GatekeeperïŒOpenShift å
ã«ãããã€æžã¿ããªãœãŒã¹äœæèš±å¯ããªã·ãŒãå®çŸ©æžã¿ïŒ èžã¿å°ãµãŒããŒïŒã¯ã©ã¹ã¿ãŒãžã®ã¢ã¯ã»ã¹çšïŒ ãããã¯ååã®èšäºã æ§ç¯ç·š ãã§æ§ç¯ããã¢ãã«ã±ãŒã¹ç°å¢ã«å«ãŸããŠããŸãã æ§ç¯æé ã®è©³çްã¯ãæ§ç¯ç·šããåç
§ããŠãã ããã ãã¢ã¢ããªã®ä»æ§ ããŒã¹ã€ã¡ãŒãžïŒnginx ãµãŒãã¹æäŸããŒãïŒ8080 å°éæ§ïŒå
éšãããã¯ãŒã¯ã®ã¿ã¢ã¯ã»ã¹å¯èœïŒå€éšå
¬éãªãïŒ ãããã€æ¹åŒïŒHelmïŒChartã»valuesã§ã€ã¡ãŒãžã¿ã°ãåãæ¿ãïŒ ãã¢ã§äœ¿çšããã¿ã°ïŒv1.0ïŒååãããã€ïŒãv1.1ïŒä¿®æ£ãããã€ïŒ ãã€ãã©ã€ã³ã®å®è¡ãã㌠ä»åå©çšããCI/CDãã€ãã©ã€ã³ã®å®è¡ãããŒã¯ä»¥äžã®éãã§ãã ãã«ãçšãã€ãã©ã€ã³å®è¡ãã㌠éçºè
ãGitLabã®ãã«ãçšãããžã§ã¯ãã«ãã©ã³ããããŒãž ããŒãžãããªã¬ãŒãšããŠãGitLab CI/CDãã€ãã©ã€ã³ãèµ·å GitLab CI/CDããOpenShiftã¯ã©ã¹ã¿ãŒå
ã®GitLab Runnerãžãã«ããžã§ãå®è¡ãªã¯ãšã¹ããéä¿¡ Runnerããžã§ãPodãèµ·å ãžã§ãPodããã«ãçšãããžã§ã¯ãããã¢ããªã®ãœãŒã¹ã³ãŒããClone ãžã§ãPodãdocker CLIãªã©ãå©çšããŠã³ã³ããã€ã¡ãŒãžããã«ã ãžã§ãPodããã«ãããã€ã¡ãŒãžãGitLabã®ãã«ãçšãããžã§ã¯ãå
ã®ã¬ãžã¹ããªã«push ãããã€çšãã€ãã©ã€ã³å®è¡ãã㌠éçºè
ãGitLabã®ãããã€çšãããžã§ã¯ãã«ãã©ã³ããããŒãž ããŒãžãããªã¬ãŒãšããŠãGitLab CI/CDãã€ãã©ã€ã³ãèµ·å GitLab CI/CDããOpenShiftã¯ã©ã¹ã¿ãŒå
ã®GitLab Runnerãžãããã€ãžã§ãå®è¡ãªã¯ãšã¹ããéä¿¡ Runnerããžã§ãPodãèµ·å ãžã§ãPodãOpenShiftã®APIãµãŒããŒã«å¯ŸãããªãœãŒã¹ã®ãããã€ãªã¯ãšã¹ããéä¿¡ APIãµãŒããŒãGitLabã®ã¬ãžã¹ããªããã¢ããªã®ã€ã¡ãŒãžãpull APIãµãŒããŒãOpenShiftã¯ã©ã¹ã¿ãŒå
ã«ã¢ããªãããã〠DevSecOpsã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ ããããã¯ãæ§ç¯æžã¿ã®ã¢ãã«ã±ãŒã¹ç°å¢ã䜿ã£ãŠãå®éã«DevSecOpsã®æµãã確èªããŸãã 以äžã®ããã«ãã¢ããªã®ãããã€ã2åç¹°ãè¿ããæåŸã«Gatekeeperã«ããå¶åŸ¡ãäœéšããŸãã ã¢ããªã®ååã¢ããããŒãïŒv1.0 ãããã€ïŒ ã¢ããªãä¿®æ£ããŠå床ãããã€ïŒv1.1 ãããã€ïŒ Gatekeeperã«ããäžæ£ãªãœãŒã¹äœæã®æåŠ ã¢ããªã±ãŒã·ã§ã³ã®ååããã〠ããããã¯ãDevSecOpsã©ã€ããµã€ã¯ã«ã®Code â OperateïŒ1é±ç®ïŒã«å¯Ÿå¿ããŸãã ãŸããã¢ããªã®ååãããã€ãè¡ããŸãã ã³ãŒãã ãã«ãçšãããžã§ã¯ã ã®featureãã©ã³ãã«pushããdevelopãã©ã³ããžããŒãžããŸãã developãã©ã³ãã«ããŒãžãããšãã³ã³ããã€ã¡ãŒãžããã«ããããã€ãã©ã€ã³ãèµ·åããŸãã ãã®æäœã«ãã£ãŠãéçºçšã®ã€ã¡ãŒãžïŒdev-v1.0ïŒããã«ããããŸãã ç¶ããŠã ãããã€çšãããžã§ã¯ã ã®featureãã©ã³ããdevelop ãã©ã³ããžããŒãžããŸãã ããã«ãããå
ã»ã©ãã«ããããv1.0ã€ã¡ãŒãžãå©çšããŠãéçºçšNamespaceã«ã¢ããªããããã€ãããŸãã $ oc get pod -n devsecops-develop -l app="nginx" NAME                READY  STATUS  RESTARTS  AGE nginx-deployment-5d75b659c5-cqbqp  1/1   Running  0     118s åäœç¢ºèªãå®äºãããããã«ãçšãããžã§ã¯ãã®developãã©ã³ãããmainãã©ã³ããžã®ããŒãžãªã¯ãšã¹ããäœæããæ¿èªåŸã«ããŒãžããŸãã mainãã©ã³ãã«ããŒãžãããšããã€ãã©ã€ã³ãèµ·åããprod-v1.0ã€ã¡ãŒãžãã¬ãžã¹ããªã«æ ŒçŽãããŸãã æ¬¡ã«ãããã€çšãããžã§ã¯ãã§developãã©ã³ããmainãã©ã³ãã«ããŒãžãããšããã€ãã©ã€ã³ãèµ·åããæ¬çªç°å¢çšã®ããŒã ã¹ããŒã¹ã«ã¢ããªããããã€ããŸãã ãã®çµæãæ¬çªç°å¢ã«ã¢ããªããããã€ããã衚瀺å
容ã確èªã§ããã°ã Code â Operate ã®1é±ç®ïŒv1.0ïŒãå®äº ã§ãã $ oc get pod -n devsecops-production -l app="nginx" NAME                READY  STATUS  RESTARTS  AGE nginx-deployment-6c49676b47-m96pf  1/1   Running  0     29s nginx-deployment-6c49676b47-pzv96  1/1   Running  0     29s ã¢ããªã±ãŒã·ã§ã³ãä¿®æ£ããŠå床ããã〠ããããã¯ãDevSecOpsã©ã€ããµã€ã¯ã«ã®Code â OperateïŒ2é±ç®ïŒã«å¯Ÿå¿ããŸãã ã¢ããªãä¿®æ£ããŸããããã§ã¯index.htmlã®å
å®¹ãæŽæ°ããããããŠ.gitlab-ci.ymlã§å®çŸ©ããŠããã³ã³ããã€ã¡ãŒãžã®ã¿ã°ãv1.1ã«å€æŽããŸãã æ¬¡ã«ã ãã«ãçšãããžã§ã¯ã ã®featureãã©ã³ãã«pushããdevelopãã©ã³ããžããŒãžããŸãã ãã®æäœã«ãã£ãŠãæ°ããéçºçšã€ã¡ãŒãžïŒv1.1ïŒããã«ããããŸãã ç¶ããŠã ãããã€çšãããžã§ã¯ã ã®featureãã©ã³ãã§Config/develop-values.yamlãš Config/product-values.yamlã®tagãä¿®æ£ããåæ ããŸãããã®åŸãåæ§ã«developãã©ã³ã ãžããŒãžããŠå€æŽãé©çšããŸãã ããã«ãããå
ã»ã©ãã«ããããv1.1ã€ã¡ãŒãžãå©çšããŠãéçºçšNamespaceã«ã¢ããªããããã€ãããŸãã $ oc describe pod -n devsecops-develop nginx-deployment-54d94596b6-8j8w6 | grep "Image:"     Image:     registry.gitlab.local.example.com/devsecops-user/devsecops-build-project/nginx:dev-v1.1 åäœç¢ºèªãå®äºããããdevelopãã©ã³ãããmainãã©ã³ããžã®ããŒãžãªã¯ãšã¹ããäœæããæ¿èªåŸã«ããŒãžããŸãã ãã®çµæãæ¬çªç°å¢ã«ä¿®æ£çã¢ããªããããã€ããã衚瀺å
å®¹ãæŽæ°ãããŠããããšã確èªã§ããŸãã $ oc describe pod -n devsecops-production nginx-deployment-59ddc6dbb6-lhd6b | grep "Image:"     Image:     registry.gitlab.local.example.com/devsecops-user/devsecops-build-project/nginx:prod-v1.1 ãã®æç¹ã§ã Code â Operate ã®2é±ç®ïŒv1.1ïŒãå®äº ã§ãã Gatekeeperã«ããäžæ£ãªãœãŒã¹ã®æ€ç¥ã»æåŠ ããããã¯ãDevSecOpsã©ã€ããµã€ã¯ã«ã®Secã«å¯Ÿå¿ããŸãã æåŸã«ããããŠäžæ£ãªèšå®ãæã€ãªãœãŒã¹ãNamespaceã«ãããã€ããŠã¿ãŸãã Gatekeeperã®ããªã·ãŒèšå®ã§ã envã©ãã«ã®å€ããããã€å
ã®namespaceåãšäžèŽããŠããªããšPodã®äœæãèš±å¯ããªã å¶çŽ ãèšå®ããŠããŸãã 以äžã®ããã«ã ãããã€çšãããžã§ã¯ã ã§deploymentã®labelsã§envã©ãã«ãäžæ£ãªå€ã«æžãæããä¿®æ£ãè¡ããdevelopãã©ã³ãã«ããŒãžããŸãã ãã®ãšãGatekeeperã®ããªã·ãŒãåããäžæ£ãªãªãœãŒã¹ã®äœæã¯æåŠãããŸãã å®éã®ãã°ãã€ãã³ãã確èªãããšãConstraint ã«ãã£ãŠéåãæ€åºãããPodã®ãããã€ã倱æããŠããããšãåãããŸãã  äžçªäžã®ReplicaSetã¯Desired 1ã«å¯ŸããŠãCurrentã0ã§ãããPodããããã€ãããŠããªãããšãããããŸãã $ oc get replicasets.apps -n devsecops-develop NAME             DESIRED  CURRENT  READY  AGE nginx-deployment-54d94596b6  1     1     1    20m nginx-deployment-5d75b659c5  0     0     0    14h nginx-deployment-6bfd599796  1     0     0    3m48s Podããããã€ãããŠããªãReplicaSetã®ã€ãã³ãã確èªãããšãGatekeeperã® å¶çŽãã³ãã¬ãŒã ã§èšå®ãããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŠããããšãããããŸãã $ oc describe replicasets.apps -n devsecops-develop nginx-deployment-6bfd599796 Events:   Type   Reason    Age         From          Message   ----   ------    ----        ----          -------   Warning FailedCreate 4m13s        replicaset-controller Error creating: admission webhook "validation.gatekeeper.sh" denied the request: [require-env-label-match-namespace] Pod 'nginx-deployment-6bfd599796-z7hgf' ã® 'env' ã©ãã«ã®å€ã¯ãNamespaceå 'devsecops-develop' ãšäžèŽããå¿
èŠããããŸããçŸåšã®å€ã¯ 'dummy-env' ã§ãã ãã®ããã«ã éçºè
ãæèããªããŠãããªã·ãŒéåãèªåçã«ãããã¯ããã ããšã§ãã»ãã¥ãªãã£ãç ç²ã«ããã« CI/CD ã®ã¹ããŒããç¶æã§ããããšãäœéšã§ããŸãã ãŸãšã æ¬èšäºã§ã¯ãGitLabãOpenShiftãGatekeeperãçµã¿åãããŠéåç°å¢ã«DevSecOpsã¢ãã«ã±ãŒã¹ãæ§ç¯ãããã¢ã¢ããªãçšããŠä»¥äžã®æµãã確èªããŸããã GitLab CI/CDã«ããã¢ããªã±ãŒã·ã§ã³ãããã€ã®èªåå  ã³ãŒã倿Žããã®ç¶ç¶çããªããªãŒÂ  Gatekeeperããªã·ãŒã«ããã»ãã¥ãªãã£æ
ä¿Â  ãã®ãã¢ãéããŠã次ã®ãã€ã³ããæŒãããããšãã§ããŸããã DevOpsã ãã§ã¯äžåå éçºãµã€ã¯ã«ãè¿
éåããŠããäžæ£ãªãªãœãŒã¹ãèšå®ãæ··å
¥ããã°å®å
šæ§ã¯æãªãããã ããªã·ãŒå¶åŸ¡ã®ä»çµã¿ãéèŠ Gatekeeperãçšããããšã§ãéçºã®åææ®µéããäžæ£ãªãªãœãŒã¹ãèªåçã«æé€ã§ããã GitLabãšOpenShiftã®çµ±åã¯å®çšç ã€ã³ã¿ãŒããã鿥ç¶ã®éåç°å¢ã§ãåçŸå¯èœã§ãããéèã»å
Œ
±åéãå«ã宿¡ä»¶ã«ãå¿çšã§ããã ããã«å®ç°å¢ã§ã®å©çšãèãããªããã³ã³ããã€ã¡ãŒãžã®ã»ãã¥ãªãã£ã¹ãã£ã³ããããè€éãªããªã·ãŒå¶åŸ¡ãçµã¿åãããããšã§ããã匷åºãªDevSecOpsãå®çŸã§ããŸãã ãŸãã¯å°èŠæš¡ãªã¢ãã«ã±ãŒã¹ãã詊ããåŸã
ã«èªç€Ÿã®ç°å¢ãèŠä»¶ã«åãããŠæ¡åŒµããŠããããšãããããããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post DevSecOpså®è·µã¬ã€ãïŒã»ãã¥ã¢ãªCI/CDéçšã®å®è·µç·š first appeared on SIOS Tech. Lab .
ã¯ããã« ååãŸã§ã«ãGitLabãšOpenShiftãGatekeeperãéåç°å¢ã§æ§ç¯ããæé ã玹ä»ããŸããã æ¬èšäºã§ã¯ããã®ç°å¢ãåºç€ãšããŠGitLabã®ãããžã§ã¯ãäœæãèšå®ã远å ããCI/CDãã€ãã©ã€ã³ãšããªã·ãŒæ€èšŒãçµã¿åãããDevSecOpsã®å®è·µäŸã«åããç°å¢æ§ç¯ãè¡ããŸãã ç¹ã«ãéèãå
Œ
±åéã®ããã«é«ãã»ãã¥ãªãã£èŠä»¶ãæ±ããããã·ã¹ãã ã§ã¯ãã€ã³ã¿ãŒããã鿥ç¶ç°å¢ã§ã®éçºã»éçšãåæãšãªãã±ãŒã¹ãå€ããããŸããæ¬èšäºã§åãäžããæ§æã¯ãããããå¶çŽäžã§ãæå¹ãªå®è·µäŸãšãªããŸãã ãªããæ¬èšäºã§ã¯æ§ç¯ã®å
šæé ãç¶²çŸ
ããã®ã§ã¯ãªããã¢ãã«ã±ãŒã¹ã®å
šäœåãšäž»èŠãªæ§æèŠçŽ ãäžå¿ã«è§£èª¬ããŸãã詳现ãªèšå®å€ãã³ãŒãã«ã€ããŠã¯ã ãã¡ãã®ãªããžã㪠ããåç
§ãã ããã ãŽãŒã« GitLabã«ãã«ãçšã»ãããã€çšãããžã§ã¯ããäœæãã OpenShiftã®Namespaceãæš©éãèšå®ãã Gatekeeperã®ããªã·ãŒãé©çšããCI/CDãã€ãã©ã€ã³å®è¡æã«ããªã·ãŒéåãæ€ç¥ã§ããããã«ãã æ¬¡åã®ãã¢å®æŒã«åããåºç€ã宿ããã DevSecOpsãšã¯ïŒ DevSecOpsãšã¯ãDevOpsã®è¿
éãªéçºã»éçšããã»ã¹ã«ã»ãã¥ãªãã£ãçµ±åããããšã§ãã¹ããŒããšå®å
šæ§ãäž¡ç«ããææ³ã§ãã åŸæ¥ã®ãéçºã®åŸã«ã»ãã¥ãªãã£ãã§ãã¯ãè¡ããã¢ãããŒãã§ã¯ãªããéçºã©ã€ããµã€ã¯ã«ã®å段éã«ã»ãã¥ãªãã£ãçµã¿èŸŒãç¹ãç¹åŸŽã§ãã 詳现ã«ã€ããŠã¯ä»¥äžã®èšäºã§è§£èª¬ããŠããŸãã®ã§ããåç
§ãã ããã DevSecOpsãšã¯ïŒå®å
šæ§ãšã¹ããŒããäž¡ç«ããéçºææ³ | SIOS Tech. Lab åææ¡ä»¶ 以äžã®èšäºã®æé ã«åŸã£ãŠãç°å¢æ§ç¯ãå®äºããŠããããš GitLabãšã³ã³ãããã©ãããã©ãŒã ã®é£æº | SIOS Tech. Lab OPA/Gatekeeperã§å§ããå®å¿OpenShiftéçšïŒæ§ç¯ç·š ãã¢ã¢ããªã®ä»æ§ ããŒã¹ã€ã¡ãŒãžïŒnginx ãµãŒãã¹æäŸããŒãïŒ8080 å°éæ§ïŒå
éšãããã¯ãŒã¯ã®ã¿ã¢ã¯ã»ã¹å¯èœïŒå€éšå
¬éãªãïŒ ãããã€æ¹åŒïŒHelmïŒChartã»valuesã§ã€ã¡ãŒãžã¿ã°ãåãæ¿ãïŒ ãµã³ãã«æ§æã®å
šäœå ãããžã§ã¯ãã®å岿¹é devsecops-build-projectïŒãã«ãçšïŒ ãœãŒã¹ã³ãŒããšDockerfileã管çããã€ã¡ãŒãžããã«ãããŠGitLab Container Registryã«pushããŸãã devsecops-deploy-projectïŒãããã€çšïŒ Helmãã£ãŒããšç°å¢å¥ã®valuesãã¡ã€ã«ã管çããRegistryã®ã€ã¡ãŒãžãåç
§ããŠOpenShiftã«ãããã€ããŸãã ãã®ããã« ãã«ããšãããã€ãåããããšã§ãéçºã³ãŒãã®ç®¡çãšãããã€èšå®ã®ç®¡çãæç¢ºã«åãåããããããã«ããŠããŸãã ãªããžããªæ§æïŒæŠèŠïŒ ãã«ãçšãªããžã㪠Containerfileãšsrc/ : NginxããŒã¹ã®ã¢ã㪠.gitlab-ci.yml : ã€ã¡ãŒãžãã«ãïŒã¬ãžã¹ããªãžpush ãããã€çšãªããžã㪠devsecops-nginx-chart/ : Helmãã£ãŒã develop-values.yamlãšproduct-values.yaml : ç°å¢å¥èšå® .gitlab-ci.yml : Helmã䜿ã£ãOpenShiftãžã®ã¢ããªã®ããã〠â»è©³çްãªãã£ã¬ã¯ããªãšãã¡ã€ã«å
容㯠ãã¡ãã®ãªããžã㪠ãã芧ãã ããã ãã©ã³ãæŠç¥ feature/* : éçºäœæ¥çšãã©ã³ã develop : éçºç°å¢ã«å¯Ÿå¿ main : æ¬çªç°å¢ã«å¯Ÿå¿ feature â develop â main ã®æµãã§ã¬ãã¥ãŒãçµãããŒãžãè¡ããä¿è·ãã©ã³ãèšå®ã«ããdevelopãmainãã©ã³ããžã®çŽæ¥pushã¯çŠæ¢ããŠããŸãã ãã€ãã©ã€ã³ã®æµã ãã«ããã€ãã©ã€ã³ïŒbuild-projectïŒ ãœãŒã¹ã³ãŒã倿Žãæ€ç¥ Runnerãã€ã¡ãŒãžããã«ãããã¬ãžã¹ããªã«push ãããã€ãã€ãã©ã€ã³ïŒdeploy-projectïŒ Helmèšå®å€æŽãæ€ç¥ Runnerãã¬ãžã¹ããªã®ã€ã¡ãŒãžãpullããOpenShiftã«ããã〠Gatekeeperãããªã·ãŒãæ€èšŒããéåãããã°ãªãœãŒã¹äœæãæåŠ æ§ç¯æé ïŒæŠèŠïŒ æé ã®æµã ä»åã®ãµã³ãã«ã±ãŒã¹ã§ã¯ä»¥äžã®æ§æèŠçŽ ãæºåããŸãã GitLabãŠãŒã¶ãŒäœæ ãœãŒã¹ã³ãŒãçšãããžã§ã¯ãã®äœæ ãããã€çšãããžã§ã¯ãã®äœæ OpenShiftåŽã®Namespaceãšæš©éèšå® Gatekeeperã®ããªã·ãŒèšå® 1. GitLabãŠãŒã¶ãŒäœæ 管çè
ã¢ã«ãŠã³ãã§GitLabã«ãã°ã€ã³ãããããžã§ã¯ã管ççšãŠãŒã¶ãŒãäœæããŸãã ä»å䜿çšãããããžã§ã¯ãã®ããŒã ã¹ããŒã¹ã¯ããã§äœæãããŠãŒã¶ãŒåãæå®ããŸãã ç¶ããŠãäœæãããããžã§ã¯ã管ççšãŠãŒã¶ãŒïŒdevsecops-userïŒã«SSHããŒãç»é²ããGitã§ã®ã¢ã¯ã»ã¹ã確èªããŸãã äœæãããããžã§ã¯ã管ççšãŠãŒã¶ãŒã§ãã°ã€ã³ãããµã€ãã¡ãã¥ãŒããã¢ãã¿ãŒã¢ã€ã³ã³ãéžæâ[ãããã¡ã€ã«ãç·šé]ãã¯ãªãã¯ããŠããŠãŒã¶ãŒèšå®ç»é¢ã«ç§»åããŸãã ãŠãŒã¶ãŒèšå®ç»é¢ã®ãµã€ãã¡ãã¥ãŒã§[SSHããŒ]ãéžæãããã®ãŠãŒã¶ãŒçšã«äœæããå
¬ééµãç»é²ããŸãã äŸïŒSSHããŒçæãšGitLabæ¥ç¶ç¢ºèª $ ssh-keygen -t rsa -b 4096 -C "devsecops-user@gitlab.local" $ ssh -T git@gitlab-private.example.local 2. ãœãŒã¹ã³ãŒãçšãããžã§ã¯ã å
ã»ã©äœæãããããžã§ã¯ã管ççšãŠãŒã¶ãŒã§ãã°ã€ã³ããGitLabã§æ°èŠãããžã§ã¯ããäœæããŸãã ãã®ãããžã§ã¯ãã¯ã€ã¡ãŒãžã®ãã«ããšã¬ãžã¹ããªãžã®ã€ã¡ãŒãžä¿åãæ
åœããŸãã ãããžã§ã¯ãäœæã®è©³çŽ°ãªæé ã¯åŒç€Ÿããã°èšäº Git & GitLab å
¥é (7) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ãããžã§ã¯ãã«ã€ããŠã | SIOS Tech. Lab ããåç
§ãã ããã ç¶ããŠãäœæãããã«ãçšãããžã§ã¯ãå
ã§main ãš develop ãã©ã³ããçšãããä¿è·ãã©ã³ãã®èšå®ãè¡ããŸãã ãã©ã³ãã®ä¿è·èšå®ãè¡ãããšã§ãmainãã©ã³ãåã³developãã©ã³ããžã®çŽæ¥pushã鲿¢ãããã€ãã©ã€ã³ã®èª€åäœã鲿¢ããŸãã ãã©ã³ãä¿è·èšå®æé ã®è©³çްã«ã€ããŸããŠããåŒç€Ÿããã°èšäº Git & GitLab å
¥é (7) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ãããžã§ã¯ãã«ã€ããŠã | SIOS Tech. Lab ã«èšèŒããŠãããŸãã®ã§ããåèã«ãªãã°å¹žãã§ãã ä»»æã®éçºè
çšãŠãŒã¶ãŒãäœæãããããžã§ã¯ãã«Developeræš©éã§è¿œå ããŸãããã®ãŠãŒã¶ãŒã¯ãããžã§ã¯ãå
ã§ã³ãŒããã³ããããããããã€ãã©ã€ã³ãæäœããããã«å©çšããŸãã ãããžã§ã¯ãã«ãŠãŒã¶ãŒãæåŸ
ããæ¹æ³ãäž»èŠãªãŠãŒã¶ãŒæš©éã«ã€ããŸããŠã¯ã Git & GitLab å
¥é (7) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ãããžã§ã¯ãã«ã€ããŠã | SIOS Tech. Lab ã«èšèŒããŠãããŸãã®ã§ãåç
§ãã ããã ãããžã§ã¯ãã«è¿œå ããéçºçšãŠãŒã¶ãŒã§ãã°ã€ã³ãããµã³ãã«ã®ã¢ããªã³ãŒãããªããžããªã®featureãã©ã³ãã«pushãã管çãéå§ããŸãã ã¢ããªã®ããŒã¹ã€ã¡ãŒãžïŒnginx:latestãªã©ïŒãGitLab Container Registryã«pushããŸãã â»ãã®èšäºã§ã¯ãOpenShiftã®ç°å¢ã䜿çšããŠãããããã³ã³ãã管çããŒã«ãšããŠPodmanãå©çšããŠããŸããDockerãå©çšããŠããç°å¢ã§ã¯podmanâdockerã«èªã¿æ¿ããŠãã ããã $ podman login registry.gitlab.local.example.com $ podman pull nginx:latest $ podman tag nginx:latest registry.gitlab.local.example.com/devsecops-user/devsecops-build-project/nginx:latest $ podman push registry.gitlab.local.example.com/devsecops-user/devsecops-build-project/nginx:latest åèïŒ Git & GitLab å
¥é (7) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ãããžã§ã¯ãã«ã€ããŠã | SIOS Tech. Lab 3. ãããã€çšãããžã§ã¯ã ãããžã§ã¯ã管ççšãŠãŒã¶ãŒã§GitLabã«ãã°ã€ã³ããä»åºŠã¯ãããã€çšã®GitLabãããžã§ã¯ããæ°èŠäœæããŸãã ãã®ãããžã§ã¯ãã¯ã¬ãžã¹ããªã®ã€ã¡ãŒãžãåç
§ããHelmãçšããŠOpenShiftã«ãããã€ãã圹å²ãæ
ããŸãã ãã«ãçšãããžã§ã¯ããäœæããæãšåæ§ã«ãmainãšdevelopãã©ã³ãã«ä¿è·èšå®ãè¡ããŸãã ä»åã¯ãããã€ææ®µãšããŠHelmãã£ãŒããå©çšããããããã®ãããžã§ã¯ãã®ã¬ãžã¹ããªã«Helmãå©çšå¯èœãªã³ã³ããã€ã¡ãŒãžãæ ŒçŽããŸãã â»ãã®èšäºã§ã¯ãOpenShiftã®ç°å¢ã䜿çšããŠãããããã³ã³ãã管çããŒã«ãšããŠPodmanãå©çšããŠããŸããDockerãå©çšããŠããç°å¢ã§ã¯podmanâdockerã«èªã¿æ¿ããŠãã ããã $ podman login registry.gitlab.local.example.com $ podman pull docker.io/alpine/helm:3 $ podman tag docker.io/alpine/helm:3 \  registry.gitlab.local.example.com/root/test-project/helm:3 $ podman push registry.gitlab.local.example.com/root/test-project/helm:3 ãããã€çšãããžã§ã¯ãã®ã¬ãžã¹ããªã«Helmã€ã¡ãŒãžãæ ŒçŽããŠãããšããã€ãã©ã€ã³å
ã§å®è¡ããããžã§ãPodã®ã€ã¡ãŒãžãæå®ã§ããŸãããã®æå®ã¯ããã€ãã©ã€ã³å®çŸ©ãã¡ã€ã«ïŒ.gitlab-ci.ymlïŒã®imageããããã£ã§è¡ããŸãã .default_deploy: &default_deploy   stage: deploy   image: registry.gitlab.local.example.com/devsecops-user/devsecops-deploy-project/helm:3   before_script:     - set -euo pipefail     - helm version     - |       if [ -n "${K8S_NAMESPACE:-}" ]; then         HELM_NS_ARG="-n ${K8S_NAMESPACE}"       else         echo "K8S_NAMESPACE variable not provided. Helm will use the current context's namespace."         HELM_NS_ARG=""       fi     - helm dependency update "$HELM_CHART_DIR" || true ä»å䜿çšãããããã€çšãã€ãã©ã€ã³ã¯ããã©ã³ãã«å¿ããŠãããã€å
ã®ããŒã ã¹ããŒã¹ã決å®ããŸãã ããšãã°ãdevelopãã©ã³ãã«ããŒãžããæã¯devsecops-developããŒã ã¹ããŒã¹ã«ã¢ããªããããã€ããmainãã©ã³ãã«ããŒãžããæã¯devsecops-productionããŒã ã¹ããŒã¹ã«ã¢ããªããããã€ãããªã©ã®å¶åŸ¡ãè¡ããŸãã deploy_develop:   <<: *default_deploy   tags:     - devsecops-runner   variables:     <<: *common_vars     VALUES_ENV: "deploy/Config/develop-values.yaml"     K8S_NAMESPACE: "$DEPLOY_PROJECT_NAME_DEVELOP"   rules:     - if: '$CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push"'   environment: { name: develop, deployment_tier: development }   script:     - |       set -euo pipefail       : "${HELM_RELEASE:=devsecops-nginx}"       : "${HELM_CHART_DIR:=deploy/devsecops-nginx-chart}"       : "${VALUES_COMMON:=deploy/devsecops-nginx-chart/values.yaml}"       : "${VALUES_ENV:?VALUES_ENV must be set}"       test -f "${HELM_CHART_DIR}/Chart.yaml" || { echo "Chart.yaml not found under ${HELM_CHART_DIR}"; exit 1; }       echo "[RUN] helm upgrade --install ${HELM_RELEASE} ${HELM_CHART_DIR} ${HELM_NS_ARG} -f ${VALUES_COMMON} -f ${VALUES_ENV}"       helm upgrade --install "${HELM_RELEASE}" "${HELM_CHART_DIR}" ${HELM_NS_ARG} -f "${VALUES_COMMON}" -f "${VALUES_ENV}" deploy_production:   <<: *default_deploy   tags:     - devsecops-runner   variables:     <<: *common_vars     VALUES_ENV: "deploy/Config/product-values.yaml"     K8S_NAMESPACE: "$DEPLOY_PROJECT_NAME_PRODUCTION"   rules:     - if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"'       allow_failure: false   environment: { name: production, deployment_tier: production }   script:     - |       set -euo pipefail       : "${HELM_RELEASE:=devsecops-nginx}"       : "${HELM_CHART_DIR:=deploy/devsecops-nginx-chart}"       : "${VALUES_COMMON:=deploy/devsecops-nginx-chart/values.yaml}"       : "${VALUES_ENV:?VALUES_ENV must be set}"       test -f "${HELM_CHART_DIR}/Chart.yaml" || { echo "Chart.yaml not found under ${HELM_CHART_DIR}"; exit 1; }       echo "[RUN] helm upgrade --install ${HELM_RELEASE} ${HELM_CHART_DIR} ${HELM_NS_ARG} -f ${VALUES_COMMON} -f ${VALUES_ENV}"       helm upgrade --install "${HELM_RELEASE}" "${HELM_CHART_DIR}" ${HELM_NS_ARG} -f "${VALUES_COMMON}" -f "${VALUES_ENV}" ãããã€çšãã€ãã©ã€ã³ãèªã¿åããCI/CD倿°ãç»é²ããŸãã ãããžã§ã¯ãç»é¢ã®ãµã€ãã¡ãã¥ãŒãã[èšå®] > [CI/CD]ãéžæãã[倿°]ã®ã¡ãã¥ãŒãå±éããŸãã [倿°ã远å ]ãã¯ãªãã¯ãããšãCI/CDãã€ãã©ã€ã³ãå©çšå¯èœãªç°å¢å€æ°ãå®çŸ©ããããšãã§ããŸããä»åã®äŸã§ã¯ãç°å¢å¥ã®ããŒã ã¹ããŒã¹åã§ããDEPLOY_PROJECT_NAME_DEVELOPãšDEPLOY_PROJECT_NAME_PRODUCTIONãå®çŸ©ããŠããŸããä»ã«ãå€éšãµãŒãã¹ã®APIããŒãªã©ãç»é²ãããªã©ã®å©çšãå¯èœã§ãã äžèšã®äœæ¥ãå®äºããåŸããããã€çšã®Helmãã£ãŒãããããã§ã¹ããfeatureãã©ã³ãã«pushããŸãã 4. OpenShiftèšå® éçºçš (develop) ãšæ¬çªçš (production) ã®Namespaceãäœæããã©ãã«ãä»äžããŸãã â»tagã®envã«ã¯devãprodãªã©ãããã€å
ã®ç°å¢åãæå®ããŠããŸãã $ oc create namespace <namespace> $ oc label namespace <namespace> tag=<env> GitLab Runnerçšã®ServiceAccountãäœæããå¿
èŠãªRBACæš©éãšSCCãä»äžããŸãã éçºçš (develop) ãšæ¬çªçš (production) ã®Namespaceã®GitLab Runnerçšã®ServiceAccountã«å¿
èŠãªRBACæš©éãä»äž GitLab Container Registryãžã®Pull SecretãNamespaceã«ç»é²ããŸãã èªå·±çœ²åèšŒææžãå©çšããŠããå Žåã¯CAèšŒææžãSecretãšããŠç»é²ããŸãã éçºçš (develop) ãšæ¬çªçš (production) ã®Namespaceã®default ServiceAccountã«anyuidã®SCCãä»äžããŸãã GitLab Runnerçšã®Namespaceã®ServiceAccountã«ãããã€å
namespaceã§ã®editæš©éãä»äžããŸãã 5. Gatekeeperèšå® å¿
èŠãªConstraintTemplateãäœæããŸãïŒäŸïŒã€ã¡ãŒãžã¿ã°ã«ç¹å®æååãå«ãããNamespaceãšã©ãã«ãäžèŽããŠããããšãªã©ïŒã ä»åäœæããããªã·ãŒã«ãŒã«ã¯ ãã¡ãã®ãªããžã㪠ããåç
§ãã ããã éçºç°å¢ãæ¬çªç°å¢ããããã察象ãšããConstraintsãäœæããŸãã oc get ã³ãã³ãã§ConstraintTemplateãšConstraintsãæ£ããåæ ãããŠããããšã確èªããŸãã åèïŒ OPA/Gatekeeperã§å§ããå®å¿OpenShiftéçšïŒèšå®ç·š ãŸãšã ãããŸã§ã§ãGitLabã®ãã«ãã»ãããã€çšãããžã§ã¯ããOpenShiftã®Namespaceèšå®ãGatekeeperã®ããªã·ãŒé©çšãšãã£ãèŠçŽ ãæããã»ãã¥ãªãã£ãçµã¿èŸŒãã CI/CDåºç€ã®ã¢ãã«ã±ãŒã¹ã宿ããŸãããããã«ããããœãŒã¹ã³ãŒãã®å€æŽããã€ãã©ã€ã³ãéããŠèªåçã«ãã«ãã»ãããã€ãããã ãã§ãªããGatekeeperã«ããããªã·ãŒæ€èšŒã«ãã£ãŠäžé©åãªãªãœãŒã¹ã®äœæãæªç¶ã«é²ãããšãå¯èœã«ãªããŸãã æ¬èšäºã§ç޹ä»ããæ§æã¯ãé«ãã»ãã¥ãªãã£èŠä»¶ãæ±ããããã·ã¹ãã ã«ãããŠãæå¹ãªã¢ãããŒãã§ããæ¬¡åã®èšäºã§ã¯ããã®ç°å¢ã掻çšããŠå®éã®ãã€ãã©ã€ã³å®è¡ããããªã·ãŒé忀ç¥ãŸã§ã®äžé£ã®æµãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post DevSecOpså®è·µã¬ã€ãïŒCI/CDç°å¢ã®æ§ç¯ç·š first appeared on SIOS Tech. Lab .
ã¯ããã« åå ãŸã§ã¯ãGitãšGitLabã®å
·äœçãªæ©èœãæäœæ¹æ³ãå
¥éè
åãã«è§£èª¬ããŠããŸããã ä»åã¯ãGitLabã®æ ¹å¹¹ãšãªããDevSecOpsããšããèãæ¹ãäžå¿ã«è§£èª¬ããŸããè¿å¹Žã®ãœãããŠã§ã¢éçºã§ã¯ãéçºã®ã¹ããŒããäžãã€ã€ãã»ãã¥ãªãã£ã確ä¿ããããšãäžå¯æ¬ ã§ãããã®çžåãã課é¡ã解決ããããã«å¿
èŠãªã¢ãããŒãããDevSecOpsãã§ãã ãã®DevSecOpsãGitLabãã©ã®ããã«å®çŸããŠããã®ãããããŠãããã©ã®ãããªã¡ãªãããçã¿åºãã®ãããå
¬åŒäºäŸã亀ããŠå
·äœçã«è§£èª¬ããŸãã DevOpsãšã¯ïŒ ãŸããDevSecOpsãçè§£ããããã«ããã®åå°ãšãªãDevOpsã«ã€ããŠè§£èª¬ããŸãã DevOpsã¯ãéçºããŒã ïŒDevelopmentïŒãšéçšããŒã ïŒOperationsïŒã飿ºããã¢ããªã±ãŒã·ã§ã³ã®ãã«ããããã¹ãããããã€ããªãªãŒã¹ãŸã§ã®ããã»ã¹ãèªååããé«éåããåãçµã¿ã§ããããã«ãããæ°ããæ©èœãçŽ æ©ãæäŸãã顧客ã®ãã£ãŒãããã¯ã«è¿
éã«å¯Ÿå¿ããããšãå¯èœã«ãªããŸãã DevSecOpsãšã¯ïŒ DevSecOpsãšã¯ãDevOpsã®è¿
éãªéçºã»éçšããã»ã¹ã«ã»ãã¥ãªãã£ãçµ±åããããšã§ãã¹ããŒããšå®å
šæ§ãäž¡ç«ããææ³ã§ãã åŸæ¥ã®ãéçºã®åŸã«ã»ãã¥ãªãã£ãã§ãã¯ãè¡ããã¢ãããŒãã§ã¯ãªããéçºã©ã€ããµã€ã¯ã«ã®å段éã«ã»ãã¥ãªãã£ãçµã¿èŸŒãç¹ãç¹åŸŽã§ãã éçºã®æçµæ®µéã§è匱æ§ãçºèŠããããšããã®ä¿®æ£ã«ã¯æéãšã³ã¹ãããããããªãªãŒã¹ã®é
å»¶ã«ã€ãªãããŸããDevSecOpsã¯ããã®ãããªææ»ãããªããããã«ãæ©ã段éã§åé¡ãæ€ç¥ããå°ããªä¿®æ£ã§æžãŸããããšãç®æããŸããããã«ãããéçºã®ã¹ããŒããä¿ã¡ã€ã€ãã³ã¹ãåæžãšå®å
šæ§ã®åäžãåæã«å®çŸã§ããŸãã 詳现ã«ã€ããŠã¯ä»¥äžã®èšäºã§è§£èª¬ããŠããŸãã®ã§ããåç
§ãã ããã DevSecOpsãšã¯ïŒå®å
šæ§ãšã¹ããŒããäž¡ç«ããéçºææ³ | SIOS Tech. Lab GitLabã§ã®DevSecOpsã®æ±ã GitLabã¯ãDevOpsã®çµ±åãã©ãããã©ãŒã ã§ãããããDevSecOpsãäœçŸããããŒã«ã§ãã GitLabã¯CI/CDãã€ãã©ã€ã³ã«ã»ãã¥ãªãã£ã¹ãã£ã³æ©èœãçµã¿èŸŒãããšãå¯èœã§ããéçºè
ã¯ã远å ã®ããŒã«ãèšå®ãããããšãªãã以äžã®ä»£è¡šçãªã»ãã¥ãªãã£æ©èœãCI/CDãã€ãã©ã€ã³ã«å«ããããšãã§ããŸãã éçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒïŒã³ãŒãããã«ãããåã«ããœãŒã¹ã³ãŒãã«ååšããè匱æ§ãèªåã§æ€ç¥ããŸãã èªèšŒæ
å ±æ€ç¥ïŒSecret DetectionïŒïŒã³ãŒãå
ã«èª€ã£ãŠã³ããããããAPIããŒããã¹ã¯ãŒããªã©ã®æ©å¯æ
å ±ãèªåã§æ€åºããŸãã äŸåé¢ä¿ã¹ãã£ã³ïŒDependency ScanningïŒïŒãããžã§ã¯ãã䜿çšããŠããã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã«æ¢ç¥ã®è匱æ§ããªããããã§ãã¯ããŸãã ãããã®ã¹ãã£ã³çµæã¯ãããŒãžãªã¯ãšã¹ãç»é¢ã«CI/CDãã€ãã©ã€ã³ã®å®è¡çµæãšããŠçŽæ¥è¡šç€ºããããããã¬ãã¥ãŒæã«ã³ãŒãå質ãšã»ãã¥ãªãã£ã®äž¡æ¹ãäžåºŠã«ç¢ºèªã§ããŸãã åèïŒ Git & GitLab å
¥é (6) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã®ç»é¢èª¬æãšããå©çšãããæ©èœèª¬æã GitLabå
¬åŒã§æç€ºããŠããDevSecOpsã®äºäŸã«ã€ã㊠GitLabã®DevSecOpsæ©èœã¯ãèŠæš¡ãåããå€ãã®äŒæ¥ã§ææãäžããŠããŸããããã§ã¯ãGitLabã®å
¬åŒäºäŸãããã®ã¡ãªãããå
·äœçã«èŠãŠã¿ãŸãããã åèïŒ https://about.gitlab.com/ja-jp/customers/ ãšã³ã¿ãŒãã©ã€ãºäºäŸïŒHilti瀟ïŒãããã€æéã®ççž®ïŒ å»ºèšæ¥çã®å€§æã§ããHiltiã¯ã以åããœãããŠã§ã¢éçºã®äžéšãå€éšã«å§èšããŠããã瀟å
ã§ã®ã³ãŒã管çãCI/CDäœå¶ãååã«æŽã£ãŠããŸããã§ããããã®ããããã°ãè匱æ§ãžã®å¯Ÿå¿ãåŸæã«åããã»ãã¥ãªãã£äžã®ãªã¹ã¯ãã³ãŒãå質ã®äœäžã課é¡ãšãªã£ãŠããŸããã ãããã®èª²é¡ã解決ããã»ãã¥ãªãã£ã¹ãã£ã³ãæåªå
ã«ãœãããŠã§ã¢éçºã瀟å
åãããããçµ±åã®ãããããSCM (Source Code Management)ãè±å¯ãªSAST/DASTçã®ã»ãã¥ãªãã£æ©èœãçç±ã«GitLab Ultimateãæ¡çšããŸããã GitLabå°å
¥ã®å
·äœçãªææãšããŠããããã€æéãå¹³å3æéããããã15åã«ççž®ãããŸãããããã¯ã以äžã倧ããªèŠå ã§ãã éçºã»ãã¹ãããŒã ãã³ãŒãã管çããè匱æ§ãäºåã«çºèŠã§ããããã«ãªã£ã ãã£ãŒãããã¯ã«ãŒãã6æ¥ãã3æ¥ã«ççž®ãããããš ã³ãŒããã§ãã¯é »åºŠã3ãæ6åããé±2åã«å¢å ããã«ãããHiltiã¯ã»ãã¥ãªãã£ãã³ãŒãå質ãéçºå¹çãããŒã ã³ã©ãã¬ãŒã·ã§ã³ã倧å¹
ã«åäžãããããšãã§ããŸããã åèïŒ https://about.gitlab.com/customers/hilti/ ãããããŒã±ããäºäŸïŒCarfax瀟ïŒè匱æ§ã®æ©æçºèŠïŒ èªåè»å±¥æŽããŒã¿ããŒã¹ãæäŸããCarfaxã¯ã以åãè€æ°ã®DevOpsããŒã«ãã§ãŒã³ã®ç¶æç®¡çããããããå€ãã®æéãã³ã¹ããããã£ãŠããŸãããããã«ãéçºã©ã€ããµã€ã¯ã«åŸåã®æåã«ããè匱æ§ã¹ãã£ã³ã§åé¡ãçºèŠããããšãå€ããè¿
éãªä¿®æ£ãé£ããç¶æ³ã§ããã ããæ©ãæ®µéã§ã»ãã¥ãªãã£ãªã¹ã¯ãæ€ç¥ããããšãã課é¡ãããGitLabã®DevSecOpsãã©ãããã©ãŒã ãæ¡çšããŸãããCarfaxã¯å°å
¥åŸ6ã¶æä»¥å
ã«ãã³ãŒããGitLabã«ç§»ããGitLabã®ã»ãã¥ãªãã£ã¹ãã£ã³ã掻çšãå§ããŸããã GitLabã®èªåã»ãã¥ãªãã£æ©èœïŒäŸåé¢ä¿ã¹ãã£ã³ãã³ã³ããã¹ãã£ã³ãã·ãŒã¯ã¬ããæ€åºãªã©ïŒãå°å
¥ããããšã§ãCarfaxã¯1幎éã§è匱æ§ã®çŽ3åã®1ãéçºã©ã€ããµã€ã¯ã«ã®ããªãæ©ã段éã§çºèŠã§ããããã«ãªããŸãããããã«ãããéçºããŒã å
šäœããœãããŠã§ã¢ã©ã€ããµã€ã¯ã«ã®æãæ©ã段éããã»ãã¥ãªãã£ãèæ
®ãããã·ããã¬ããããå®çŸããåé¡ã®ä¿®æ£ã«ãããæéãšã³ã¹ãã倧å¹
ã«åæžããã»ãã¥ãªãã£ãåäžãããŸããã åèïŒ https://about.gitlab.com/customers/carfax/ äžå°äŒæ¥ïŒSMBïŒäºäŸïŒJasper Solutions瀟ïŒãªãŒã«ã€ã³ã¯ã³ã®å©ç¹ïŒ æ¿åºã»æ°éåãã®ãœãããŠã§ã¢éçºãè¡ãJasper Solutionsã¯ã以åã è€æ°ã®åå¥ããŒã«ãçµã¿åãããéçºãã€ãã©ã€ã³ãå©çšããŠããŸããããåã
ã®ããŒã«ã®ããŒãžã§ã³ã¢ãããåå ã§ãã€ãã©ã€ã³ãé »ç¹ã«æ©èœããªããªããéçºããŒã ã¯é¡§å®¢åãã®ã³ãŒãéçºããããã®ä¿®æ£ã«å€ãã®ãªãœãŒã¹ãå²ããªããã°ãªããŸããã§ããã ããããéçšè² è·ãæ ¹æ¬ãã解決ãããããGitLabãCI/CDãSCMãçµ±åããããªãŒã«ã€ã³ã¯ã³ããã©ãããã©ãŒã ãšããŠæ¡çšããŸããã GitLabã®ããªãŒã«ã€ã³ã¯ã³ããã©ãããã©ãŒã ã«ããããã€ãã©ã€ã³ã®ç Žæãã»ãŒãªããªããåäžã®ã¢ããã°ã¬ãŒãã§ãã€ãã©ã€ã³å
šäœãåžžã«ææ°ã®ç¶æ
ã«ä¿ããããããéçºããŒã ã¯ã¢ããªã±ãŒã·ã§ã³éçºã«éäžã§ããããã«ãªããŸããããã®çµ±åã«ãã£ãŠã以äžã®å
·äœçãªã¡ãªãããçãŸããŠããŸãã 1補åããã幎éå¹³åçŽ350人æã®äœæ¥æéãåæž åå¥ã®ããŒã«ãç¶æç®¡çããè²»çšãšæ¯èŒããŠå¹Žé33ã37%ã®ã³ã¹ãåæž ãµã€ã¯ã«ã¿ã€ã ã30%ççž®ããããããã€é »åºŠã25%åäž Jasper Solutionsã¯ãGitLabã®ããªãŒã«ã€ã³ã¯ã³ãã®å©ç¹ãæå€§éã«æŽ»çšããããšã§ãè€æ°ã®ããŒã«ãã§ãŒã³ã®ç¶æç®¡çããè§£æŸãããéçºãžã®éäžãšéçšã³ã¹ãã®åæžãåæã«å®çŸã§ããŸããã åèïŒ https://about.gitlab.com/customers/jasper-solutions/ GitLabã®DevSecOpsãå°å
¥ããããšã«ãã£ãŠãHilti瀟ã§ã¯ãããã€æéã®ççž®ãCarfax瀟ã§ã¯è匱æ§ã®æ©æçºèŠãJasper Solutions瀟ã§ã¯éçšã³ã¹ãåæžãšå®å®åãå®çŸãããŸããã äºäŸ æ¹å广 Hilti瀟 ãããã€æéã®ççž®ïŒå¹³å3æéãã15åïŒ Carfax瀟 è匱æ§ã®æ©æçºèŠïŒçŽ3åã®1ïŒ Jasper Solutions瀟 éçšã³ã¹ãåæžãšå®å®åïŒå¹Žé33ã37%ã®ã³ã¹ãåæžïŒ ãŸãšã ä»åã¯ãGitLabãCI/CDãã€ãã©ã€ã³ã«ã»ãã¥ãªãã£ã¹ãã£ã³æ©èœãçµ±åããããšã§ãéçºã¹ããŒããšå®å
šæ§ãäž¡ç«ãããDevSecOpsããšããææ³ãå®çŸããŠããããšã解説ããŸããã ãããŠãGitLabãå®éã®äŒæ¥äºäŸïŒHiltiãCarfaxãJasper SolutionsïŒã§ã©ã®ãããªå
·äœçãªææïŒãããã€æéã®ççž®ãè匱æ§ã®æ©æçºèŠãéçšã³ã¹ãã®åæžãªã©ïŒãçã¿åºããŠããããå
·äœçã«èŠãŠããŸããã ãããŸã§åŠãã GitLabã®åºæ¬æäœãèžãŸããæ¬¡ã¯å®éã«DevSecOpsãäœéšã§ããç°å¢ãæ§ç¯ããæ¹æ³ãã玹ä»ããŸãã åèæç® https://about.gitlab.com/ja-jp/customers/ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Git & GitLab å
¥é (10) ïœGit ãã¹ã¿ãŒãžã®éïœãGitLabã§DevSecOpsã first appeared on SIOS Tech. Lab .
/brä»å·ã§ã¯ãnftables ã«ã€ããŠããã®ä»çµã¿ãèšå®æ¹æ³ã«ã€ããŠèª¬æããŸãïŒ nftables ãšã¯ nltables ãšã¯ãã±ãããã£ã«ã¿ãªã³ã° (ééãããã±ããã® IPã¢ãã¬ã¹ããããã³ã«ãããŒãçªå·ãªã©ããã£ã«ã¿ãªã³ã°èšå®ã«åºã¥ããŠãã§ãã¯ããéä¿¡ãèš±å¯ã»æåŠã倿ããããš) ããŒã«ã®åç§°ã§ããã«ãŒãã« 3.13 (RHEL ã ãšããŒãžã§ã³ 8ç³») ããå°å
¥ãããŸããã åŸæ¥ã¯ iptablesãip6tablesãarptablesãebtables ãšãã£ãè€æ°ã®ããŒã«ã䜿ãåããŠãã£ã«ã¿ãªã³ã°èšå®ãããå¿
èŠããããŸãããããããã®ããŒã«ã 1ã€ã® nft ã³ãã³ã ã«çµ±åãããã管çãããããªããŸããã nftables ã¯åŸæ¥ã®ããŒã«ãšæ¯èŒããŠæ§æãã·ã³ãã«ãã€æè»ã«èšå®ãã§ããããã«ãªã£ãŠããŸãã ãªããnftables ã«ã€ããŠéå»ã«äžèšã®èšäºã§ãã玹ä»ããŠããŸãã2019幎ã®èšäºãšããããšããããåå説æããããªãã£ãéšåãå«ããŠã玹ä»ã§ããã°ãšæããŸãã â»å
容ãéè€ããŠããŸãéšåããããŸãããäºæ¿ãã ããã https://tech-lab.sios.jp/archives/16930#teburuno_she_ding ãã£ã«ã¿ãªã³ã°èšå®ã®å
šäœçãªæ§é nftables ã§ã¯ããã£ã«ã¿ãªã³ã°èšå®ã®ããšã ã«ãŒã«ã»ãã ãšåŒã³ãŸãã ã«ãŒã«ã»ããã¯ãinetãipãip6 ãªã©ã®ã¢ãã¬ã¹ãã¡ããªããšã«äœæã§ãã ããŒãã« ãããã«ããŒãã«å
ã«ãã£ã«ã¿ãªã³ã°ã®ã«ãŒã«ãã²ãšãŸãšãã«ç®¡çããããã® ãã§ãŒã³ ããããŠãã§ãŒã³å
ã§å
·äœçãªã«ãŒã«èšå®ãè¡ãããã® ã«ãŒã« ãå«ãŸããæ§é ã«ãªã£ãŠããŸãã åºæ¬ã®æžåŒ nft ã³ãã³ã ã®åºæ¬çãªäœ¿ç𿹿³ãã説æããŸãã ã«ãŒã«ã»ããã®è¿œå nftables ã«ãããã£ã«ã¿ãªã³ã°èšå®ã¯ã â ããŒãã«ãâ¡ãã§ãŒã³ãâ¢ã«ãŒã« ããšããé åºã§è¡ãªã£ãŠãããŸãã ããŒãã«ã®è¿œå ããŒãã«ãæ°ãã远å ããã«ã¯ nft add table ã³ãã³ã ã䜿çšããŸãã äŸ1ïŒinet ãã¡ããªã®ããŒãã«ãäœæ # nft add table inet table1 äŸ2ïŒip4 ãã¡ããªã®ããŒãã«ãäœæ # nft add table ip table2 ãã§ãŒã³ã®è¿œå ãã§ãŒã³ãæ°ãã远å ããã«ã¯ nft add chain ã³ãã³ã ã䜿çšããŸãã äŸ1ïŒtable1 ããŒãã«ã«æ°ãããã§ãŒã³ãäœæ # nft add chain inet table1 chain1 { type filter hook input priority 0 \; } â» “{}” å
ã§æå®ãã typeãhookãpriority ã«æå®å¯èœãªå€ã«ã€ããŠã¯ãéå»ã«ã玹ä»ããèšäºã§ã説æããŠããŸãã (ããã°ããæç²) —– ã»type ã«ã¯ãfilterãrouteãnat ã®ãããããèšå®ããŸãã ã»hook ã«ã¯ãpreroutingãinputãforwardãoutputãpostrouting ã®ãããããèšå®ããŸãã ã»priority ã«ã¯ããã§ã€ã³ã®åªå
床 (æŽæ°å€) ãèšå®ããŸãã ãå€ãå°ããã»ã©ãåªå
床ã¯é«ããªããŸãããŸããè² ã®å€ãèšå®ããããšãã§ããŸãã —– ã«ãŒã«ã®è¿œå ã«ãŒã«ãæ°ãã远å ããã«ã¯ nft add rule ã³ãã³ã ã䜿çšããŸãã äŸ1ïŒtable1 ããŒãã«å
ã® chain1 ã«ã22 çªããŒã (SSH) ã«ããå€éšã¢ã¯ã»ã¹ãèš±å¯ããã«ãŒã«ãäœæ # nft add rule inet table1 chain1 tcp dport 22 accept äŸ2ïŒtable1 ããŒãã«å
ã® chain1 ã«,ã80 çªããŒã (HTTP) ã«ããå€éšã¢ã¯ã»ã¹ãèš±å¯ããã«ãŒã«ãäœæ # nft add rule inet table1 chain1 tcp dport 80 accept ã«ãŒã«ã»ããã®è¡šç€º ã«ãŒã«ã»ããã®å
容ã衚瀺ããã«ã¯ nft list ruleset ã³ãã³ã ã䜿çšããŸãã # nft list ruleset table inet table1 { chain chain1 { type filter hook input priority filter; policy accept; tcp dport 22 accept tcp dport 80 accept } } ããŒãã«ã®äžèЧã衚瀺ããã«ã¯ nft list tables ã³ãã³ã ã䜿çšããŸãã â»ããŒãã«ã®äžèЧã®ã¿ãå
容ã¯è¡šç€ºãããŸãã # nft list tables table inet table1 ç¹å®ã®ãã§ãŒã³ã«èšå®ãããŠããã«ãŒã«ã®å
容ã衚瀺ããã«ã¯ã nft list chain ã³ãã³ã ã䜿çšããŸãã # nft list chain inet table1 chain1 table inet table1 { chain chain1 { type filter hook input priority filter; policy accept; tcp dport 22 accept tcp dport 80 accept } } ã«ãŒã«ã»ããã®åé€ ã«ãŒã«ãåé€ããã«ã¯ nft delete ã³ãã³ã ã䜿çšããŸãã ãªããã«ãŒã«ã®åé€ã«ã¯åã«ãŒã«ããšã«èšå®ãããŠãã ãã³ãã«çªå· ãå¿
é ãšãªããŸãã ãã³ãã«çªå·ã®ç¢ºèªæ¹æ³ã¯ãäžã§èª¬æãã nft list chain ã³ãã³ãã« –handle ããã㯠-a ãªãã·ã§ã³ãæå®ããŸãã # nft -a list chain inet table1 chain1 table inet table1 { chain chain1 { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 80 accept # handle 3 } } # nft --handle list chain inet table1 chain1 table inet table1 { chain chain1 { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 80 accept # handle 3 } } tcp dport 22 accept ã®æšªã« handle 2 ã tcp dport 80 accept ã®æšªã« handle 3 ãšèšèŒãããŠãããåã«ãŒã«ã®ãã³ãã«çªå·ã確èªããããšãã§ããŸããã äŸãã°ãäžèšã®ãã¡ 22 çªããŒã (SSH) ã®ã«ãŒã«ãåé€ããã«ã¯ãäžèšã®æ§ã« handle 2 ãšæå®ããŸãã # nft delete rule inet table1 chain1 handle 2 次å·ã«ã€ã㊠次å·ã§ã¯ã nftables ã®èšå®äŸããç¥ã£ãŠãããšäŸ¿å©ãª tips ã«ã€ããŠã玹ä»ããŸãïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ç¥ã£ãŠãããšã¡ãã£ãšäŸ¿å©ïŒnftables ã«ãããã±ãããã£ã«ã¿ãªã³ã°1 first appeared on SIOS Tech. Lab .
ããã«ã¡ã¯ïŒ 仿ããOSSã®ãµããŒããšã³ãžãã¢ãæ°ã«ãªã£ãïŒOSSã®ææ°ãã¥ãŒã¹ãããå±ãããŸãã 9/10ãIPA (æ
å ±åŠçæšé²æ©æ§) ãããæ
å ±ã»ãã¥ãªãã£çœæž2025ãPDF çãå
¬éããŸããã ãã¬ã¹çºè¡šãæ
å ±ã»ãã¥ãªãã£çœæž2025ãPDFçã®å
¬é https://www.ipa.go.jp/pressrelease/2025/press20250910.html 9/16ãLPI-Japan㯠Linux ã®åŠç¿ææã®ææ°çã§ãããLinuxã·ã¹ãã ç®¡çæšæºæç§æž ããŒãžã§ã³2.0.0ããå
¬éããŸããã PDFçãš ePubçã¯ç¡åã§æäŸãããŠããŸãã LPI-Japanãç¡åã®LinuxåŠç¿çšææãLinuxã·ã¹ãã ç®¡çæšæºæç§æžãææ°çãå
¬é https://japan.zdnet.com/article/35238032/ ç·åçã®ãµã€ãããã9/18 ã«å®æœããã AI ã»ãã¥ãªãã£åç§äŒã®è³æãå
¬éãããŸããã ç·åç – AIã»ãã¥ãªãã£åç§äŒïŒç¬¬1åïŒ https://www.soumu.go.jp/main_sosiki/kenkyu/cybersecurity_taskforce/02cyber01_04000001_00321.html ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ã2025幎9æãOSSãµããŒããšã³ãžãã¢ãæ°ã«ãªã£ãïŒOSSææ°ãã¥ãŒã¹ first appeared on SIOS Tech. Lab .
ã¯ããã« ãããŸã§æ¬ããã°ã§ã¯ãGitLabãDevSecOpsã®ããã®éçºãã©ãããã©ãŒã ãšããŠå©çšããéã«å¿
èŠãšãªãäž»èŠæ©èœïŒã³ã³ããã¬ãžã¹ããªãCI/CDïŒã«ã€ããŠç޹ä»ããŠããŸãããä»åã¯ãã®åºç€ãããå®å®ããŠéçšããããã«æ¬ ãããªãåé·åæ§æã«ã€ããŠç޹ä»ããŸãã æŠèŠ GitLabãæ§æããã³ã³ããŒãã³ããšããŠä»¥äžã®ãã®ããããŸãïŒ GitLab Rails UIã®æäŸãAPIã®ç®¡çãè¡ãGitLabã®äžæ žãæããŠã§ãã¢ããªã±ãŒã·ã§ã³ã§ã Consul GitLabã®åã³ã³ããŒãã³ãã®ãµãŒãã¹ãã£ã¹ã«ããªãŒãšãã«ã¹ãã§ãã¯ãè¡ãã³ã³ããŒãã³ãã§ã DatabaseïŒPostgreSQLïŒ GitLabã®äž»èŠããŒã¿ïŒãããžã§ã¯ãããŠãŒã¶ãŒãªã©ïŒãä¿åããããŒã¿ããŒã¹ã§ã Sidekiq GitLabã®ããã¯ã°ã©ãŠã³ããžã§ããéåæã§åŠçããããã®ã³ã³ããŒãã³ãã§ã Redis GitLabã®äžæçãªããŒã¿ïŒãã£ãã·ã¥ããžã§ããã¥ãŒãªã©ïŒãä¿åããé«éãªã€ã³ã¡ã¢ãªããŒã¿ã¹ãã¢ã§ã Gitaly Cluster Gitãªããžããªã®èªã¿æžããè¡ãã³ã³ããŒãã³ãã§ã ä»åã¯ä»¥äžã®ãããªGitLabã®æ§æäŸïŒ äŸïŒæå€§ 1000 RPS ãŸã㯠50,000 ãŠãŒã¶ãŒ ïŒãåèã«ããŠåã³ã³ããŒãã³ãã®åé·åã«ã€ããŠèª¬æããŸãã GitLabã®æ§æäŸïŒåŒçšïŒ æå€§ 1000 RPS ãŸã㯠50,000 ãŠãŒã¶ãŒ ïŒ åã³ã³ããŒãã³ãã®åé·å GitLab Rails GitLab Railsã®åé·å GitLab Railsã¯GitLabã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã§ããæ³å®ãããã¢ã¯ã»ã¹ãŠãŒã¶ãŒã«åãããŠããŒããæ°Žå¹³ã¹ã±ãŒã«ããå¿
èŠããããŸããïŒåèïŒ https://docs.gitlab.com/administration/reference_architectures/ ïŒ ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã¯å€æ°ã®ãŠãŒã¶ãŒããã®ãªã¯ãšã¹ããåŠçããå¿
èŠããããŸãããŸããã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããå
éšã®åçš®ã³ã³ããŒãã³ãã«å€æ°ã®ãªã¯ãšã¹ããéãããŸãããã®ãããGitLab Railsã®åé·åã«ã¯å€éšããŒããã©ã³ãµãŒãšå
éšããŒããã©ã³ãµãŒã䜿ãããŸãã å€éšããŒããã©ã³ãµãŒã¯GitLabãžã¢ã¯ã»ã¹ããéã®å€éšããã®SSHãHTTPSéä¿¡ã®ãã©ãã£ãã¯ã忣ãããŸããTLSçµç«¯ãããŒããã©ã³ãµãŒã«ãã£ãŠè¡ãããšãå¯èœã§ãã å
éšããŒããã©ã³ãµãŒã¯PgBouncerãGitaly Cluster (Praefect)ãžã®æ¥ç¶ãªã©ã®å
éšã³ã³ããŒãã³ãå士ã®éä¿¡ã仲ä»ããŠãè² è·ã忣ããŸãã Consul Consulã®åé·å Consulã¯åã³ã³ããŒãã³ãã®ç£èŠãè¡ãããµãŒãã¹ãã£ã¹ã«ããªãŒãšãã«ã¹ãã§ãã¯ãè¡ãã³ã³ããŒãã³ãã§ããGitLabã®åã³ã³ããŒãã³ãåå£«ã®æ¥ç¶ã®æäŒããããŸãã ã¯ã©ãŒã©ã ïŒã¯ã©ã¹ã¿ãŒãæ£åžžã«æ©èœããæå°å°æ°ïŒãç¶æããããã«ãïŒããŒã以äžã®å¥æ°ããŒãã«Consulããããã€ããå¿
èŠããããŸãã DatabaseïŒPostgreSQLïŒ DatabaseïŒPostgreSQLïŒã®åé·å GitLabã§ã¯äž»èŠããŒã¿ïŒãããžã§ã¯ãããŠãŒã¶ãŒãªã©ïŒãä¿åããããŒã¿ããŒã¹ãšããŠPostgreSQLãå©çšãããŸãã GitLabã®PostgreSQLã§ã¯åäžé害ç¹ãåé¿ããããã«ãã©ã€ããªDBãšã»ã«ã³ããªDBã®ïŒçš®é¡ãçšæãããŸãããã©ã€ããªDBã¯å®éã«å©çšãããã¡ã€ã³ã®DBã§ãã»ã«ã³ããªDBã¯ãã©ã€ããªã®å
容ããªã¢ã«ã¿ã€ã ã§è€è£œããŠããèªã¿åãå°çšã®äºåã®DBã§ãã PgBouncerã¯åã³ã³ããŒãã³ããPostgreSQLã®DBã«æ¥ç¶ãè¡ãéã«ä»²ä»ãããŠãDBæ¬äœãžã®è² è·ã軜æžãããã³ã³ããŒãã³ãã§ããPgBouncerããªããšGitLabãžã®æ¥ç¶å¶éã«ãã£ãŠããšã©ãŒãåºããåŠçé床ãäœäžããŸããPgBouncerèªèº«ã¯å
éšããŒããã©ã³ãµãŒã«ãã£ãŠè² è·åæ£ãããŸãã ãŸããPatroniãšããPostgreSQLã®HAã¯ã©ã¹ã¿ã管çããããŒã«ãçšããããšã«ãã£ãŠãã©ã€ããªDBã«é害ãèµ·ããå Žåãã»ã«ã³ããªDBããã©ã€ããªã«ææ ŒããåŠçãèªåçã«è¡ãããŸãã Sidekiq Sidekiqã®åé·å Sidekiqã¯GitLabã®æ§ã
ãªããã¯ã°ã©ãŠã³ããžã§ãïŒã¡ãŒã«éä¿¡ãCIãžã§ããªã©ïŒãåŠçããã³ã³ããŒãã³ãã§ãã Sidekiqã®ãã¥ãŒã«ãžã§ãã远å ãããŠãããšãããã³ã³ããŒãã³ãã§åŠçãäœäžããå Žåãé£éçã«ãã¹ãŠã®ãžã§ãã®é床ãäœäžããå¯èœæ§ããããŸãããã®ãããªå Žåã®å¯ŸçãšããŠã以äžã®ãããªãã®ããããŸãã è€æ°ã€ã³ã¹ã¿ã³ã¹ãç«ã¡äžããŠåŠçèœåãå¢ãã ãžã§ããå°ããªåäœã«åå²ãã ãžã§ãã®ãã¥ãŒãæé©åãã äžèšã«ç€ºãéãSidekiqã®åé·åã¯åçŽã«æ°Žå¹³ã¹ã±ãŒã«ããã ãã§ãªãããžã§ããã¥ãŒã®èšèšãé©åã«è¡ãããšãéèŠã«ãªããŸãã Sidekiqã¯ãã°ãèŠãããšã«ãã£ãŠãžã§ãã®å®è¡æéãå®è¡åæ°ãèŠèŠçã«ç¢ºèªããããšãå¯èœã§ãããã®çµæãSidekiqã®ãã¥ãŒã®èšèšã«åæ ãããŠãç¶ç¶çã«ãã¥ãŒã®æé©åãè¡ãå¿
èŠããããŸãã Sidekiqã®ãã°ïŒåŒçšïŒ GitLabã®è² è·åæ£ ïŒ Redis Redisã®åé·å Redisã¯GitLabã§é«éåŠçãæ±ããããæ§ã
ãªäžæçãªããŒã¿ãä¿åããããã«å©çšãããŸããPostgreSQLãšåãããã©ã€ããªãšã»ã«ã³ããªã«å¥ããŠããŸãããRedisã®ã»ã«ã³ããªã¯èªã¿åããã§ããŸããã ãžã§ããã¥ãŒããŠãŒã¶ãŒã»ãã·ã§ã³ã®ç¶æ
ã®æ
å ±ãªã©ã倱ããããšGitLabã®æ©èœã忢ãããããªæ
å ±ã¯Redis Persisetentã«ä¿åãããCacheããã°ãªã©ã®å€±ãããŠãGitLabãåäœã§ãããããªæ
å ±ã¯Redis Cacheã«ä¿åãããŸãã Redis Sentinelãšããã³ã³ããŒãã³ãã«ãã£ãŠãRedisã®ãã©ã€ããªã§é害ãèµ·ããå Žåãã»ã«ã³ããªã«èªåçã«åãæ¿ããè¡ãããŸãã Redisã¯ã©ã¹ã¿ãŒã¯ã¯ã©ãŒã©ã ïŒã¯ã©ã¹ã¿ãŒãæ£åžžã«æ©èœããæå°å°æ°ïŒãç¶æããããã«ãïŒããŒã以äžã®å¥æ°ããŒãã«ãããã€ããå¿
èŠããããŸãã Gitaly Cluster Gitaly Clusterã®åé·å Gitalyã¯Gitãªããžããªã®èªã¿æžããè¡ãã³ã³ããŒãã³ãã§ãã Gitaly Clusterã¯ãã¹ãŠã®Gitãªããžããªããã¹ãŠã®GitalyããŒãã«ä¿åããããã®ãã¡äžã€ããã©ã€ããªãšããŠåäœããŸãã Gitalyãžã®æ¥ç¶ã¯ãã¹ãŠPraefectãšããGitaly Clusterã®ãªã¯ãšã¹ããã«ãŒãã£ã³ã°ããã³ã³ããŒãã³ããçµç±ããŸããããã«ãã£ãŠGitalyããŒãã§é害ãèµ·ããå Žåãèªåçã«ãã§ã€ã«ãªãŒããŒããŸãããŸããPraefectã¯TLSã®æ¥ç¶ããµããŒãããŠããŸãã Praefectèªèº«ã¯å
éšããŒããã©ã³ãµãŒã«ãã£ãŠè² è·åæ£ãããŸãããŸããã¯ã©ãŒã©ã ïŒã¯ã©ã¹ã¿ãŒãæ£åžžã«æ©èœããæå°å°æ°ïŒãç¶æããããã«ãïŒããŒã以äžã®å¥æ°ããŒãã«ãããã€ããå¿
èŠããããŸãã Praefectã«ã¯Gitaly Clusterã®ã¹ããŒã¿ã¹ãä¿åããç¬èªã®DBïŒPraefect PostgreSQLïŒãå¿
èŠã«ãªããŸããGitLabã®Linuxããã±ãŒãžã§æ§ç¯ããå ŽåãéHAæ§æã®DBã«ãªããŸããé«å¯çšæ§ãä¿ã¡ããå Žåã¯å€éšã®åé·åãããPostgreSQLãå¿
èŠã«ãªããŸãã çµããã« ä»åã¯GitLabã®åã³ã³ããŒãã³ãã®åé·åã«ã€ããŠè§£èª¬ããŸãããã»ãã¥ã¢ã§ç¶ç¶çãªéçºç°å¢ãå®çŸããããã®åå°ãšããŠãåé·åã®èãæ¹ãçè§£ããŠããããšã¯DevSecOpsã®èгç¹ã§ãéèŠã§ããä»å瀺ããäŸã¯1000RPSãŸãã¯50,000ãŠãŒã¶ãŒãæ³å®ããå€§èŠæš¡ãªç°å¢ã§ããåã
ã®ãŠãŒã¹ã±ãŒã¹ã«é©ããGitLabã®æ§æãèšèšãããã®ç°å¢èŠæš¡ã«å¿ããŠã©ã®ã³ã³ããŒãã³ããåé·åããã¹ãã倿ããå¿
èŠããããŸããä»åã®èšäºããã®å€æææã®å©åã«ãªãã°å¹žãã§ãã åè GitLabã³ã³ããŒãã³ããªã¹ã https://docs.gitlab.com/development/architecture/#component-list GitLabãªãã¡ã¬ã³ã¹ã¢ãŒããã¯ã㣠https://docs.gitlab.com/administration/reference_architectures/ äŸïŒæå€§ 1000 RPS ãŸã㯠50,000 ãŠãŒã¶ãŒ https://docs.gitlab.com/administration/reference_architectures/50k_users/ ãã«ãããŒãGitLabåãããŒããã©ã³ãµãŒ https://docs.gitlab.com/administration/load_balancer/ GitLabã®è² è·åæ£ https://docs.gitlab.com/development/scalability ããŒã¿ããŒã¹è² è·åæ£ https://docs.gitlab.com/administration/postgresql/database_load_balancing/ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post GitLabã®åé·åæ§æã培åºè§£èª¬ïŒå®å®éçšã®ããã®å®è·µã¬ã€ã first appeared on SIOS Tech. Lab .
ã¯ããã« ååã®èšäºã§ã¯ã2åã«ãããGitLab CI/CDã®åºæ¬çãªãã€ãã©ã€ã³äœææ¹æ³ ã解説ããŸããããžã§ãã®å®çŸ©ããã¹ããŒãžã®æ§æãŸã§ãäžéãã®æµããå®éã«è©Šããªããçè§£ã§ãããšæããŸãã ããããå®éã«ããŒã éçºãé²ããŠãããšããã€ãã©ã€ã³ã®å®çŸ©ãã¡ã€ã«ã§ãã.gitlab-ci.ymlãããã«è¥å€§åããã¡ã§ãã åãåŠçãè€æ°ã®ãžã§ãã«æžããŠããŸã ãããžã§ã¯ãããšã«äŒŒããã㪠CI å®çŸ©ãã³ããããŠäœ¿ãåã ããããç¶æ
ã«ãªããšãä¿®æ£ãå
±éåãé£ãããªããéçšã³ã¹ããå¢ããŠããŸããŸãã ããã§ä»åã®èšäºã§ã¯ãGitLab CI/CDãçšæããŠãã include ãš extends ã®ä»çµã¿ã«æ³šç®ããŸããããããæŽ»çšããããšã§ãèšå®ãæŽçããåå©çšããããåœ¢ã«æŽããããšãã§ããŸãã å°ããªæ€èšŒãéããŠãããããã®æ©èœãã©ã®ããã«åœ¹ç«ã€ãã玹ä»ããŠãããŸãã includeæ©èœïŒå€éšãã¡ã€ã«ã®ã€ã³ããŒã includeã¯ãå¥ãã¡ã€ã«ã«æžãããCIå®çŸ©ãåãèŸŒãæ©èœã§ããå¥ã®ãããžã§ã¯ãã«ãããã¡ã€ã«ãèªã¿èŸŒããã®ã倧ããªç¹åŸŽã§ããä»åã®æ€èšŒã§ã¯ããã¹ãçšã«GitLabäžã§ 2 ã€ã®ãããžã§ã¯ããçšæããäžæ¹ã®ãããžã§ã¯ãã«ãããã€ãã©ã€ã³å®çŸ©ããããäžæ¹ã®ãããžã§ã¯ãããincludeã§èªã¿èŸŒã圢ã確èªããŸããã æ€èšŒç°å¢ ã¡ã€ã³ãããžã§ã¯ãïŒrunner-test-project-1 .gitlab-ci.ymlïŒå®éã«ãã€ãã©ã€ã³ãå®è¡ããå®çŸ©ãã¡ã€ã«ïŒ ã€ã³ããŒãçšãããžã§ã¯ãïŒrunner-test-project-2 ci/shared.ymlïŒä»ã®ãããžã§ã¯ãããåã蟌ãã§äœ¿ãããã®ãžã§ãå®çŸ©ãã¡ã€ã«ïŒ èšå®äŸïŒå®è¡åŽïŒ # runner-test-project-1/.gitlab-ci.yml variables:   FROM_PROJECT: "overridden-in-runner-test-project-1" include:   - project: "group/runner-test-project-2"     ref: "main"     file: "/ci/shared.yml" stages: [test] check-local:   stage: test   script:     - echo "FROM_PROJECT=${FROM_PROJECT}" èšå®äŸïŒincludeãããåŽïŒ # runner-test-project-2/ci/shared.yml project-job:   stage: test   variables:     FROM_PROJECT: "default-in-provider-project"   script:     - echo "FROM_PROJECT=${FROM_PROJECT}" å®è¡çµæ check-localïŒããŒã«ã«ãžã§ãïŒãš project-jobïŒå€éšãžã§ãïŒãã©ã¡ãããã€ãã©ã€ã³ã«è¡šç€ºããã ãã¹ãŠã®ãžã§ããæå FROM_PROJECT=overridden-in-runner-test-project-1 ãåºåãããå®è¡åŽã®å€æ°ãåªå
ãããããšãç¢ºèª ãã€ã³ã 倿°ã®äžæžã ïŒåãååã®å€æ°ãè€æ°å®çŸ©ãããŠããå Žåãæçµçã«ã¯ã¡ã€ã³ã®.gitlab-ci.ymlãã¡ã€ã«ã§å®çŸ©ãããå€ãåªå
ãããŸããå€éšãã¡ã€ã«åŽã¯ããã©ã«ãå€ã眮ããç°å¢äŸåã®å€ã¯ã¡ã€ã³åŽã§äžæžãããã®ããã¹ãã§ãã æš©é ïŒå®è¡ãããŠãŒã¶ãŒãåç
§å
ãªããžããªãèªãæš©éãæã£ãŠããå¿
èŠããããŸããå®å®éçšã®ããã«ã¯ãåç
§å
ã»åç
§å
ãåãã°ã«ãŒãå
ã«ãŸãšããŠãããšããã§ãããã ref ã®åºå® ïŒmain ãåç
§ãããšãå€éšãã¡ã€ã«ã®å€æŽãå³åº§ã«åæ ãããŠããŸããããå®å®æ§ãéèŠãããªããã¿ã°ããªãªãŒã¹ãã©ã³ããæå®ããã®ãããããã§ãã åèïŒ Use CI/CD configuration from other files | GitLab Docs extendsæ©èœïŒå
±éèšå®ã®ç¶æ¿ extendsã¯ããžã§ãããšã«å
±éããèšå®ããã³ãã¬ãŒããšããŠãŸãšããããããç¶æ¿ã§ããä»çµã¿ã§ããåãåŠçã倿°ãç¹°ãè¿ãèšè¿°ããã«æžãã®ã倧ããªç¹åŸŽã§ããä»åã®æ€èšŒã§ã¯ãå
±éèšå®ã.default-templateãšããŠå®çŸ©ããjob_aã§ã¯ãã®ãŸãŸç¶æ¿ãjob_bã§ã¯äžéšã®å€æ°ãäžæžããã圢ã確èªããŸããã æ€èšŒç°å¢ ä»»æã®ãããžã§ã¯ãã« extends-gitlab-ci.yaml ãäœæããæ¬¡ã®å
容ãèšè¿°ããŸããã èšå®äŸ stages: [test] # å
±éèšå®ïŒãã³ãã¬ãŒãïŒ .default-template:   stage: test   image: registry.gitlab.local.example.com/root/registry-project/alpine:latest   tags:     - devsecops-runner   before_script:     - echo "BEFORE(from base) run common setup"   variables:     BASE_VAR: from-base     OVERRIDE_ME: from-base # ç¶æ¿ã®ã¿ïŒäžæžããªãïŒ job_a:   extends: .default-template   script:     - echo "A BASE_VAR=$BASE_VAR OVERRIDE_ME=$OVERRIDE_ME"     - echo "A IMAGE=$(cat /etc/alpine-release 2>/dev/null || echo unknown)" # äžéšäžæžãïŒvariables ãäžæžãïŒ job_b:   extends: .default-template   variables:     OVERRIDE_ME: from-job-b   script:     - echo "B BASE_VAR=$BASE_VAR OVERRIDE_ME=$OVERRIDE_ME" å®è¡çµæ ãã¹ãŠã®ãžã§ããæå job_a BASE_VAR=from-base OVERRIDE_ME=from-base before_script ã® “BEFORE(from base) run common setup” ãå®è¡ãããimage ã alpine:latest ãå©çšãããŠãã job_b â 倿° OVERRIDE_ME ã¯ãžã§ãåŽã®å€ã§äžæžããBASE_VAR ã before_script ã¯ãã³ãã¬ãŒãã®å€ããã®ãŸãŸåæ ãããŠãã BASE_VAR=from-baseïŒãã³ãã¬ãŒãã®ãŸãŸïŒ OVERRIDE_ME=from-job-bïŒãžã§ãåŽã®å€ã§äžæžãïŒ before_script ãš image ã¯ãã³ãã¬ãŒãã®èšå®ãé©çšãããŠãã ãã€ã³ã å
±éåã®ã¡ãªãã ïŒbefore_script ã倿°ããã³ãã¬ãŒãã«ãŸãšããããšã§ãä¿®æ£ãå¿
èŠã«ãªã£ãéã«1ç®æãçŽãã ãã§å
šãžã§ãã«åæ ã§ããŸããçµæãšããŠããžã§ããã³ãã¬ãŒãã®ç®¡çãä¿å®ãã·ã³ãã«ã«ãªãã圱é¿ç¯å²ãæç¢ºã«ææ¡ã§ããŸãã 倿°ã®äžæžã ïŒãã³ãã¬ãŒããšãžã§ãã®äž¡æ¹ã«åãããŒãå®çŸ©ãããŠããå Žåããžã§ãã§å®çŸ©ãããå€ãåªå
ãããŸãããã³ãã¬ãŒãã¯å
±éã®å€ãèšå®ããå¿
èŠã«å¿ããŠãžã§ãåŽã§äžæžãããã®ãåºæ¬çãªäœ¿ãæ¹ã§ãã åèïŒ Optimize GitLab CI/CD configuration files ãŸãšã includeã䜿ããšãå€éšãã¡ã€ã«ãåã蟌ãã§ å
±éãžã§ããè€æ°ã®ãããžã§ã¯ãã§åå©çšã§ããŸãã extendsã䜿ããšãå
±éèšå®ããã³ãã¬ãŒãåããŠãžã§ãããšã®å·®åã ããç°¡æœã«èšè¿°ã§ããŸãã ã©ã¡ãã®æ©èœããè€éåãããã .gitlab-ci.yml ãæŽçãã倿Žãä¿å®ãå¹çåããããã«æ¬ ãããªãä»çµã¿ã§ãã ããŒã ããããžã§ã¯ãã倧ãããªãã»ã©ããã€ãã©ã€ã³ã®ç®¡çã¯é£ãããªããŸããinclude ãšextendsãæŽ»çšããã°ãCI/CD èšå®ãã·ã³ãã«ãã€åå©çšæ§ã®é«ãåœ¢ã«æŽããå€§èŠæš¡ãªéçºç°å¢ã§ãå®å®ããŠéçšã§ããåºç€ãäœãããšãã§ããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post GitLab CI/CD å®è·µïŒ»å¿çšç·šïŒœïŒå
±éèšå®ãšå€éšãã¡ã€ã«ã®å©çš first appeared on SIOS Tech. Lab .
æ¬æžã¯ã2025幎8æã«å
¬éãã ãã€ã¯ããµãŒãã¹åã®èª²é¡ãšãã®è§£æ±ºç ã«é¢ãããã¯ã€ãããŒããŒã玹ä»ãããã®ã§ãã ãããžãã¹ã®å€åã«æè»ãã€ã¹ããŒãã£ãŒã«å¯Ÿå¿ããããã®ãã€ã¯ããµãŒãã¹åã ã£ãã¯ããããªããéçºã¯é
ããªããéçšã¯è€éæªå¥ã忣ã¢ããªã¹ã®ããã«ãªã£ãŠããŸã£ãâŠã ãããèªè
ã®çæ§ãäŒæ¥ã®æè¡ãªãŒããŒãã¢ãŒããã¯ããšããŠãå°ãã§ãå¿åœããã®ããã®ã§ããã°ãæ¬æžããå§ãããããŸããããã«ãAIæä»£ã®ãã€ã¯ããµãŒãã¹åã«ãããŠã¯ãå¥ã®åé¡ãåŸ
ã¡æ§ããŠããããšãæèããå¿
èŠããããŸãã AIãçã¿åºããã€ã¯ããµãŒãã¹åã®æ°ããèª²é¡ ãåç¥ã®éããçæAIã¯ãé©ç°çãªã¹ããŒãã§ã³ãŒããçæããŸããããããäžæ¹ã§ã¯ããžãã¹ã®æå³ãæ±²ã¿åãããšãèŠæã§ãã ãã®çµæãAIãé«éã§çæããã³ãŒãããæ°ã¥ãã¬ãã¡ã«ãµãŒãã¹ããŸãããããŒã¿ã®æŽåæ§ãç Žå£ããããžãã¹ã«èŽåœå·ããããããããŸãããããã¯äººéã«ããä»å
¥ãå¿
èŠãªéšåãªã®ã§ããåŸæ¥ã®Sagaãã¿ãŒã³ã®ãããªè€éãªææ³ã®ã¿ã§ã¯ãAIã倧éã«çã¿åºãã³ãŒãã®æŽåæ§ã人éãæ€èšŒãç¶ããã«ã¯ããã¯ãéçã«è¿ã¥ããŠããŸãã 課é¡ã®å
šäœåãšè§£æ±ºãžã®ã¢ãããŒã ãã®åºŠå
¬éãããã¯ã€ãããŒããŒããã€ã¯ããµãŒãã¹åã®èª²é¡ãšãã®è§£æ±ºçãã§ã¯ããã€ã¯ããµãŒãã¹åã«é¢ããæ§æ¥ããã®èª²é¡ã«å¯ŸããŠã¯ãåãªãæè¡è«ã®ã¿ã§ã¯ãªããæè¡è«ããäžæ©é¢ããçµç¹è«ããæ€èšããäœç³»çãªã¢ãããŒãã§ã®è§£æ±ºçãææ¡ããŸããæŽã«ãAIæä»£ã®ãã€ã¯ããµãŒãã¹åºæã®èª²é¡ã§ããããŒã¿æŽåæ§æ
ä¿ã«å¯Ÿãã解決çãšããŠã匷åãªéžæè¢ã®äžã€ãšãªãåŸã ScalarDB ã玹ä»ããŸãã ãã¯ã€ãããŒããŒã®æ§æïŒ11ããŒãžïŒ 第1éšïŒåé¡æèµ· – ãªããã€ã¯ããµãŒãã¹åã¯å€±æããã®ã 第2éšïŒSIOS APIãšã³ã·ã¹ãã ãšScalarDBã«ããå
æ¬ç解決ç 第3éšïŒå®è·µçãã¬ãŒããªããšå
žåçãªèšèšãã¿ãŒã³ 第4éšïŒçµè« çµéšè±å¯ãªã¢ãŒããã¯ãã®çæ§ãž 第3éšã§ã¯ãæ¬æžã®èšèŒã«å¯ŸããŠçµéšè±å¯ãªã¢ãŒããã¯ãã§ããã°ããæ±ãã§ããã劥åœãªçåã«å¯ŸããŠãæ£é¢ããåãåããŸãã ççµåãšãæéçã«ãããªã³ã°ãã®æ¿æã¿ 2PCã®æ§èœãªãŒããŒããããšTCOïŒç·ææã³ã¹ãïŒ ã¢ããªã±ãŒã·ã§ã³å±€ããã€ã³ãã©å±€ãžã®è€éæ§ã®ç§»åã¯åé¡è§£æ±ºã«ãªããïŒ ã¹ãã©ã³ã°ã©ãŒãã£ã°ãã¿ãŒã³ãžã®å¿çš âŒãã¯ã€ãããŒããŒã®ããŠã³ããŒãã¯ãã¡ããã https://api-ecosystem.sios.jp/scalar/download/scalarsiosapi01.html ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ãã€ã¯ããµãŒãã¹åã®æ°æ§èª²é¡ã®è§£æ±ºçãææ¡ãããã¯ã€ãããŒããŒã®çŽ¹ä» first appeared on SIOS Tech. Lab .
ã¯ããã« ããã«ã¡ã¯ïŒçããããã°ã飿ããŠãããªãŒãã§ããä»åã¯Claude Code UIãã€ã³ã¹ããŒã«ããéã«ã€ãŸã¥ããããšã«ã€ããŠæžãããšæããŸãã æè¿ãAIãæŽ»çšããéçºããŒã«ã次ã
ãšç»å ŽããŠããŸããããã®äžã§ãClaude Code UIã¯ç¹ã«æ³šç®ãéããŠããŸããããããWindowsç°å¢ã§ã®ã€ã³ã¹ããŒã«ã«ã¯æå€ãªèœãšã穎ãããããšãããããŸãããåãåé¡ã§æ©ãæ¹ã®ã圹ã«ç«ãŠãã°ãšæããè§£æ±ºæ¹æ³ããŸãšããŠã¿ãŸããã æéããªãæ¹ã®ããã« Claude Code UIãWindowsç°å¢ã§ã€ã³ã¹ããŒã«ããéã¯ãVisual Studio Installerãã以äžã®2ã€ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãïŒ ã¯ãŒã¯ããŒããC++ã«ãããã¹ã¯ãããéçºã åå¥ã®ã³ã³ããŒãã³ããææ°ã®Spectre 軜æžã®ã©ã€ãã©ãªã ãããããªããšã npm install æã«ãã«ããšã©ãŒãçºçããŸãã Claude Code UIãšã¯ Claude Code UIã¯ãAnthropic瀟ã®Claude Code CLIãCursor CLIãWebãã©ãŠã¶çµç±ã§æäœã§ããããã«ããWebã¢ããªã±ãŒã·ã§ã³ã§ããããã«ãããããŒã«ã«ç°å¢ã ãã§ãªããã¹ããŒããã©ã³ãã¿ãã¬ãããªã©ã®ã¢ãã€ã«ããã€ã¹ãããAIãæŽ»çšããã³ãŒãã£ã³ã°ãå¯èœã«ãªããŸãã äž»ãªç¹åŸŽ ãã©ãŠã¶ããŒã¹ã®ã¿ãŒããã«ã€ã³ã¿ãŒãã§ãŒã¹ Claude CodeãCursorã®å
šæ©èœãWeb UIããå©çšå¯èœ ã¢ãã€ã«ãã¬ã³ããªãŒãªã¬ã¹ãã³ã·ããã¶ã€ã³ Cloudflare Tunnelãªã©ãšçµã¿åãããŠãã©ãããã§ãã¢ã¯ã»ã¹å¯èœ GitHubãªããžããªïŒhttps://github.com/siteboon/claudecodeui é¢é£ããããã€ãã®ããã°ãæçš¿ãããŠããŸãã ã¹ããã§Claude CodeïŒïŒå€åºå
ã§Claude Codeã䜿ã£ãŠã¿ãïŒïŒ ïŒãã¡ãã¯åŒç€Ÿã®çްå·åã®èšäºãªã®ã§ãã²èªãã§ãã ããïŒïŒ ã培åºè§£èª¬ãClaude Code UI ãš Cloudflare Tunnelã§ã¹ããããå¿«é©ã«AIã³ãŒãã£ã³ã° Claude Code UIã¬ãã¥ãŒïŒã¹ããããã§ãAIã³ãŒãã£ã³ã°ãå¯èœã«ïŒéçºå¹çãåçåäž ã€ã³ã¹ããŒã«æé ãšééããåé¡ åææ¡ä»¶ã®ç¢ºèª READMEã«ãããšã以äžã®åææ¡ä»¶ãå¿
èŠã§ãïŒ Prerequisites Node.js v20 or higher Claude Code CLI installed and configured, and/or Cursor CLI installed and configured ç§ã®PCã«ã¯ãã§ã«v20以äžã®Node.jsãšClaude Code CLIãã€ã³ã¹ããŒã«æžã¿ã ã£ãã®ã§ããã£ããã€ã³ã¹ããŒã«ãéå§ããŸããã ã€ã³ã¹ããŒã«éå§ ãŸãã¯ãªããžããªãCloneããŸãã git clone https://github.com/siteboon/claudecodeui.git Cloneããããããã£ã¬ã¯ããªãç§»åããŸãã cd claudecodeui ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã npm install æåã®ãšã©ãŒïŒVisual Studio C++ããŒã«ã»ãããèŠã€ãããªã $ npm install npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory... ïŒäžç¥ïŒ npm error gyp ERR! find VS - found "Visual Studio C++ core features" npm error gyp ERR! find VS - missing any VC++ toolset npm error gyp ERR! find VS could not find a version of Visual Studio 2017 or newer to use npm error gyp ERR! find VS npm error gyp ERR! find VS ************************************************************** npm error gyp ERR! find VS You need to install the latest version of Visual Studio npm error gyp ERR! find VS including the "Desktop development with C++" workload. npm error gyp ERR! find VS For more information consult the documentation at: npm error gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows npm error gyp ERR! find VS ************************************************************** ãã£ããé·ããšã©ãŒãçºçããŠæåã¯é©ããŸããããããèŠããšæå³ã¯æç¢ºã§ããã ãšã©ãŒã®åå ïŒ node-pty ãšããNode.jsã®ãã€ãã£ãã¢ãžã¥ãŒã«ã®ãã«ãã§ãšã©ãŒãçºçããŠããŸãã node-pty ã¯ç䌌ã¿ãŒããã«ïŒPTYïŒãäœæããããã®ã¢ãžã¥ãŒã«ã§ãClaude Code UIã®ã¿ãŒããã«æ©èœã«å¿
èŠäžå¯æ¬ ã§ãã Windowsã§ãã®ãããªãã€ãã£ãã¢ãžã¥ãŒã«ããã«ãããã«ã¯ãC++ã®ã³ã³ãã€ã©ããŒã«ãã§ãŒã³ãå¿
èŠãšãªããŸãããšã©ãŒã¡ãã»ãŒãžã¯ãVisual Studioã®C++éçºããŒã«ãèŠã€ãããªãã®ã§ãææ°ã®Visual Studioãã€ã³ã¹ããŒã«ããŠãC++ã«ãããã¹ã¯ãããéçºãã¯ãŒã¯ããŒããã€ã³ã¹ããŒã«ããŠãã ããããšæããŠãããŠããŸãã 解決ç1ïŒVisual Studio C++éçºç°å¢ã®ã€ã³ã¹ããŒã« Visual Studio InstallerãéããŸããVisual Studioãã€ã³ã¹ããŒã«ãããŠããªãæ¹ã¯ã ãã¡ã ããããŠã³ããŒãããŠãã ããã ã倿Žããã¯ãªãã¯ããŸãã ãã¯ãŒã¯ããŒããã¿ãã§ãC++ã«ãããã¹ã¯ãããéçºããéžæããŠã€ã³ã¹ããŒã«ãã¯ãªãã¯ããŸããïŒçè
ã¯ã€ã³ã¹ããŒã«æžã¿ã®ããããã¿ã³ããéãããã«ãªã£ãŠããŸãïŒ ã€ã³ã¹ããŒã«ãçµãã£ãããå床ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããã³ãã³ããå®è¡ããŸãã npm install 2åç®ã®ãšã©ãŒïŒSpectre軜æžã©ã€ãã©ãªãå¿
èŠ $ npm install npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory... ïŒäžç¥ïŒ npm error C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(511,5): error MSB8040: Spectre 軜æžã®ã©ã€ãã©ãªã¯ããã®ãããžã§ã¯ãã«å¿
èŠã§ãã䜿çšãããŠããããŒã«ã»ãããšã¢ãŒããã¯ãã£ã«ã€ããŠã¯ãVisual Studio ã€ã³ã¹ããŒã©ãŒ (åã
ã®ã³ã³ããŒãã³ã ã¿ã) ããã€ã³ã¹ããŒã«ããŸãã詳现æ
å ±: https://aka.ms/Ofhn4c ä»åºŠã¯ãSpectre 軜æžã®ã©ã€ãã©ãªããå¿
èŠãšãããšã©ãŒãçºçããŸããã Spectreãšã¯ïŒ 2018幎ã«çºèŠãããCPUã®è匱æ§ã§ãææ©çå®è¡ãšããé«éåæè¡ã®å¯äœçšãæªçšããŠãæ¬æ¥ã¢ã¯ã»ã¹ã§ããªãã¡ã¢ãªé åã®æ
å ±ãçã¿èŠãããšãã§ããæ»æææ³ã§ããMicrosoftã¯ãããã®ã»ãã¥ãªãã£ãªã¹ã¯ããWindowsã¢ããªã±ãŒã·ã§ã³ãä¿è·ãããããVisual Studioã«ç¹å¥ãªè»œæžã©ã€ãã©ãªãæäŸããŠããŸãã æè¿ã®ãããžã§ã¯ãã§ã¯ãã»ãã¥ãªãã£äžã®çç±ããããããã®è»œæžã©ã€ãã©ãªã䜿çšããããšãããã©ã«ãã§èŠæ±ãããããšãå€ããªã£ãŠããŸãã 解決ç2ïŒSpectre軜æžã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« 蚺æã³ãŒãMSB8040ã®è§£æ±ºç㯠Microsoftå
¬åŒãªãã¡ã¬ã³ã¹ ã«èšèŒãããŠããéããVisual Studio Installerã®ãåå¥ã®ã³ã³ããŒãã³ããã¿ãããææ°ã®Spectre軜æžã©ã€ãã©ãªãéžæããŠã€ã³ã¹ããŒã«ããŸãã ã€ã³ã¹ããŒã«ãçµãã£ãããäžåºŠç®ã®æ£çŽã§ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããã³ãã³ããå®è¡ããŸãã npm install ã€ã³ã¹ããŒã«æåïŒ $ npm install npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory... ïŒèŠåã¯ç¶ããŸããããããã¯äŸåé¢ä¿ã®èŠåãªã®ã§åé¡ãããŸããïŒ added 613 packages, and audited 614 packages in 2m 141 packages are looking for funding run `npm fund` for details 1 low severity vulnerability To address all issues, run: npm audit fix Run `npm audit` for details. ãã£ãšã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ãæåããŸããïŒèŠåã¯ããã€ã衚瀺ãããŠããŸããããããã¯äŸåããã±ãŒãžã®éæšå¥šã«é¢ãããã®ãªã®ã§ãåäœã«ã¯åœ±é¿ããŸããã ããšã¯ README.md ã«æžããŠããéãã«å®è¡ããã ãã§ãïŒ ãã©ãã«ã·ã¥ãŒãã£ã³ã° ããåæ§ã®åé¡ã«ééããå Žåã¯ã以äžã®ç¹ã確èªããŠãã ããïŒ 1. Visual Studioã®ããŒãžã§ã³ Visual Studio 2017以éãå¿
èŠã§ã Communityçã§åé¡ãããŸãã 2. å¿
èŠãªã³ã³ããŒãã³ã å¿
é : C++ã«ãããã¹ã¯ãããéçºïŒã¯ãŒã¯ããŒãïŒ å¿
é : ææ°ã®Spectre軜æžã®ã©ã€ãã©ãªïŒåå¥ã®ã³ã³ããŒãã³ãïŒ 3. Node.jsã®ããŒãžã§ã³ Node.js v20以äžãå¿
èŠã§ã node --version ã§ç¢ºèªã§ããŸã 4. æš©éã®åé¡ ç®¡çè
æš©éã§ã³ãã³ãããã³ãããå®è¡ããŠã¿ãŠãã ãã node_modules ãã©ã«ããåé€ããŠããå床 npm install ã詊ããŠãã ãã ãŸãšã ä»åã¯Claude Code UIãWindowsç°å¢ã§ã€ã³ã¹ããŒã«ããéã«ã€ãŸã¥ããããšã«ã€ããŠæžããŸãããäžèŠãããšåçŽãªnpmããã±ãŒãžã®ã€ã³ã¹ããŒã«ã§ããããã€ãã£ãã¢ãžã¥ãŒã«ãå«ãå Žåã¯ãVisual Studioã®C++ãã«ãããŒã«ãå¿
èŠã«ãªãããšããããŸãã ç¹ã«Windowsç°å¢ã§ã¯ã以äžã®2ã€ãå¿
èŠã§ãïŒ Visual Studioã®C++ã«ãããã¹ã¯ãããéçºã¯ãŒã¯ããŒã Spectre軜æžã®ã©ã€ãã©ãª ããããäºåã«ã€ã³ã¹ããŒã«ããŠããã°ãã¹ã ãŒãºã«ã»ããã¢ããã§ããã¯ãã§ãã æšä»ã®AIããŒã«ã®çºå±ã¯ããŸãããããã®ããããŸãããããããããŒã«ã掻çšããããšã§ãéçºå¹çã¯é£èºçã«åäžããŸããã€ã³ã¹ããŒã«ã§å°ãèŠåŽãããããããŸãããããã®äŸ¡å€ã¯ååã«ãããšæããŸãã AIããŒã«ã®é²åã«è² ããã«ã楜ããéçºããŠãããŸãããïŒ åèãªã³ã¯ Claude Code UI GitHub Repository Node.js Visual Studio Downloads MSB8040ãšã©ãŒã®è§£æ±ºæ¹æ³ïŒMicrosoftå
¬åŒïŒ node-gyp on WindowsïŒGitHubïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Claude Code UIãã€ã³ã¹ããŒã«ããéã«ã€ãŸã¥ããããš first appeared on SIOS Tech. Lab .
ã¯ããã« åå ã¯ãCI/CDã®åºæ¬ãããGitLab Runnerã®å°å
¥ããããŠã³ã³ããã€ã¡ãŒãžã®ãã«ãã»ããã·ã¥ã»ãããã€ãŸã§ãäžé£ã®ã¯ãŒã¯ãããŒã解説ããŸããã ä»åã¯ãããŒãžãªã¯ãšã¹ãïŒMRïŒã®éèŠãªåœ¹å²ã§ããã³ãŒãã¬ãã¥ãŒã«çŠç¹ãåœãŠãŸããã³ãŒãã¬ãã¥ãŒã¯ããã°ã®æ©æçºèŠãã³ãŒãå質ã®åäžãããã«ã¯ããŒã ã®ç¥èå
±æãä¿ããéçºããã»ã¹ã«æ¬ ãããªãäœæ¥ã§ãã æ¬èšäºã§ã¯ãGitLabã®MRæ©èœã掻çšããã¬ãã¥ãŒãã¹ã ãŒãºã«é²ããããã®å
·äœçãªæäœæ¹æ³ããã¬ãã¥ã¢ãŒïŒã¬ãã¥ãŒãã人ïŒãšã¬ãã¥ãŒã€ïŒã¬ãã¥ãŒããŠããã人ïŒã®äž¡æ¹ã®èŠç¹ãã解説ããŸãã ã³ãŒãã¬ãã¥ãŒã®æŠèŠ ã³ãŒãã¬ãã¥ãŒãšã¯ãä»ã®éçºè
ãæžããã³ãŒããèªã¿ããã£ãŒãããã¯ãæ¹åç¹ãè°è«ããããã»ã¹ã§ããããã¯ãåã«ãã°ãèŠã€ããã ãã§ãªããããŒã å
šäœã®ã³ãŒãå質ãé«ããç¥èãå
±æããéçºã®äžè²«æ§ãä¿ã€ããã«éèŠã§ãã GitLabã§ã¯ããã®ã³ãŒãã¬ãã¥ãŒã®ããã»ã¹ãããŒãžãªã¯ãšã¹ãïŒMRïŒã«çµ±åãããŠããŸããMRäžã§ã³ãŒãã¬ãã¥ãŒãè¡ãæµãã¯ä»¥äžã®ããã«ãªããŸãã ã¬ãã¥ãŒã€ïŒã¬ãã¥ãŒããŠããã人ïŒïŒæ§æãã§ãã¯åŸã«MRãäœæãããã€ãã©ã€ã³ã®èªåãã¹ããå®äºããŠããããšã確èªããã ã¬ãã¥ãŒã€ïŒã¬ãã¥ã¢ãŒãæå®ããŠã¬ãã¥ãŒäŸé Œãåºãã ã¬ãã¥ã¢ãŒïŒã¬ãã¥ãŒãã人ïŒïŒã¬ãã¥ãŒäŸé ŒãåãããMRç»é¢ã確èªããMRã®æŠèŠãææ¡ããã ã¬ãã¥ã¢ãŒïŒã³ãŒãã®å€æŽç¹ãžã®ã³ã¡ã³ãããã ã¬ãã¥ãŒã€ïŒMRã®ã¬ãã¥ãŒã確èªããã³ãŒãã®å€æŽãå¿
èŠãªå Žåã¯ä¿®æ£ããã ã¬ãã¥ã¢ãŒïŒã³ãŒãã®å€æŽç¹ã«åé¡ããªããã°MRãæ¿èªããã ã¬ãã¥ãŒã€ïŒMRãæ¿èªããããããŒãžããã ä»åã¯ã¬ãã¥ãŒã€ãæ¿èªãããã£ãããã¬ãã¥ãŒã€èªèº«ã§ããŒãžããæµãã§ç޹ä»ããŸãã æ¿èªã«è€æ°åå¿
é ãªå Žåãããã®ã§ããã¹ãŠã®æ¿èªè
ãæ¿èªããŠããããŒãžããããã«ã¬ãã¥ãŒã€èªèº«ã§ããŒãžããæµãã玹ä»ããŸãããã誰ãããŒãžãããã¯ããŒã æåã«äŸåããŸãã ããŒãžãªã¯ãšã¹ãã®ã¬ãã¥ãŒæ©èœçŽ¹ä» MRã®èšå® ããŒãžãªã¯ãšã¹ãïŒMRïŒãäœæããéãã¿ã€ãã«ã説æãæ
åœè
ãšãã£ãæ§ã
ãªé
ç®ãèšå®ã§ããŸãã ã¿ã€ãã« MRã®ç®çã瀺ããŸããäžç®ã§å
容ããããããã«ãfeat: æ°æ©èœè¿œå ãããfix: ãã°ä¿®æ£ããšãã£ãã«ãŒã«ïŒã³ãããèŠçŽïŒãé©çšããã®ãäžè¬çã§ãã 説æ 以äžã®ç¹ãæèããŠèšèŒãããšãã¬ãã¥ã¢ãŒã¯å
容ãçŽ æ©ãçè§£ã§ããŸãã ãªããã®å€æŽãå¿
èŠããšãã£ãèæ¯ãèª²é¡ äœã倿Žããããšãã£ãæè¡çãªè©³çް äœã確èªããŠã»ããããšãã£ãã¬ãã¥ãŒã®ãã€ã³ã é¢é£ããã€ã·ã¥ãŒçªå· æ
åœè
ãã®MRã®è²¬ä»»è
ãã¢ãµã€ã³ããŸããéåžžã¯äœæè
ïŒã¬ãã¥ãŒã€ïŒèªèº«ãã¢ãµã€ã³ããŸãã ã¬ãã¥ã¢ãŒ ã³ãŒãã¬ãã¥ãŒãäŸé Œãã人ãæå®ããŸãã ãã€ã«ã¹ããŒã³ ãããžã§ã¯ãã®ç¹å®ã®ãã§ãŒãºããªãªãŒã¹ç®æšã«MRãé¢é£ä»ããŸããæ¬¡ã®ããŒãžã§ã³ã®ãªãªãŒã¹ã«åããã¿ã¹ã¯ããŸãšããããšçãã§ããŸãã ã©ãã« MRãåé¡ããããã®ã¿ã°ä»ãæ©èœã§ããããã°ããããã¥ã¡ã³ãããç·æ¥ä¿®æ£ããªã©ã®ã©ãã«ãã€ããŠåé¡ããŸãã ããŒãžéå§æ¥æ ããŒãžãç¹å®ã®æ¥æã«ã¹ã±ãžã¥ãŒã«ããããã®æ©èœã§ããç¹å®ã®æéã«èªåã§ããŒãžãå®è¡ãããå Žåã«å©çšããŸããäŸãã°ãæ·±å€ã«èªåãããã€ãè¡ãéãªã©ã«äŸ¿å©ã§ããããŒãžãéå§ããã«ã¯ãCI/CDã®ãã¹ããæåããŠããç¶æ
ãªã©ã®ãã§ãã¯ã«åæ ŒããŠããå¿
èŠããããŸãã ããŒãžãªãã·ã§ã³ MRãæ¿èªããããšãã«ãœãŒã¹ãã©ã³ããåé€ããŸãã ããŒãžå®äºåŸã«ãäžèŠã«ãªã£ãäœæ¥çšãã©ã³ããèªåçã«åé€ããŸããããŒãžåŸã«ãã©ã³ããåé€ãå¿ããããšããªããªãããªããžããªãæŽçã§ããŸãã MRãæ¿èªããããšãã«ã³ããããã¹ã«ãã·ã¥ããŸãã ããŒãžããéã«ãè€æ°ã®ã³ãããã1ã€ã®å€§ããªã³ãããã«ãŸãšããæ©èœã§ããããŒãžæã«ã¯1ã€ã®ã³ããããšããŠå±¥æŽã«èšé²ã§ããŸããããã«ãããmainãã©ã³ãã®å±¥æŽãèŠãããä¿ãŠãŸãã ãã©ã³ãä¿è· 以åã®èšäº ã§è§£èª¬ããããã«ãmainã®ãããªéèŠãªãã©ã³ãã¯ä¿è·èšå®ãããããšãæšå¥šãããŸããããã«ãããMRãçµç±ããªãçŽæ¥ã®ããã·ã¥ãé²ããã¬ãã¥ãŒã®ããã»ã¹ã匷å¶ããŸãã Approveå¿
é å ãããžã§ã¯ãã®æ¿èªã«ãŒã«ãèšå®ããããšã§ãç¹å®ã®ããŒã ã¡ã³ããŒãã³ãŒããªãŒããŒããã®æ¿èªãããŒãžã«å¿
é ã§ããŸããäŸãã°ãã2人以äžã®ã¬ãã¥ãŒã¢ã®æ¿èªãå¿
èŠããšãã£ãã«ãŒã«ãèšå®ããããšã§ãã³ãŒãå質ã®ãã§ãã¯äœå¶ã匷åããŸãããã®èšå®ã¯ãPremium, Ultimateã®ãã©ã³ã§è¡ããŸããFreeçã§ã¯1äººã®æ¿èªå¿
é èšå®ãå¯èœã§ãã åèïŒ https://docs.gitlab.com/user/project/merge_requests/approvals/rules/ ã¬ãã¥ã¢ãŒïŒã¬ãã¥ãŒãã人ïŒã®èŠç¹ ã¬ãã¥ã¢ãŒãšããŠMRãã¢ãµã€ã³ããããã以äžã®ã¹ãããã§ã¬ãã¥ãŒãé²ããŸãããã MRç»é¢ã®ç¢ºèª ãŸããMRã®æŠèŠãææ¡ããŸãã MRã®ç®çãé¢é£ããã€ã·ã¥ãŒã倿Žã®æŠèŠã確èªããŸãã 倱æããCI/CDãã€ãã©ã€ã³ã®ãšã©ãŒãæªè§£æ±ºã®å Žåã¯ãããã§ã¬ãã¥ãŒãäžæããä¿®æ£ãäŸé ŒããŸãã 倿Žãããã³ãŒãã詳现ã«ç¢ºèªããŸãã以äžã®ç¹ãæèããŠç¢ºèªãããšãããšæããŸãã ã³ãŒãã®å質 å¢çå€ãå€§èŠæš¡ããŒã¿ã§ã®èšç®éãèæ
®ãããŠããã ãããžã§ã¯ãã®ã³ãŒãã£ã³ã°èŠçŽã«æºæ ããŠããã 倿Žç¹ãžã®ã³ã¡ã³ã ç¹å®ã®å€æŽç¹ã«ã³ã¡ã³ããä»ããããšã§ãã¬ãã¥ãŒã€ã«ãã£ãŒãããã¯ãäŒããŸãã 倿Žãããç¹å®ã®è¡ã«ã«ãŒãœã«ãåããããšãã³ã¡ã³ãã¢ã€ã³ã³ã衚瀺ãããŸããã¯ãªãã¯ãããšãã³ã¡ã³ãå
¥åæ¬ãçŸããŸãã ä¿®æ£æ¡ãã³ã¡ã³ãã§ææ¡ã§ããŸãã ãã¬ãã¥ãŒãéå§ã è€æ°ã®ç®æã«ããããã£ãŒãããã¯ãããŸãšããŠäžåºŠã«æçš¿ãããå Žåã«äœ¿ããã¿ã³ã§ãããã®ãã¿ã³ãã¯ãªãã¯ãããšãã³ã¡ã³ãã¯ããã«æçš¿ãããããä¿çäžã®ã³ã¡ã³ãããšããŠä¿åãããŸãããã¹ãŠã®ã¬ãã¥ãŒãçµããåŸãMRã®ç»é¢ã®ãYour reviewããããã¬ãã¥ãŒãéä¿¡ããã¿ã³ãã¯ãªãã¯ãããšãä¿çäžã®ãã¹ãŠã®ã³ã¡ã³ãããŸãšããŠæçš¿ãããŸãã ãä»ããã³ã¡ã³ãã远å ã ç¹å®ã®ã³ãŒãè¡ã«å¯ŸããŠãããã«æçš¿ãããåçºã®ã³ã¡ã³ãã«äœ¿ããã¿ã³ã§ãã æç¢ºãªæ£è§£ã¯ãããŸããããåºæ¬çã«ã¯ãã¬ãã¥ãŒãéå§ãã§ãã£ãŒãããã¯ããŸãšãããä»ããã³ã¡ã³ãã远å ãã§ç·æ¥æ§ã®é«ãã·ã³ãã«ãªã³ã¡ã³ããéãã®ãè¯ããšæããŸããäŸãã°ã倧ããã®ãªãã¡ã¯ã¿ãªã³ã°ã§ã¯ãã¬ãã¥ãŒãéå§ããå°ããªèª€åã§ã¯ãä»ããã³ã¡ã³ãã远å ããšãã£ã䜿ãåããã§ããŸãã ãææ¡ã ã³ã¡ã³ãå
¥åæ¬ã«ãããåè£ãæ¿å
¥ããããã¿ã³ãã¯ãªãã¯ããä¿®æ£åŸã®ã³ãŒããèšè¿°ããŸããããã«ãããã¯ã³ã¯ãªãã¯ã§ä¿®æ£ãé©çšã§ããããã«ãªããŸãã èšè¿°ãããããã®ä»ã³ã¡ã³ããšåæ§ã«ã³ã¡ã³ãã远å ããŸãã æ¿èªïŒApproveïŒ ã¬ãã¥ãŒãå®äºããããMRãæ¿èªããŸããã³ãŒãã«ä¿®æ£ãå¿
èŠãªå Žåã¯ãã¬ãã¥ãŒã€ã«ä¿®æ£äŸé Œãåºããä¿®æ£å®äºã®é£çµ¡ãããã£ããååºŠå€æŽã確èªããŠæ¿èªããŸãã 倿Žãé©åã§ãããšå€æããããMRç»é¢ã®ãæ¿èªããã¿ã³ãã¯ãªãã¯ããŸããããã¯ãã³ãŒããæ¿èªãããšããææè¡šç€ºã«ãªããŸãã ã¬ãã¥ãŒã€ïŒã¬ãã¥ãŒããŠããã人ïŒã®èŠç¹ ã¬ãã¥ãŒã€ã¯ãMRãäœæããŠãã¥ãŒãäŸé ŒããåŸãã¬ãã¥ã¢ãŒããã®ãã£ãŒãããã¯ã«å¯Ÿå¿ãã倿Žãå®äºãããŸããã¬ãã¥ãŒãå®äºãããããŒãžãè¡ããŸãã MRã®äœæ ããŒãžãããã©ã³ãã®ã³ãŒãã確èªããŠãã¬ãã¥ã¢ãŒã«èŠãŠããããç¶æ
ã«ããŸãã以äžã®ç¹ãæèããŠç¢ºèªãããšãããšæããŸãã ãã€ãã©ã€ã³ã®ãã¹ãçµæãæåããŠããã äžèŠãªãããã°ã³ãŒããã³ã¡ã³ããäžæãã¡ã€ã«ãæ®ã£ãŠããªãã ã¬ãã¥ã¢ãŒãæå®ããŠMRãäœæããŸããMRã®äœææé 㯠第5å ãåèã«ããŠã¿ãŠãã ããã ã³ã¡ã³ããžã®è¿ä¿¡ 質åã®ã³ã¡ã³ãã«å¯ŸããŠã¯æå³ã説æããè¿ä¿¡ãè¡ããŸããè°è«ãå¿
èŠãªå Žåã¯ãè¿ä¿¡ã§å¯Ÿè©±ãç¶ããŸãã æè¬ã®æãåžžã«å¿ããªãããã«ããŸãããã 倿Žã®é©çš ã¬ãã¥ã¢ãŒãããææ¡ããåãåã£ãå ŽåãGitLabã®æ©èœã䜿ã£ãŠç°¡åã«å€æŽãé©çšã§ããŸããããããææ¡ããã®ãŸãŸé©çšãããš1ã³ãããåäœã§å±¥æŽãå¢ãããããã³ãããããŸãšãããå Žåã¯ããŒã«ã«ã§ã®ä¿®æ£ãå¿
èŠã§ãããææ¡ãæ©èœã§ã¯ã³ãããã®ç²åºŠãå¶åŸ¡ãã«ãããããããŒã«ã«ã§ã®ä¿®æ£ãšã®äœ¿ãåããå¿
èŠã§ãã MRã®ã倿Žãã¿ãã§ãã³ã¡ã³ãã«ä»ããŠããã倿Žãé©çšããã¿ã³ãã¯ãªãã¯ããŸããã³ãããã¡ãã»ãŒãžãå
¥åããŠãé©çšããã¯ãªãã¯ããŸããããã§ãææ¡ããã倿Žãã³ããããšããŠè¿œå ã§ããŸãã 衚瀺ããã³ããããææ°ããŒãžã§ã³ã«å€æŽããŸãã ææ¡ããã倿Žãé©çšãããŠããããšã確èªã§ããŸããããã§ãç°¡åã«å€æŽãé©çšã§ããŸããã 远å ã³ããããšåããã·ã¥ è€éãªä¿®æ£ãå¿
èŠãªå Žåããææ¡ããŸãšããŠé©çšãããå Žåã¯ãããŒã«ã«ã§å€æŽãè¡ããå床ã³ãããããŠããã·ã¥ããŸããã³ã¡ã³ãã«å¯ŸããŠãã¹ãŠå¯Ÿå¿ãå®äºããããå床ã¬ãã¥ã¢ãŒã«é£çµ¡ããŠãæ¿èªãããããŸãã ããŒãž ã¬ãã¥ãŒãå®äºããããMRãæ¿èªããŠããŒãžããŸãã æ¿èªã«ãŒã«ãæºãããããã¹ãŠã®ãã§ãã¯ãå®äºããããMRç»é¢ã®ãããŒãžããã¿ã³ãã¯ãªãã¯ããŠããã©ã³ããããŒãžããŸãã ãŸãšã ä»åã¯ãGitLabã®ããŒãžãªã¯ãšã¹ããåãªãããŒãžã®ç³è«ã§ã¯ãªããã³ãŒãã¬ãã¥ãŒã®å ŽãšããŠæŽ»çšããæ¹æ³ã解説ããŸããã ã¬ãã¥ã¢ãŒã¯ãMRç»é¢ã確èªããå
·äœçãªã³ã¡ã³ããææ¡ã䜿ã£ãŠãã£ãŒãããã¯ãäŒããŸããäžæ¹ãã¬ãã¥ãŒã€ã¯ãã³ã¡ã³ãã«é©åã«å¯Ÿå¿ããä¿®æ£ãè¿
éã«åæ ãããããšãéèŠã§ããMRã§ã¬ãã¥ãŒãè¡ãããšã§ãã¬ãã¥ãŒã®å±¥æŽãæ®ããéçºã®éææ§ãåäžããŸãã MRã®æ©èœã䜿ãããªãããšã§ãããŒã å
šäœã®ã³ãŒãå質ãåäžããå¹ççãªéçºãå¯èœã«ãªããŸãã åèæç® https://docs.gitlab.com/user/project/merge_requests/reviews/ https://docs.gitlab.com/user/project/merge_requests/approvals/rules/ https://qiita.com/C_HERO/items/c5cfbdbb269efb72fb8f https://bake0937.hatenablog.com/entry/2019/10/24/145241 ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Git & GitLab å
¥é (9) ïœGit ãã¹ã¿ãŒãžã®éïœãã³ãŒãã¬ãã¥ãŒã®é²ãæ¹ã first appeared on SIOS Tech. Lab .
ã¯ããã« ååã®èšäº ã§ã¯ãåäžã®ãžã§ããã¹ãããããšã«å®è¡ããã·ã³ãã«ãªãã€ãã©ã€ã³ã顿ã«ãGitLab CI/CDã®åºæ¬çãªä»çµã¿ã確èªããŸãããããããå®éã®éçºçŸå Žã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãããã¹ãããããã€ãªã©è€æ°ã®åŠçãçµã¿åãããæ®µéçã«å®è¡ããããšãæ±ããããŸããä»åã¯ãã®å®è·µç·šãšããŠãè€æ°ã®ãžã§ããã€ãªãåãããŠã¹ããŒãžããšã«å®è¡ãããã«ãã¹ããŒãžãã€ãã©ã€ã³ã®èšè𿹿³ã玹ä»ããŸããããã«ãäœæãããã€ãã©ã€ã³ãå¹ççã«ç®¡çã»éçšããããã®å®è¡ç®¡çã®ãã€ã³ãã«ã€ããŠã解説ããŸãã åææ¡ä»¶ æ¬èšäºã§ã¯ãããããã以äžã®ç°å¢ãæ§ç¯ãããŠããããšãåæãšããŸããç°å¢ã®è©³çŽ°ãªæ§ç¯æé ã«ã€ããŠã¯ã ç°å¢æ§ç¯ç·šã®èšäº ããåç
§ãã ããã GitLabïŒSelf-ManagedçïŒ LinuxãµãŒããŒã«Omnibusããã±ãŒãžã§ã€ã³ã¹ããŒã«æžã¿ Community EditionïŒç¡åçïŒãå©çš èªå·±çœ²åèšŒææžãå©çšããå
éšDNSã«ããåå解決ãå¯èœ Gitlab Runner OpenShiftã¯ã©ã¹ã¿ãŒäžã«ãããã€æžã¿ Kubernetes Executorãå©çšããCI/CDãžã§ããPodãšããŠå®è¡å¯èœ ã¬ãžã¹ããªèªèšŒæ
å ±ããªã³ã¯ããServiceAccountãå©çšå¯èœ ex. oc secrets link gitlab-runner-sa gitlab-registry-secret –for=pull OpenShiftã¯ã©ã¹ã¿ãŒ éåç°å¢ïŒã€ã³ã¿ãŒããã鿥ç¶ïŒã«æ§ç¯ èžã¿å°ãµãŒããŒããocã³ãã³ãã§æäœå¯èœ GitLab Container Registry ã³ã³ããã€ã¡ãŒãžã®push / pullã«å©çš èªå·±çœ²åèšŒææžã®ãããCAèšŒææžãRunner / ããŒãã«ç»é²æžã¿ èžã¿å°ãµãŒã㌠å
éšDNSãµãŒããŒãNFSãµãŒããŒãå
Œä»» å€éšã€ã³ã¿ãŒããããžã®æ¥ç¶ãå¯èœ ocã³ãã³ãã§OpenShiftãæäœå¯èœ podmanã§ã³ã³ããã€ã¡ãŒãžã® push / pull ãå¯èœ ãããã®ç°å¢ãå©çšããŠGitLab CI/CDãã€ãã©ã€ã³ãå®è¡ãããã«ããããããã€ãŸã§ã®æµããæ€èšŒã§ããŸãã ãŸããæ¬èšäºã§ã¯ä»¥äžã®ããã«ãã¹ãçšã®ãããžã§ã¯ããšãã©ã³ããçšæããŠæ€èšŒããŸãã ãã¹ãçšãããžã§ã¯ãã®äœæ ä»»æã®åç§°ã§æ°èŠäœæïŒäŸ: test-projectïŒããã®ãããžã§ã¯ãã§ãžã§ããæ€èšŒããŸãã ãã¹ãçšãã©ã³ãã®äœæ æ¬èšäºã§ã¯multi-stage-testãã©ã³ããäœæããŠäœ¿çšããŠããŸãããmainãªã©ä»»æã®ãã©ã³ãã§ãæ€èšŒå¯èœã§ãã ãã«ãã¹ããŒãžãã€ãã©ã€ã³ã®äœææ¹æ³ ããã§ã¯ãå®éã«GitLabäžã§ãã«ãã¹ããŒãžãã€ãã©ã€ã³ãäœæããã¢ããªã±ãŒã·ã§ã³ã OpenShiftã¯ã©ã¹ã¿ãŒã«ãããã€ããäžé£ã®æµãã確èªããŸããä»åã®ãµã³ãã«ã§ã¯ããã€ã¡ãŒãžã®ãã«ãããšãKubernetes ãžã®ãããã€ããããããç¬ç«ããã¹ããŒãžãšããŠå®çŸ©ããŸãã ãã£ã¬ã¯ããªæ§æ ãŸãããããžã§ã¯ãã®ãã£ã¬ã¯ããªæ§æã¯ä»¥äžã®ãšããã§ãã ãœãŒã¹ã³ãŒããèšå®ãã¡ã€ã«ã«å ããCI/CDã®å®çŸ©ãã¡ã€ã«ïŒ.gitlab-ci.ymlïŒãšKubernetes ã®ãããã§ã¹ãïŒdeploy.yamlïŒãé
眮ããŠããŸãã . âââ .gitlab-ci.yml âââ Dockerfile âââ README.md âââ deploy.yaml âââ nginx.conf âââ web     âââ index.html åãã¡ã€ã«ã®åœ¹å² ãã¡ã€ã«å æŠèŠ Dockerfile ããŒã¹ãšãªãNginxã€ã¡ãŒãžã«ã¢ããªã®éçãã¡ã€ã«ãšNginxèšå®ãçµã¿èŸŒã¿ãããŒã8080ã§åŸ
ã¡åããã³ã³ãããäœæããŸãã nginx.conf ãã«ã¹ãã§ãã¯çšã®/healthzãšã³ããã€ã³ããšãããããŒãžã§index.htmlãè¿ãèšå®ã䜿çšããŒããå®çŸ©ããŠããŸãã web/index.html ãããã€æåã確èªããããã®ç°¡åãªHTMLããŒãžã§ãã deploy.yaml OpenShiftäžã«Deploymentãäœæããããã®ãããã§ã¹ãã§ããåŸè¿°ã®ãžã§ãã§${IMAGE}:${TAG}ã®éšåã眮æããå®éã«ãã«ãããã³ã³ããã€ã¡ãŒãžãæå®ããŸãã .gitlab-ci.yml CI/CD ãã€ãã©ã€ã³ã®å®çŸ©ã§ããbuildã¹ããŒãžã§ã€ã¡ãŒãžã®ãã«ããšããã·ã¥ãè¡ããdeployã¹ããŒãžã§Kubernetesãžé©çšããŸãã Dockerfile ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒã¹ã€ã¡ãŒãžã« nginx:1.29-alpine ãå©çšããŠããŸããéåç°å¢ã®ãããæ¬èšäºã§ã¯äºåã«ãã®ã€ã¡ãŒãžãGitLab Container Registryã«pushãããã®ã¬ãžã¹ããªãåç
§ãã圢㧠FROM ãæå®ããŠããŸãã FROM registry.gitlab.local.example.com/root/test-project/nginx:1.29-alpine # ã¢ããªéçãã¡ã€ã« COPY web/ /usr/share/nginx/html/ # Nginx èšå®ïŒããŒã8080ã§åŸ
åïŒ COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"] ãã®Dockerfileã§ã¯ãweb/index.htmlã/usr/share/nginx/html/ã«é
眮ããNginxãããŒã8080ã§èµ·åããããšã§ããã©ãŠã¶ãcurlããã¢ã¯ã»ã¹ãããšindex.htmlãè¿ãããã·ã³ãã«ãªæ§æã«ãªã£ãŠããŸãã nginx.conf ãã®nginx.confã¯ããŒã8080ã§åŸ
ã¡åãã/healthzã«200ãè¿ããã«ã¹ãã§ãã¯çšãšã³ããã€ã³ããå®çŸ©ããŠããŸãã ããã¥ã¡ã³ãã«ãŒã/usr/share/nginx/htmlã«é
眮ããindex.htmlããããããŒãžãšããŠè¿ããååšããªããã¹ãindex.htmlã«ãã©ãŒã«ããã¯ããã·ã³ãã«ãªèšå®ã§ãã server {   listen 8080 default_server;   server_name _;   # ãã«ã¹ãã§ãã¯çšïŒ200/okïŒ Â Â location = /healthz {     add_header Content-Type text/plain;     return 200 "ok\n";   }   root /usr/share/nginx/html;   index index.html;   location / {     try_files $uri $uri/ /index.html;   } } web/index.html ãããã€ã®åäœç¢ºèªçšã«çšæããã·ã³ãã«ãªéçãã¡ã€ã«ã§ãã Nginxã®ããã¥ã¡ã³ãã«ãŒãã«é
眮ããããã©ãŠã¶ãcurlã§ã¢ã¯ã»ã¹ãããšãããããŒãžãšããŠè¿ãããŸãããã€ãã©ã€ã³ã®æåãæ€èšŒãããå Žåã¯ããã®ãã¡ã€ã«ãç·šéããŠpushããããšã§ãæ°ããã€ã¡ãŒãžããã«ããããåãããã€åŸã«å€æŽå
容ã確èªã§ããŸãã <!doctype html> <html lang="ja">   <head><meta charset="utf-8"><title>Demo App</title></head>   <body>     <h1>Deploy Success v1.0.0.</h1>   </body> </html> deploy.yaml ã¢ããªã±ãŒã·ã§ã³ãOpenShiftã¯ã©ã¹ã¿ãŒäžã«ãããã€ããããã®Deploymentãããã§ã¹ãã§ããspec.template.spec.containers[0].imageã«ã¯ ${IMAGE}:${TAG}ãæå®ããŠãããCI/CDãã€ãã©ã€ã³å®è¡æã«ãã«ãããã€ã¡ãŒãžåãžçœ®æãããŸãã ã³ã³ããã¯ããŒã8080ãå
¬éãã/healthzãžã®HTTPå¿çãreadinessProbeãšããŠå©çšããããšã§ãPod ãæ£åžžã«èµ·åããŠããããå€å®ããŸãã apiVersion: apps/v1 kind: Deployment metadata:   name: multi-stage-demo-deploy   namespace: gitlab-runner-test spec:   replicas: 1   selector:     matchLabels:       app: multi-stage-demo   template:     metadata:       labels:         app: multi-stage-demo     spec:       serviceAccountName: gitlab-runner-sa       imagePullSecrets:         - name: gitlab-registry-secret       containers:         - name: multi-stage-demo-app           image: ${IMAGE}:${TAG}           imagePullPolicy: Always           ports:             - containerPort: 8080           readinessProbe:             httpGet:               path: /healthz               port: 8080             initialDelaySeconds: 3             periodSeconds: 5 .gitlab-ci.yml ãã®.gitlab-ci.yml㯠2ã¹ããŒãžïŒbuild â deployïŒæ§æã§dindã䜿ã£ãŠã€ã¡ãŒãžããã«ãâã¬ãžã¹ããªãžpush âOpenShiftãžã®ãããã€ãŸã§ãèªååããŸãããŸãå®çŸ©å
šäœã瀺ãããã®åŸã«å®è¡ãããŒã解説ããŸãã stages:   - build   - deploy default:   tags: [devsecops-runner] build_image:   stage: build   image: registry.gitlab.local.example.com/root/registry-project/docker:28.3.3   services:     - name: registry.gitlab.local.example.com/root/registry-project/docker:28.3.3-dind       alias: docker       entrypoint: ["/bin/sh","-lc"]       command:         - >           cp /etc/gitlab-runner/certs/gitlab.local.example.com.crt /usr/local/share/ca-certificates/ca.crt &&           update-ca-certificates ;           exec dockerd-entrypoint.sh           --tls=false           --host=unix:///var/run/docker.sock           --host=tcp://0.0.0.0:2375   variables:     DOCKER_HOST: tcp://docker:2375     DOCKER_TLS_CERTDIR: ""   before_script:     - cp /etc/gitlab-runner/certs/gitlab.local.example.com.crt /usr/local/share/ca-certificates/ca.crt && update-ca-certificates     - docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"     # IMAGE_VERSION ãå®çŸ©ãããŠããã°ãããå©çšããªããã° CI_COMMIT_SHORT_SHA     - export IMAGE_TAG="${IMAGE_VERSION:-$CI_COMMIT_SHORT_SHA}"     - export IMAGE_FULL="${CI_REGISTRY_IMAGE}/demo:${IMAGE_TAG}"   script:     - docker build -t "$IMAGE_FULL" .     - docker push "$IMAGE_FULL"     - printf "IMAGE_FULL=%s\n" "$IMAGE_FULL" > build.env   artifacts:     reports:       dotenv: build.env deploy_manifest:   stage: deploy   image: registry.gitlab.local.example.com/root/test-project/oc:4.18   needs:     - job: build_image       artifacts: true   variables:     K8S_NAMESPACE: gitlab-runner-test   before_script:     - oc whoami   script:     - |       : "${IMAGE_FULL:?IMAGE_FULL missing from build.env}"       # IMAGE ãš TAG ãåé¢ Â Â Â Â Â Â IMAGE="${IMAGE_FULL%:*}"; TAG="${IMAGE_FULL##*:}"       # ${IMAGE}:${TAG} ãåæ Â Â Â Â Â Â sed "s|\${IMAGE}:\${TAG}|${IMAGE_FULL}|g" deploy.yaml > deploy.rendered.yaml       echo "---- rendered ----"       cat deploy.rendered.yaml       oc apply -f deploy.rendered.yaml â»IMAGE_VERSIONãæªå®çŸ©ã®å Žåã¯CI_COMMIT_SHORT_SHAãã¿ã°ã«äœ¿ãããŸãããã®å Žåãçãã³ãããIDããšã«æ°ããã€ã¡ãŒãžãäœæããããããã¬ãžã¹ããªã®å®¹é管çãäžèŠã€ã¡ãŒãžã®åé€ã«æ³šæããŠãã ãããã¬ãžã¹ããªã®å®¹é管çã«ã€ããŠã¯ GitLab Container Registry: å¿çšç·šïŒå¯èŠæ§èšå®ãšã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ ããåç
§ãã ããã è£è¶³: éåç°å¢åãã®æºå ããŒã¹ã€ã¡ãŒãžç»é² éåžžã¯Docker HubããçŽæ¥nginx:1.29-alpineãååŸã§ããŸãããã€ã³ã¿ãŒãããæ¥ç¶ãã§ããªãç°å¢ã§ã¯ä»¥äžã®ããã« äºåã«ã¬ãžã¹ããªã«pushããŠãããŸãã $ podman login registry.gitlab.local.example.com $ podman pull docker.io/library/nginx:1.29.1-alpine $ podman tag docker.io/library/nginx:1.29.1-alpine \ registry.gitlab.local.example.com/root/test-project/nginx:1.29.1-alpine $ podman push \ registry.gitlab.local.example.com/root/test-project/nginx:1.29.1-alpine â»Docker å©çšç°å¢ã§ã¯podman â dockerã«çœ®ãæããŠãã ããã ocã³ãã³ãçšã€ã¡ãŒãžç»é² éåžžã¯registry.redhat.ioããçŽæ¥ose-cli-rhel9:v4.18ãååŸã§ããŸãããã€ã³ã¿ãŒãããæ¥ç¶ãã§ããªãç°å¢ã§ã¯ä»¥äžã®ããã« äºåã«ã¬ãžã¹ããªã«pushããŠãããŸãã $ podman login registry.redhat.io $ podman pull registry.redhat.io/openshift4/ose-cli-rhel9:v4.18 $ podman login registry.gitlab.local.example.com $ podman tag registry.redhat.io/openshift4/ose-cli-rhel9:v4.18 \   registry.gitlab.local.example.com/root/test-project/oc:4.18 $ podman push registry.gitlab.local.example.com/root/test-project/oc:4.18 â»Dockerå©çšç°å¢ã§ã¯podman â dockerã«çœ®ãæããŠãã ããã â»ãããã€å
ã®ã³ã³ããåºç€ãKubernetesã§ããå Žåã¯oc â kubectlã«çœ®ãæããŠãã ãããOpenShiftã®å Žåãkubectlã³ãã³ãã§åºæ¬çãªæäœã¯å¯èœã§ãããocã«ã¯OpenShiftç¹æã®æ¡åŒµæ©èœãå«ãŸããŠããŸãã ãã€ãã©ã€ã³ã®ä»çµã¿ïŒå®è¡ãããŒè§£èª¬ïŒ ãã€ãã©ã€ã³ã¯ 2ã¹ããŒãžæ§æ ã«ãªã£ãŠããŸãã 1. build ã¹ããŒãžïŒã€ã¡ãŒãžã®ãã«ããšããã·ã¥ïŒ ãžã§ãbuild_imageãå®è¡ãããŸãã Docker-in-DockerïŒdindïŒç°å¢ãå©çšããŠdocker buildãå®è¡ããGitLab Container Registryã«ã€ã¡ãŒãžãpushããŸãã pushããã€ã¡ãŒãžã®ãã«ãã¹ïŒIMAGE_FULLïŒãbuild.envãšããŠã¢ãŒãã£ãã¡ã¯ãã«ä¿åããŸãã â ãã®æ
å ±ãæ¬¡ã®ã¹ããŒãžã«åŒãæž¡ãããŸãã 2. deploy ã¹ããŒãžïŒãããã§ã¹ãã®é©çšïŒ ãžã§ãdeploy_manifestãå®è¡ãããŸãã å
ã»ã©ä¿åããIMAGE_FULLãå©çšããdeploy.yamlå
ã®${IMAGE}:${TAG}ãå®éã®ã€ã¡ãŒãžåã«çœ®æããŸãã oc apply -f deploy.rendered.yamlãå®è¡ããŠOpenShiftã¯ã©ã¹ã¿ãŒã«DeploymentãäœæããŸãã Podãç«ã¡äžãããreadiness probeã«ãã£ãŠ/healthzãæåããã°ãããã€å®äºã§ãã ãã€ãã©ã€ã³ã®å®è¡ äœæãããã€ãã©ã€ã³ãå®éã«åãããŠã¿ãŸãããã ãŸããæ€èšŒçšãããžã§ã¯ãã«ç§»åãã管çç»é¢ããCI/CD倿°ãèšå®ããŸãã[倿°ã远å ]ãã¯ãªãã¯ããããŒã«IMAGE_VERSIONãå€ã«v1.0.0ãå
¥åããŸãããªããmainãã©ã³ããªã©ã®ä¿è·ãã©ã³ã以å€ã§è©Šãå Žåã¯ãä¿åæã«[倿°ã®ä¿è·]ã®ãã§ãã¯ãå€ããŠãã ããããã§ãã¯ãä»ãããŸãŸã ãšãfeatureãã©ã³ããªã©éä¿è·ãã©ã³ãã§ãã€ãã©ã€ã³å®è¡æã«ç°å¢å€æ°ãåç
§ã§ããªããªããŸãã æ¬¡ã«ããœãŒã¹ã³ãŒãããªããžããªã«pushããŸããGitLabã®ãããžã§ã¯ãç»é¢ããæ€èšŒå¯Ÿè±¡ã®ãã©ã³ãã«åãæ¿ãã[ç·šé] â [Web IDE]ãéžæããŠå
éšãšãã£ã¿ãéããŸããåè¿°ã®ãã¡ã€ã«ïŒ.gitlab-ci.ymlãdeploy.yamlãªã©ïŒãäœæããå³åŽã®[Source Control]ã¢ã€ã³ã³ããã³ãããã¡ãã»ãŒãžãå
¥åããŠ[Commit and push]ãã¯ãªãã¯ããã°ãã³ãŒãããã©ã³ãã«pushãããŸãã ãœãŒã¹ã³ãŒããpushããããšãèªåçã«ãã€ãã©ã€ã³ãèµ·åããŸãããããžã§ã¯ãã®ãµã€ãããŒãã [ãã«ã] > [ãã€ãã©ã€ã³] ãéžæãããšãå®è¡äžã®ãã€ãã©ã€ã³ã確èªã§ããŸããããã«ããã€ãã©ã€ã³IDãã¯ãªãã¯ããã°ãåãžã§ãã®å®è¡ç¶æ³ããã°ã確èªã§ããŸãã ãããžã§ã¯ãã®ãµã€ãããŒãã[ãããã€] > [ã³ã³ããã¬ãžã¹ããª]ãéžæãããšããããžã§ã¯ãå
ã¬ãžã¹ããªã®ãªããžããªäžèЧã衚瀺ãããŸããä»åãã«ãããã€ã¡ãŒãžã¯demoãªããžããªã«æ ŒçŽãããŠããŸãã ãã®äŸã§ã¯ãbuild_imageãžã§ãã§ã€ã¡ãŒãžããã«ãããŠã¬ãžã¹ããªã«pushãããã®çµæçæãããIMAGE_FULL倿°ãbuild.envã«ä¿åãããŸããç¶ãdeploy_manifestãžã§ãã§ã¯ããã®å€æ°ãå©çšããŠãããã§ã¹ãå
ã®ãã¬ãŒã¹ãã«ããŒã眮æããoc applyã³ãã³ãã§OpenShiftã«ãããã€ã§ããŠããããšã確èªã§ããŸãã ãããã€æåã®ç¢ºèª ãããã€ãžã§ãã®æåã確èªããåŸãã¢ããªã®PodãRunningç¶æ
ã§èµ·åããŠããããšã確èªããŸãã $ oc get pod -n gitlab-runner-test -l app=multi-stage-demo NAME                    READY  STATUS  RESTARTS  AGE multi-stage-demo-deploy-6874887f67-w7br8  1/1   Running  0     69s Podãæ£åžžã«èµ·åãããšãPodå
ã®Nginxã§web/index.htmlãé
ä¿¡ãããŸãã以äžã®ããã«ã¢ã¯ã»ã¹ããŠåäœã確èªã§ããŸãã # PodåãååŸ $ POD=$(oc -n gitlab-runner-test get pod -l app=multi-stage-demo -o jsonpath='{.items[0].metadata.name}') # ããŒã«ã«18080 â Pod 8080 ãžè»¢é $ oc -n gitlab-runner-test port-forward pod/$POD 18080:8080 # ãã©ãŠã¶ããlocalhost:18080ã«ã¢ã¯ã»ã¹ããindex.htmlã®å
容ã衚瀺ãããããšãç¢ºèª Deploy Success v1.0.0. ãã®ã¡ãã»ãŒãžã衚瀺ãããã°ããã«ãã¹ããŒãžãã€ãã©ã€ã³ãéããŠããã«ãâã¬ãžã¹ããªãžã®pushâOpenShiftãžã®ãããã€ããèªååã§ããŠããããšã確èªã§ããŸãã ããã§ãã³ãŒãã®pushãããªã¬ãŒã«ãã«ããããããã€ãŸã§ãäžé£ã®æµãã§å®è¡ãããããšããå®éã®ãã€ãã©ã€ã³å®è¡ãéããŠç¢ºãããããŸãã ãªãããã¹ãŠã®åŠçã1ã€ã®ã¹ããŒãžã«ãŸãšããããšãå¯èœã§ããããã«ããšãããã€ãåããããšã§ä»¥äžã®ã¡ãªããããããŸãã 責åã®åé¢ïŒ ãã«ããšãããã€ãæç¢ºã«åããããšã§ãã©ã®æ®µéã§å€±æããã®ããç¹å®ãããããªããŸãã å¹ççãªãªãã©ã€ïŒ ãã«ããæåããŠããã°ããããã€ã ããåå®è¡ã§ãããããå詊è¡ã®å¹çãåäžããŸãã 䞊åã»æ¡åŒµæ§ã®ç¢ºä¿ïŒ å°æ¥çã«ãã¹ãã¹ããŒãžãæãã ããè€æ°ç°å¢ãžã®ãããã€ãåå²ãããããšãã£ãæ¡åŒµã容æã«ãªããŸãã ãã®ããã«ãã¹ããŒãžãé©åã«åå²ããããšã§ããã€ãã©ã€ã³ã®ä¿¡é Œæ§ãšéçšå¹çãé«ããããšãã§ããŸãã ãŸãšã æ¬èšäºã§ã¯ãè€æ°ã®ã¹ããŒãžãçµã¿åããããã€ãã©ã€ã³ã®èšå®æ¹æ³ã解説ããŸããã ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã顿ã«ããã«ããšãããã€ãå¥ã¹ããŒãžã«åãããã«ãã¹ããŒãžãã€ãã©ã€ã³ãæ§ç¯ããå®éã«ã³ãŒãã®pushãããªã¬ãŒã«ããŠäžé£ã®åŠçãèªåã§å®è¡ãããæµãã確èªããŸããã åäžã¹ããŒãžã«åŠçããŸãšããããšãå¯èœã§ãããã¹ããŒãžãåå²ããããšã§ãã©ãã§å€±æããã®ããæç¢ºã«ãªããããã«ããæåããŠããã°ãããã€ã®ã¿ãåå®è¡ã§ããããšãã£ãéçšäžã®ã¡ãªãããåŸãããããšã瀺ããŸãããããã«ããããã€ãã©ã€ã³ã®ä¿¡é Œæ§ãç®¡çæ§ã倧ããåäžããŸãã æ¬¡åã¯ãããã«è€éåãããã€ãã©ã€ã³å®çŸ©ãã¡ã€ã«ã include / extends æ©èœ ãæŽ»çšããŠæŽçããæ¹æ³ã解説ããŸããè€æ°ã®ãžã§ããã¹ããŒãžãå¢ããŠç®¡çãç
©éã«ãªã£ããšãã«åœ¹ç«ã€å®è·µçãªãã¯ããã¯ãåãäžããããã¹ã±ãŒã©ãã«ãªCI/CDéçšã«åããäžæ©ã玹ä»ããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post GitLab CI/CD å®è·µïŒ»ãã«ãã¹ããŒãžç·šïŒœïŒè€æ°ãžã§ããã€ãªããã€ãã©ã€ã³èšèš first appeared on SIOS Tech. Lab .
åãã« ååã®ããã°ã§ã¯ã Claude Codeé©åœïŒ3ãã§ãŒãºéçºã§å¹ççãªéçºïŒèšç»âå®è£
âæ€èšŒè¡ ãã«ã€ããŠç޹ä»ããŸããããä»åã¯å®éã«Claude Codeã§ä»æ§æžããŒã¹éçºéçšããéã«ãããã¯çµ¶å¯Ÿã«æŒãããŠãããªããšãããããšãããã€ã³ãã«ã€ããŠã話ãããŸãã å®éã«æ€èšŒããŠããŠå€±æããããšããæ°ãã€ããªããšæéãç¡é§ã«ããŠããŸããã€ã³ããäžå¿ã«ãŸãšããŸããã 1. ãã¡ã€ã³ç¥èã®æç€ºçãªããã¥ã¡ã³ãåã®éèŠæ§ ãã®æ¹æ³ã§æ€èšŒããŠããŠå€±æããããšããããŸããäŸãã°ã ãããžã§ã¯ãã®åºç€çãªç¥èïŒãã¡ã€ã³ç¥èïŒã¯ãæç€ºçã«ããã¥ã¡ã³ãåããªãéãAIã¯çè§£ããŠãããŸãã ã å®éãã£ãåé¡ãšããŠããã€ãã£ãã¢ããªãšWebã¢ããªã®ããã¯ãšã³ããªã³ã¯ã®æ§æããããŸããããŒã«ã«ç°å¢ã§ã¯SWCã§ãšãã¥ã¬ãŒãããŠããŠãã/apiãã«èªåã§ãããã·ãããä»çµã¿ã§ããããAIã¯ãããç¥ããã«ããã¯ãšã³ãURLãçŽæ¥åã蟌ãããšããŠã APIãã¹ã®åç
§ãšã©ãŒãå€çº ããŸããã ããã¯ããããžã§ã¯ãã³ã¢ãã®ãããªããã¥ã¡ã³ããäœæããŠå
±éç¥èãæäŸããããšã§è§£æ±ºããŸããã AIã¯æžãããŠããªãããšã¯èªèã§ãããã»ãã·ã§ã³å
ã§äžããŠããªãæ
å ±ã¯çè§£ããŸãã ã ãããžã§ã¯ãã³ã¢ããã¥ã¡ã³ãã®å
·äœäŸ ãããžã§ã¯ãã³ã¢ã«ã¯ãå®éã«ãããã€ããç°å¢ã®ãããã·ã®èšèšããããžã§ã¯ãã®æ ¹å¹¹ã«é¢ããéšåãã¡ãããšå®çŸ©ããŠããã¹ãã§ãã ä»åç§ãäœã£ãç°å¢ã§ã¯ãAzure Static Web Appsãããã¯ãšã³ããªã³ã¯ã§æ§ç¯ããŠããŠãã¹ã©ãã·ã¥APIãšããã®ãèªåã§ãã¬ãã£ãã¯ã¹ã§é£ãã§ãããšããä»çµã¿ããããŸãããã®ããããã¬ãã£ãã¯ã¹ã/apiãã§ã¢ã¯ã»ã¹ãããšããããšãæèšãããããããžã§ã¯ãæ§æã¿ãããªã®ãæžããŠãããŠããããã£ãæ
å ±ãAIã«äžããŠããŸãã åœããåã®ããã«æããç°å¢èšå®ãéçºã«ãŒã«ããAIã«ãšã£ãŠã¯ãåããŠèã話ãã§ãã人éã®éçºè
ãªãæé»ç¥ãšããŠå
±æãããŠããéšåããAIã«ã¯æç€ºçã«æããå¿
èŠããããŸãã 2. AIãããã¥ã¡ã³ããç¡èŠããåé¡ãžã®å¯ŸåŠ èšç»ãã§ãŒãºã§ã¯ãèšç».mdããªã©ã®ãã¡ã€ã«ã«æç€ºãæžããŠããŸããã AIã¯æã
ããã¥ã¡ã³ããç¡èŠããããšããããŸã ã人éãšåãã§ãæç€ºãå®çŸ©ãèŠãªãããšããããã§ããèªãã ããã§ç¡èŠããããšãããã®ã§ã 絶察å®ã£ãŠã»ããããšã¯ããã¥ã¡ã³ãåããããã³ããã§ã泚æããã®ãéèŠ ã§ãã ããã¯æ¬åœã«ã€ã©ã€ã©ãããã€ã³ãã§ããã£ããæéããããŠè©³çްãªä»æ§æžãäœã£ãŠãããããç¡èŠãã¡ããã¡ã§ããïŒããšããããšãé »ç¹ã«èµ·ãããŸãã ç¡èŠããããããã¿ãŒã³ãšå¯Ÿç ããã³ããã«æåŸ
ããŠãªãæ
å ±ã¯å²ãšç¡èŠããŸããããã®ãã¿ãŒã³çãªãã¹ã®åŸåã¿ãããªã®ããã£ãããããŒã¯ããŠã³ãã¡ã€ã«ã«æ
å ±åæ ããããšããããåãããããã£ãŠããŸãã 仿§æžãæžããŠããããã§ãŒãºãšéçºãã§ãŒãºã§ã仿§æžãæžããŠããæäžã«ã³ãŒãã®ç·šéããããããŠãããã§ãããããã§ã仿§èŠä»¶ãã§ãŒãºãšéçºãã§ãŒãºã®äžã€ã«åããŸããšããæç€ºãã€ããŠãèšç»ãã§ãŒãºã§ã¯ãã¡ã€ã«ã®ç·šéã¯å ããªãã§ãã ãããšããæç€ºã远å ããŠããŸããéçºãã§ãŒãºã¯ãäœæãã仿§ã®ããã¥ã¡ã³ããèªãã§ãããã«å¯ŸããŠã¹ããããã€ã¹ãããã§éçºãé²ããŠãã ãããšããããšããããŒã¯ããŠã³ãã¡ã€ã«ã§å®çŸ©ããŠããŸãã 察çãšããŠã¯ïŒ æéèŠãªå¶çŽäºé
ã¯ããã¥ã¡ã³ãã«æžã ããã«ããã³ããã§ãå床匷調ãã ããã®éšåã ãã¯çµ¶å¯Ÿã«å®ã£ãŠãã ããããšããæç€ºçãªæç€ºãå«ãã äºéãäžéã®å®å
šçãè¬ããããšã倧åã§ãã 3. 仿§æžã®é©åãªåéãã©ã³ã¹ 仿§æžã®åéã«ã€ããŠã¯ã é·ããããšAIãç¡èŠãã確çãäžãããŸã ããç¡èŠããŸããããšããè¿çãè¿ã£ãŠããããšãããããããèŠããšãã¯æ£çŽ ããåããŸãã ïŒç¬ïŒã çããã°çæ³çã§ãããçããããšæéããããã®ã§ãAIãç¡èŠããå¯èœæ§ãèæ
®ããªããé©åãªåéãèŠæ¥µããå¿
èŠããããŸãã ã©ã®çšåºŠã®åéãé©åãã¯ãããžã§ã¯ãäŸå ã§ãããã¡ã€ã³ç¥èãå€ããã°ããã®å仿§æžã«æžãæ
å ±ã¯å°ãªããŠæžã¿ãŸãã å
·äœçãªåéã®ç®å® ç§ã®ç°å¢ã§èšããšã ãšã³ããã€ã³ã2ã€ãšãããã«å¯Ÿå¿ããç»é¢1〠ãšããæãã ãšãäœæçã«äžæããã£ããšããå°è±¡ã§ããããã¯æ¬åœã«ãããžã§ã¯ãã«ãããšãããããããžã§ã¯ãã³ã¢ã«ããæãã®å
容ãšããããå
ã®ã³ã³ããã¹ãéã圱é¿ããŠããŸãã ãã®èŸºãã¯çµéšåã«ãªã£ãŠããŸããŸãããAIããé·ãããèªã¿ãããªãããšå€æããã©ã€ã³ãèŠæ¥µããããšãéèŠã§ãã人éãšåãã§ãããŸãã«ãé·ã仿§æžã¯æåŸãŸã§èªãã§ããããŸããã 4. æ°æ©èœéçºãšãã°ã¬ããŒãã®äœ¿ãåã ç§ã¯æ°æ©èœéçºãšãã°ã¬ããŒãããã®äºã€ã®æ¹æ³ã§åããŠå¯Ÿå¿ããŠããŸãã æ°æ©èœéçº : å¿
ã3ãã§ãŒãºïŒèšç»âå®è£
âæ€èšŒïŒãèžã å°ããªå€æŽ : ã§ãããã¥ã¡ã³ãâå®è£
ãšããæ®µéãèžã æ¬åœã«å°ããªå€æŽ : 人éããã£ãã»ããæ©ã 人éããã£ãã»ããæ©ã倿Žã®èŠæ¥µã ãããžã§ã¯ãæ§æçãªéšåã®å€æŽã§ãããã³ãŒãèŠçŽã¿ãããªãšããã§ãã¡ãã£ãšäžã®éå±€ã«ãã¡ã€ã«ãç§»ãæ¿ããããšãããã¡ã€ã«æ§æã§ãã¡ãã£ãšãã£ã¡ã«ç§»è¡ãããã»ããããããã¿ãããªè©±ãšãããã¡ã€ã«ã®åçŽãªç§»åã¯ãVS Codeã®è£å®æ©èœãåªç§ãªã®ã§ããããã£ãäœæ¥ãšããããšã¯é¢æ°åãæ°ã«å
¥ããªãã®ã§ã颿°åã®ãªããŒã ãããšããäœæ¥ã§ãããã 人éãæãåãããŠäœæ¥ããŠãã»ãã·ã§ã³ãç¶ç¶ããŠããã®ã§ããã°ãã¡ãããšå€æŽãå ããŸããããšããããšãAIåŽã«äŒããŠãããå¿
èŠã¯ãããŸãããããããªããšã人éãç·šéãããã¡ã€ã«ãšAIãç·šéããããšããŠãããã¡ã€ã«ã§ã³ã³ããªã¯ãèµ·ããŠããŸãã®ã§ãå床ãã¡ã€ã«ãäœãããšãããã§ããããªã®ã§ããããã£ããšããã§èª¿æŽãåã£ãŠããå¿
èŠã¯ããããªãšæããŸãã ãã®äœ¿ãåããéèŠã§ãäœã§ãããã§ãAIã«é Œãã°ãããšãããã®ã§ã¯ãããŸããã1è¡2è¡ã®ä¿®æ£ãAIã«èª¬æãããããèªåã§ãã£ãŠããŸã£ãã»ããæ©ãã±ãŒã¹ãå€ã
ãããŸãã ããã»ã¹ãèžãã§ãæå³ãããã®ãã§ããªãå Žåã¯ããã¯ã人éã®ããã¥ã¡ã³ããäžååã ãšããããšã§ããAIã¯æžãããŠããªãããšãèªç±ã«å€æããã®ã§ãããã¥ã¡ã³ãã®è³ªãé«ããå¿
èŠããããŸãã 5. äžèŠæš¡éçºã§ã®åšåãšçŸåšã®éç çŸåšã¯ãã©ã€ããŒããªããžããªã§æ€èšŒããŠããããã å€§èŠæš¡ãããžã§ã¯ããžã®å°å
¥çµéšã¯ãŸã ãããŸãã ããäžèŠæš¡çšåºŠã®éçºã§ããã°åŒ·åãªããŒã«ã«ãªããšæããŸããç¹ã« ãããã¿ã€ãã³ã°ã§ã¯å€§ããªåãçºæ®ããã ã§ãã å人çã«åŠã³ã«ãªã£ãç¹ãšããŠã¯ã仿§æžäœæãèŠæãªç§ã§ããAIãè¿ããŠãã仿§æžãèŠãŠãåãããããããšæããããšããããŸãã åŠç¿çãªåŽé¢ã§ã䟡å€ããã ãšæããŸãã å®ç§ãªä»æ§æžãããã°çæ³çã§ããããããããã®ã¯å®éã«ã¯ååšãããã©ããã«äžåããããã®ã§ããã ãããããæ©èœããšã«æ®µéçã«ä»æ§æžãäœã£ãŠããã¢ãããŒããæå¹ã ãšæããŸãã 6. ãããã倱æãã¿ãŒã³ãšãã®å¯Ÿç åå®çŸ©ã®äžæŽååé¡ æ¬åœã«ããããã®ããããã³ããšã³ããšããã¯ãšã³ãã§åå®çŸ©ãå
±éåãããŠãªããŠãããã¯ãšã³ãã«ã¢ã¯ã»ã¹ã§ããªããAPIã¢ã¯ã»ã¹ã¯æåããŠããã ãã©ããç»é¢ã«è¡šç€ºããããªããšããããšããããŸããã 察çãšããŠã¯ã OpenAPI ã¹ããã¯ãäœãããŠããã®OpenAPIã¹ããã¯ããåå®çŸ©ãäœæãã ã ãããŠãããã³ããšã³ãã¯ãã®åå®çŸ©ã絶察ã«äœ¿çšããããã«ããããšããæãã§åé¿ããŠããŸãã ãããã€ç°å¢ã®å·®ç°ã«ããåé¡ ãããã€ç°å¢ã®å·®ç°ã¿ãããªãšããã§åé¡ãèµ·ããããšããããŸããä»åAzure ã®ããã¯ãšã³ããªã³ã¯ã§ãã¹ã©ãã·ã¥APIã®ã³ã³ãã³ããèªåã§ãããã·ããŠããããã§ããã©ããããã£ãããšãäŒããŠãªããŠããªããå¥ã®ãšã³ããã€ã³ãããŒã¹URLã¿ãããªã®ãä»ããŠãããã«ã¢ã¯ã»ã¹ããããã«ããŸãããã¿ãããªææ¡ããããŸããã ããã¯ãšã³ããçŸç¶ãlocalhost ã®3001çªã§åããŠãã®ã§ãããŒã«ã«3001çªã«çŽæ¥ã¢ã¯ã»ã¹ããããã«å€ãã¡ãããŸããããã¿ãããªããšãèšãããããšããããŸããããã¯ãããžã§ã¯ãã³ã¢ããã¥ã¡ã³ãã§ãã£ãããšç°å¢æ§æãæèšããŠããããšã§åé¿ã§ããŸãã ãŸãšã Claude Codeã¯ç¢ºå®ã«éçºå¹çãåäžãããŠãããããŒã«ã§ããããããã®ãã€ã³ããæŒãããŠãããªããšãäœèšãªæéãè²»ãããŠããŸããŸããç¹ã«ãã¡ã€ã³ç¥èã®æç€ºåãšä»æ§æžã®åéãã©ã³ã¹ã¯ãæåã®éµãšãªãéèŠãªèŠçŽ ã§ãã ãŸãæŽèµ°ããã®ã¯äººéãšäžç·ã£ãŠæãã§ããã人éãããæŽèµ°ããã¡ã§ãããèšããããçžæã§ãããïœ çãããããã²ãããã®ãã€ã³ããåèã«Claude CodeãæŽ»çšããŠã¿ãŠãã ããïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post Claude Code仿§æžããŒã¹ã§ããã6ã€ã®èœãšã穎ïŒå€±æåé¿ã®åå¿é² first appeared on SIOS Tech. Lab .
ã¯ããã« ã©ãïŒAIãšã®éçºããã£ã€ãåããŠ2ãæã§æ¯æ¥Claude Codeãšã話ããŠããéŸã¡ããã§ããæ¬æ¥ãšã¯å¥ã§éçºãé²ããŠããã®ã§ãããä»ãŸã§1é±éã§é 匵ã£ãŠ1ä»¶ã®æ€èšŒéçºããã§ããªãã£ããã§ããã2æ¥ã§æ€èšŒãããããšããµã³ãã«ä»ãã§äœæã§ããã®ã§æé«ã§ããããããŸã§ã®éçºçµéšã§æè¡èšäºãæ°å€ãæžããŠããŸããããä»åã¯ç¹ã«å¹æã宿ããAIãšã®ååã«ã€ããŠæžããŠããããšæããŸãã ã¡ãªã¿ã«ã Claude Codeé©åœïŒ3ãã§ãŒãºéçºã§å¹ççãªéçºïŒèšç»âå®è£
âæ€èšŒè¡ ãClaudeã«å®è£
ããããã§ãŒãºãåå²ããŠéçºãããææ³ã玹ä»ããŠããŸããä»åã¯ããã®èšç»æžå·çãã§ãŒãºã®ã話ã§ãã çããã¯ã仿§æžãæžãããšã«å¯ŸããŠã©ããªå°è±¡ããæã¡ã§ããïŒæ£çŽã«èšããšãå
¥ç€ŸããŠ4幎ã§ãããããŸã ã«ä»æ§æžãæžããšããäœæ¥ã«å¯ŸããŠèŠææèããããŸãã仿§æžãæžãã®ã奜ããšãããšã³ãžãã¢ã«å人çã«ãã£ãããšããããŸããããå®ç§ãªä»æ§æžãæžããïœïŒããšããã¢ãããŒã·ã§ã³ãæã£ããšããŠãã¢ã¬ã«ã®ãŒãšãããŸããããå®ç§ãªä»æ§æžããšãããã®ãæžãã®ã¯ããŒãã«ãé«ãã§ããã èæ¯ã»èª²é¡èª¬æ 仿§æžãå¿
èŠãªçç± ãã®äžæ¹ã§AIãšå
±åã§éçºãé²ããŠããããã«ã¯ã仿§æžãããã£ãã»ããè¯ãã§ããã³ãŒãèŠçŽãLinter/FormatterãæŽåãããŠãããããžã§ã¯ãã§ããã°ãã³ãŒãã仿§æžã®æ©èœãæã€ããšããããŸããããããžã§ã¯ãåæã®æ®µéã§ããã°ä»æ§æžãèªã¿èŸŒãŸããŠéçºãããã»ããå§åçã«éçºå¹çãè¯ãã§ããVibe Codingã§åçŽãªããã³ããã§100-300æåã®ããã³ããã§äœæããã®ã¯äžå¯èœã§ãã æ©èœéçºäžã«ããããã®ããæ€èšäžè¶³ãèæ
®äžè¶³ã«ãã£ãŠéçºäžã«Slackã§ã®çžè«ãããŒãã£ã³ã°ãæãã ããæãæ¢ãŸã£ãŠèã蟌ãã ãããããšã§ã¯ãªãã§ãããããã³ãŒãã®æžãæ¹ã§æ©ãã®ã¯åé¡ãããŸããããäºåã«æ±ºããŠããã¹ãæ
å ±ãæªç¢ºå®ãªããã«çºçããææ»ãã¯é¿ããããã®ã§ãã 仿§æžã¢ã¬ã«ã®ãŒã®åå åæ ä»æ§æžãæžãããšã«å¯ŸããŠã¢ã¬ã«ã®ãŒãããåå ãå人çã«åæãããŠã¿ããšã仿§æžãèªã¿èŸŒãã çµéšãããŸããªãããšããããŸããããè¯ã仿§æžãæžãããã«ã¯ãè¯ã仿§æžã®ãææ¬ãå¿
èŠã§ããããããã®ããè¯ã仿§æžã£ãŠã©ãã«ããã®ã£ãŠè©±ã§ããããå®ç§è¶
人ãå·çãã仿§æžãããã°çæ³ã§ãããïŒã¬ãã¥ãŒãªãã§å®ç§ãªä»æ§æžãæžãã人ããããªããã£ãŠã¿ããâŠïŒ ãããªå¯èœæ§ã¯ãªãã®ã§ããããžã§ã¯ãã§ã¯ã¬ãã¥ãŒãéããŠããè¯ã仿§æžãç®æããŠããã®ããæ®éã®æµãã«ãªããšæããŸãããšããããšãèžãŸããŠãçããã®åšãã«ä»æ§æžã£ãŠãããŸããïŒä»æ§æžãèªã¿èŸŒãçµéšã£ãŠããŸããªãããããªãã§ããããïŒ æè¡éžæã®çç±ïŒãªãAIãšååããã®ã ããã§ææ¡ã§ãïŒå°ãã仿§æžãæžããŠã¿ãŸãããïŒãããªãå®ç§ãªä»æ§æžãªããŠäžå¯èœã§ãããã¬ãã¥ãŒã¢ãŒã確ä¿ããã®ã倧å€ã§ããããããã§AIãæŽ»çšããŸãã AIãæŽ»çšãã仿§æžäœæãã㌠AIã«ä»æ§æžãæžããŠãããããããã¬ãã¥ãŒãããç§ãã¡ã¯æå³ãäŒããŠä»æ§æžãäœæããŠãããã人éãã¬ãã¥ã¢ãŒãšããŠåå ããAIãšååãã圢ã§ä»æ§æžãäœæããŠãããããŒã§ãã å®è£
詳现 CLAUDE.mdã®å
·äœçãªèšè¿°äŸ åæãšããŠAIã¯ã³ãŒããæžãããããŸããèšè𿮵éã§ã¯ãç®çãçŠæ¢äºé
ãCLAUDE.mdã«å®çŸ©ããŠããŸãã å®éã«ç§ã䜿ã£ãŠããCLAUDE.mdã®äžèº«ãèŠãŠã¿ãŸãããïŒ # èšèšãã§ãŒãºã®ã«ãŒã« ## ç®ç AIã«äººéã®æå³ãé©åã«äŒããŠå¹ççãªéçºãè¡ã ## èšèšãã§ãŒãºã§è¡ãããš - åå®çŸ©ã®èšèš - ããŒã¿ããŒã¹æ§é ã®èšèš - API 仿§ã®å®çŸ© - ã¢ãŒããã¯ãã£èšèš - æ©èœèŠä»¶ã®æç¢ºå - éæ©èœèŠä»¶ã®å®çŸ© ## èšèšãã§ãŒãºã§çŠæ¢ããããš - ❌ å®è£
ã³ãŒãã®èšè¿°çŠæ¢ - ❌ å
·äœçãªããžãã¯ã®èšè¿°çŠæ¢ - ❌ ã©ã€ãã©ãªã®éžå®çŠæ¢ - ❌ å
·äœçãªé¢æ°å®è£
çŠæ¢ ## ã¬ãã¥ãŒãã€ã³ã - èŠä»¶ã®æãæŒãã¯ãªãã - èšèšã®æŽåæ§ã¯åããŠããã - ã¹ã±ãŒã©ããªãã£ã¯èæ
®ãããŠããã - ã»ãã¥ãªãã£èŠä»¶ã¯æºãããŠããã ãã®ããã«æç¢ºã«ã«ãŒã«ãå®çŸ©ããããšã§ãAIãèšèšã«éäžããŠãããŸãã 仿§æžäœæã®å
·äœçãªæé èŠä»¶ã®æŽç ïŒäœãäœãããããç®æ¡æžãã§æŽç AIãšã®å¯Ÿè©± ïŒCLAUDE.mdã®ã«ãŒã«ã«åºã¥ããŠä»æ§æžãäŸé Œ ã¬ãã¥ãŒãšä¿®æ£ ïŒäœæããã仿§æžã人éã®èŠç¹ã§ã¬ãã¥ãŒ å埩æ¹å ïŒäžè¶³éšåãææ§ãªéšåãç¹°ãè¿ãä¿®æ£ ä»æ§æžã®ãã³ãã¬ãŒãäŸ # æ©èœä»æ§æžïŒ[æ©èœå] ## æŠèŠ [æ©èœã®ç®çãšæŠèŠ] ## æ©èœèŠä»¶ - [èŠä»¶1] - [èŠä»¶2] - [èŠä»¶3] ## éæ©èœèŠä»¶ - ããã©ãŒãã³ã¹èŠä»¶ - ã»ãã¥ãªãã£èŠä»¶ - å¯çšæ§èŠä»¶ ## ããŒã¿æ§é [å¿
èŠãªããŒã¿æ§é ã®å®çŸ©] ## API仿§ [ãšã³ããã€ã³ãã®å®çŸ©] ## å¶çŽäºé
[æè¡çå¶çŽãæ¥åçå¶çŽ] åäœç¢ºèªã»æ€èšŒ å®éã®å¹æãæ€èšŒããŠã¿ã åŸæ¥ã®éçºãããŒãšæ¯èŒããŠã¿ãŸããïŒ é
ç® BeforeïŒåŸæ¥ã®äººéã ãã§ã®éçºïŒ AfterïŒAIãšååãã仿§æžé§åïŒ ä»æ§æ€èš éçºäžã«éæïŒå²ã蟌ã¿å€æ°ïŒ äºåã«1-2æé éçºæé 1é±é 2æ¥ ææ»ãåæ° å¹³å3-4å å¹³å1å ç¹ã« éçºæéã®ççž® ãšææ»ãåæ°ãé¡èã«çŸããŸããïŒ ãŸã ãŸã æ€èšŒäžã®æ®µéãªã®ã§ãå°èŠæš¡ãªæ€èšŒãªããšã¯çæããŠãããŠãã ããã AIãšååãã坿¬¡ç广 仿§æžãæžãããšã®å¹æã¯ãéçºåã«äœæãããæ©èœã®æŽçãã§ããããšã§ãã AIãšäžç·ã«ä»æ§æžãäœæãã坿¬¡ç广ãšããŠãAIãäœã£ã仿§æžãã¬ãã¥ãŒããçµéšãåŸãããŸãã仿§æžã®æ®µéã§ããã¡ãã®æå³ãé©åã«äŒãã£ãŠããªããã°ã¬ãã¥ãŒããŠä¿®æ£ããŸããããã«ããéçºåã«æ€èšäžè¶³ãèæ
®äžè¶³ãæããããšãã§ããŸããå®ç§ãªã¬ãã¥ãŒã¯äžå¯èœã§ãããããã¯çµéšãéããããšã§æ¹åããŠãããã®ã§ããã æåäºäŸïŒå®éã®ãããžã§ã¯ããã æè¿ã®æ€èšŒãããžã§ã¯ãã§ã¯ã以äžã®ãããªææãåŸãããŸããïŒ ãŠãŒã¶ãŒèªèšŒã·ã¹ãã ïŒä»æ§æžäœæ1æé â å®è£
1.5æ¥ ããŒã¿åæããã·ã¥ããŒã ïŒä»æ§æžäœæ2æé â å®è£
2æ¥ APIçµ±åæ©èœ ïŒä»æ§æžäœæ1.5æé â å®è£
1æ¥ ããããåŸæ¥ã®3-4åã®é床ã§å®æãããããšãã§ããŸããã 課é¡ãšä»åŸã®å±æ çŸåšã®å¶éäºé
ãšæ¹åæ¡ ãŸã å®ç§ã§ã¯ãããŸãããAIã®ç解床ã«äŸåããéšåããããè€éãªæ¥åããžãã¯ã¯äººéã®è£å®ãå¿
èŠã§ãããŸããããŒã å
ã§ã®æšæºåãã¬ãã¥ãŒèгç¹ã®çµ±äžã課é¡ã§ããã çæçã«ã¯ä»æ§æžãã³ãã¬ãŒãã®æšæºåãšAIããã³ããã®æé©åãé²ããŠããŸãã ãã£ãã®ããš ãå°æ¥çã«ã¯AIãèŠä»¶å®çŸ©ããéçšãŸã§äžè²«ããŠãµããŒãããŠããããããªç°å¢ãæ§ç¯ãããã§ããã ãŸãšã ä»åã¯ãAIãšååãã仿§æžäœæãããŒã«ã€ããŠè©³ããèŠãŠããŸããã ã仿§æžã¢ã¬ã«ã®ãŒããå
æããå¹ççãªéçºãå®çŸããæ¹æ³ãšããŠïŒ å°ããå§ãã仿§æžäœæ ïŒå®ç§ãç®æããããŸãã¯åºæ¬çãªèŠä»¶ãã AIãšã®ååã¬ãã¥ãŒããã»ã¹ ïŒAIã«äœæããŠãããã人éãã¬ãã¥ãŒãã èšèšãã§ãŒãºã§ã®æç¢ºãªã«ãŒã«èšå® ïŒCLAUDE.mdã§ã®çŠæ¢äºé
ãšç®çã®æç€º 段éçãªéçºããã»ã¹ ïŒèšèšâéçºâãã©ãã·ã¥ã¢ããã®3段é ãããã®ç¥èãæŽ»ãããŠãçãããAIãšäžç·ã«ä»æ§æžäœæã«ãã£ã¬ã³ãžããŠã¿ãŠãã ããïŒæåã¯æ
£ããªããããããŸããããéçºå¹çã®åäžã宿ã§ãããšæããŸãã å®éã®ãããžã§ã¯ãã§ã©ã¡ããéžã¶ã¹ãããè¿·ããšããã§ããããã§ããäžåºŠãã®æ¹æ³ã詊ããŠã¿ãã°ããã®å¹æã宿ããŠããã ããã¯ãã§ãã æ¬¡åã¯ãå®éã®éçºãã§ãŒãºã§ã®AI掻çšè¡ã«ã€ããŠæžãäºå®ã§ãããæ¥œãã¿ã«ïŒ ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post AIååã§ä»æ§æžã¢ã¬ã«ã®ãŒå
æïŒéçºæéã1é±éâ2æ¥ã«ççž®ããå®è·µæ³ first appeared on SIOS Tech. Lab .
åãã« AIãšäžç·ã«éçºãããããã«ãªã£ãŠãããããã³ããšã³ããšããã¯ãšã³ãäž¡æ¹ãçéã§éçºããããšãã§ããããã«ãªã£ãŠãæ€èšŒãçéã§é²ãããã«ãªã£ãéŸã¡ããã§ãã AIãæ··ä¹±ããªãããã«ãããžã§ã¯ãèªäœãæŽåããæ¹æ³ã«ã€ããŠã話ãããŸããAIãšäžç·ã«éçºãé²ããéçºææ³ã«é¢ããŠã¯ã以äžã®èšäºã§è§£èª¬ãããŠããŸãã Claude Codeé©åœïŒ3ãã§ãŒãºéçºã§å¹ççãªéçºïŒèšç»âå®è£
âæ€èšŒè¡ AIååã§ä»æ§æžã¢ã¬ã«ã®ãŒå
æïŒéçºæéã1é±éâ2æ¥ã«ççž®ããå®è·µæ³ Claude Code仿§æžããŒã¹ã§ããã6ã€ã®èœãšã穎ïŒå€±æåé¿ã®åå¿é² AIã«è§Šãããªããã¡ã€ã«ãäœãããšã§éå°ãªçæãçŠæ¢ããããèªåçæãã€ãã©ã€ã³ãæ§ç¯ããŠäººçºçãªãã¹ãé²ããªã©ããããžã§ã¯ãæ§é ã¬ãã«ã§ã®å¯ŸçãéèŠã§ãã å®éã«çºçããåé¡äºäŸïŒåå®çŸ©ã®éœéœ¬ ãŸããå®éã«ç§ãééããåé¡ãã玹ä»ããŸãã ç°å¢æ§æ ããã³ããšã³ã : Next.js ããã¯ãšã³ã : Nest.js çºçããåé¡ ããã³ããšã³ããšããã¯ãšã³ãã§ åå®çŸ©ã®éœéœ¬ãçºç ããŠããŸãããããã¯ãšã³ãã§å®çŸ©ããåãããã³ããšã³ãåŽã§åå®çŸ©ããŠã倿Žãåæ ãããŠããã åç
§ãšã©ãŒãçºç ããç¶æ³ã§ããã ãã®åé¡ã®æ ¹æ¬åå ã¯ãAIãåç°å¢ã§ç¬ç«ããŠåå®çŸ©ãçæããŠããŸããããã¯ãšã³ãã®åå®çŸ©å€æŽãããã³ããšã³ãã«åæ ãããªãããšã§ããã人éã®éçºè
ãªããããã¯ãšã³ãã§åãå€ãã£ããããããã³ããšã³ããæŽæ°ããªããããšæ°ã¥ããŸãããAIã¯åãã¡ã€ã«ãç¬ç«ããŠèŠãŠããŸããŸãã 解決çïŒèªåçæãã€ãã©ã€ã³ã®æ§ç¯ ãã®åé¡ã解決ããããã以äžã®èªåçæãã€ãã©ã€ã³ãæ§ç¯ããŸããïŒ 1. OpenAPI Specèªåçæ Nest.jsããOpenAPI Spec ãèªåçæããä»çµã¿ãå°å
¥ããŸãããããã«ãããããã¯ãšã³ãã®API仿§ã倿Žããããšãèªåçã«ã¹ããã¯ãã¡ã€ã«ãæŽæ°ãããŸãã å
¬åŒã§æäŸãããŠããã®ã§ãã³ãŒãã¬ãã«ã§OpenAPI Specãçæããããšãã§ããŸãã 2. ããã³ããšã³ãåŽã®èªåçæ Orval ã䜿çšããŠãNext.jsã« SWR + Axiosã®ãªã¯ãšã¹ãã»åå®çŸ©ãèªåçæ ããä»çµã¿ ãæ§ç¯ããŸãããOpenAPI Specããèªåçã«ããã³ããšã³ãçšã®ã³ãŒããçæããããããããã¯ãšã³ããšããã³ããšã³ãã®åå®çŸ©ãå¿
ãäžèŽããŸãã ãã®ã·ã¹ãã ã§ã¯ãSWRãšAxiosã䜿ã£ãŠAPIãªã¯ãšã¹ããè¡ã£ãŠãããããŒã¿ãã§ããã£ãŒãã«ã¹ã¿ã ããã¯ãèªåã§æäŸããããããéåžžã«äŸ¿å©ãªä»çµã¿ã«ãªã£ãŠããŸãã 3. Claude ãžã®éç¥ æãéèŠãªã®ã¯ã Claudeã«å€æŽäžå¯ãšæç¢ºã«éç¥ ããããšã§ããèªåçæããããã¡ã€ã«ã«ã¯ãã³ã¡ã³ããCLAUDE.mdãã¡ã€ã«ã§ããã®ãã¡ã€ã«ã¯èªåçæããããã倿ŽçŠæ¢ããšæèšããClaudeãåæã«ç·šéããªãããã«åŸ¹åºããŸããã èªåçæããããã®ã³ãã³ããšãã©ã®ãã¡ã€ã«ã倿Žäžå¯ãªã®ããæç¢ºã«æå®ããå¿
èŠããããŸãã ãããžã§ã¯ãæ§æã®æé©å AIãè¿·ããªãããããããžã§ã¯ãæ§æã工倫ããŠããŸãïŒ / âââ CLAUDE.md # ãããžã§ã¯ãå
šäœã®ã¬ã€ãã©ã€ã³ âââ docs/ # èšç»ã»èšèšãã§ãŒãº â âââ CLAUDE.md # èšç»ãã§ãŒãºå°çšã«ãŒã« â âââ api/ # OpenAPI Spec âââ application/ # å®è£
ãã§ãŒãº âââ backend/ â âââ CLAUDE.md # ããã¯ãšã³ãå®è£
ã«ãŒã« âââ frontend/ âââ CLAUDE.md # ããã³ããšã³ãå®è£
ã«ãŒã« åãã§ãŒãºçšã®CLAUDE.mdãã¡ã€ã«é
眮 åãã£ã¬ã¯ããªã« CLAUDE.md ãã¡ã€ã«ãé
眮ãããã®ãã£ã¬ã¯ããªã§äœæ¥ããéã®åºæã«ãŒã«ãèšèŒããŠããŸããäŸãã°ïŒ application/frontend/CLAUDE.md : èªåçæãã¡ã€ã«ã®å€æŽçŠæ¢ã䜿çšå¯èœãªã©ã€ãã©ãªã®å¶éãªã© application/backend/CLAUDE.md : API仿§å€æŽæã®æé ãããŒã¿ããŒã¹ã¹ããŒã倿Žã®æ³šæç¹ãªã© docs/CLAUDE.md : ããã¥ã¡ã³ãäœææã®ãã©ãŒããããå¿
é é
ç®ãªã© AIã«è§Šãããªããã¡ã€ã«ã®æç¢ºå éå°ãªçæãé²ããã¡ã€ã«ç®¡çæŠç¥ ãšããŠã以äžã®ãããªå¯Ÿçã宿œããŠããŸãïŒ èªåçæãã¡ã€ã«ã«ã¯å¿
ããDO NOT EDIT – Auto Generatedãã®ã³ã¡ã³ããä»äž ããã±ãŒãžãã¡ã€ã«ïŒpackage.jsonçïŒã®å€æŽå¶é èšå®ãã¡ã€ã«é¡ã®å€æŽå¶é åCLAUDE.mdã§å€æŽäžå¯ãã¡ã€ã«ã®ãªã¹ãæèš ãã ãããããŸã§æžããŠãããšããŠããAIã¯çµæ§ç¡èŠããããšããããŸããå®éã«ãèªåçæããŠç·šéçŠæ¢ã«ããŠããèšå®ãã¡ã€ã«ãç·šéãã«è¡ã£ãŠåãããã«ããããšãããã€ãããã¯ãªææ³ããã£ãŠãããããã®ã§ããããæžããŠãããšããŠãç¡èŠãããå¯èœæ§ãããããšã¯å¿µé ã«ãããæ¹ãè¯ããšæããŸãã å€§èŠæš¡ãããžã§ã¯ãã§ã®èª²é¡ãšå¯Ÿç ããã³ããšã³ãã»ããã¯ãšã³ãéçºè
ãç°ãªãå Žåã®åæ å€§èŠæš¡ãããžã§ã¯ãã§ã¯ãããã³ããšã³ãã®éçºè
ãšããã¯ãšã³ãã®éçºè
ãéãå Žåã«ãããã«åæãåã£ãŠããããéèŠãªèª²é¡ãšãªããŸãã éçºé åºã®èª¿æŽ çŸåšã®ã·ã¹ãã ã ãšãããã¯ãšã³ãã®éçºãããŠããããã³ããšã³ãã®éçºããããšããé çªã«ãªãããããã®é åºãã©ãåãããŠããããå¿
èŠã§ãã åæéçºã®ããã®ã¢ãããŒã åæã«éçºãé²ããŠããããã«ã¯ã以äžã®ãããªææ³ãæå¹ã§ãïŒ ã¢ã㯠ã䜿çšãã䞊è¡éçº åå®çŸ©ãå
ã«äœæ ããŠOpenAPI仿§æžã ããå
ã«æž¡ã Orvalã§çæ ããããã³ããšã³ãã³ãŒãã䜿ã£ãŠããã¯ãšã³ããšå調éçº ãã®ã¢ãããŒãã«ãããããã³ããšã³ããšããã¯ãšã³ãã®åæé²è¡ã§ã®éçºãå¯èœã«ãªããŸãã ãã®ææ³ã®å¹æ èªåçæãã€ãã©ã€ã³ãšãããžã§ã¯ãæŽåã«ããïŒ åå®çŸ©ã®éœéœ¬ãå®å
šã«è§£æ¶ AIãäœèšãªãã¡ã€ã«ãè§Šãããšã«ããæå³ããªã倿Žã®é²æ¢ 人éãåŸããããªããã®å€æŽãããã®ãåãããªããç¶æ³ã®åé¿ ã³ãŒãã¬ãã¥ãŒæã®ç¢ºèªãã€ã³ãã®åæž ããã¯ãšã³ããå®çŸ©ããããããããããã³ããšã³ãã䞊è¡ããŠéçºã§ããŸãããããã¯ãšã³ããšããã³ããšã³ãã§åå®çŸ©ãç°ãªããšããåé¡ãã»ãšãã©ãªããªããŸããããã¡ãããããã¯ãšã³ãã®å®çŸ©èªäœãééã£ãŠããã°åäœããŸããããããã³ããšã³ãåŽã§ã®åã®äžäžèŽã¯ããªãæå¶ã§ãããšæããŠããŸãã ãããŸã§ã¯èªåçæã®ä»çµã¿ã䜿ããã«éçºããŠãããããã³ãŒããè¥å¹²æ±ããªãåŸåããããããã³ãåŽã§åå®çŸ©ã®åå®çŸ©ãè¡ãããŠé£æºãåããŠããªããšããåé¡ããåãã¡ã€ã«ãå¢ããŠãããšãã課é¡ããããŸããããã®ä»çµã¿ã«ããããããžã§ã¯ãå
šäœãããæŽçããããã¡ã€ã«æ§é ã«ãªããå¯èªæ§ãåäžãããšå®æããŠããŸãã ç¹ã«åå®çŸ©ã®èªååæã«ãããããã³ããšã³ããšããã¯ãšã³ãã®éçºã䞊è¡ããŠé²ããããããã«ãªããŸããã ãŸãšã æ£çŽãããã¯å°å
¥ããŠã¿ãŠäžçªè¯ãã£ããªãšæããç¹ã§ãããã«ãŒã«ãããŸã远å ãããã«AIã«çæãããã³ãŒããå§åçã«ãããã«ãªããŸããã ã«ãŒã«ãã¬ããã¬ãã«ããŠã³ãŒãããããã«ãããšããã®ãä»åŸã®æ€èšŒãšããŠåã蟌ãã§ãããŸãã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post AIãšçééçºïŒNext.jsÃNest.jsåå®çŸ©åæã®èªåçæãã€ãã©ã€ã³æ§ç¯è¡ first appeared on SIOS Tech. Lab .