æŽæ°æ¥ïŒ2024幎10æ10æ¥
13åã§èªããŸã
GitLab DuoãšGitLab Pagesãã³ãŒããµã³ãã«ãšããã³ããã䜿çšããŠãAIçæã³ãŒãã®ä¿¡é Œæ§ãšã»ãã¥ãªãã£ã匷åããæ¹æ³ãã¹ãããããšã«ã玹ä»ããŸãã

çæç³»AIã¯ããœãããŠã§ã¢ã®éçºãä¿è·ãéçšã容æã«ãããœãããŠã§ã¢éçºæ¥çã«éèŠãªå€åããããããŠããŸãããã®æ°ããããã°ã·ãªãŒãºã§ã¯ãGitLabã®è£œåããŒã ãšãšã³ãžãã¢ãªã³ã°ããŒã ããå¿ èŠãªAIæ©èœããšã³ã¿ãŒãã©ã€ãºå šäœã«çµ±åããã©ã®ããã«äœæããã¹ãããããã€ããããã玹ä»ããŸããGitLab Duoã®æ°æ©èœã«ãã£ãŠDevSecOpsããŒã ãã客æ§ã«ã©ããªäŸ¡å€ããããããããã«ãªãããèŠãŠãããŸãããïŒ
ãœãããŠã§ã¢éçºã§AIããŸããŸãéèŠãªåœ¹å²ãæããããã«ãªãäžãAIçæã³ãŒãã«å¯Ÿããã»ãã¥ãªãã£ç¢ºä¿ãã培åºãããã¹ãã®å®æœã¯æ¥µããŠéèŠã§ããæ¬èšäºã§ã¯ãAIæ©èœã掻çšããŠDevSecOpsã¯ãŒã¯ãããŒã匷åã§ããGitLab DuoãšãGitLab Pagesãçµã¿åãããŠãAIçæã³ãŒããå®å šã«ãã¹ãããæé ãã¹ãããããšã«èª¬æããŠããŸããäžè¬çãªãªã¹ã¯ã軜æžããæ¹æ³ãããã¹ãã®èªåçæãã³ãŒãã®ãã¹ãããã¹ãã¬ããŒãã®ãããã€ãªã©ã®ããã»ã¹ã«ã€ããŠãåãäžããŸãããããã¯ãã¹ãŠãAIçæã³ãŒãã®ä¿¡é Œæ§ãé«ããããã®ã¢ãããŒãã§ãã
ãã¢åç»å ¬éïŒGitLab 17ããŒãã£ã«ããŒã³ãã€ãã³ãã§ãAIäž»å°ã®ãœãããŠã§ã¢éçºã®æªæ¥ãäœéšããŸãããïŒä»ããç»é²ãã
AIçæã³ãŒãã¯ã次ã®ãããªåé¡ã«é »ç¹ã«çŽé¢ããŸãã
äžèšã®ããã«ãAIçæã³ãŒãã¯ãã¢ã«ãŽãªãºã ã®äžäžèŽãäŸåé¢ä¿ã®åé¡ãã»ãã¥ãªãã£ã®è匱æ§ãªã©ã®åé¡ã«ããçŽé¢ããŸããããã°ã©ãã³ã°é¢é£ã®è³ªåã«å¯ŸããChatGPTã®åçã«ã€ããŠãAssociation of Computing MachineryïŒèšç®æ©åäŒïŒãçºè¡šããæè¿ã®ç ç©¶ïŒå€éšãµã€ãïŒã§ã¯ãåçã®52%ã«èª€ã£ãæ å ±ãå«ãŸããŠããã77%ãé床ã«åé·ã§ããããšãããããŸããããããã®æ¬ ç¹ãããã«ããããããããŠãŒã¶ãŒã¯ChatGPTã®å æ¬çã§ããæ§æãããåçã35%ã®å²åã§å¥œã¿ã誀æ å ±ãå«ãŸããŠããŠã39%ã®å²åã§ãããèŠéãããŸããããããã®èª²é¡ã«å¯ŸåŠããã«ã¯ãé«åºŠãªããŒã«ãšãã¬ãŒã ã¯ãŒã¯ã䜿çšããå¿ èŠããããŸãã
GitLabã§ã¯ãéçºã¯ãŒã¯ãããŒå ã«ã»ãã¥ãªãã£å¯Ÿçãçµã¿èŸŒãããšã«çŠç¹ãåœãŠããå æ¬çãªã³ã³ãã³ãæŠç¥ãæ¡çšããŠããŸããGitLab DuoãæŽ»çšããŠAIã«ããã³ãŒãçæãå¿çšããããGitLab Pagesãå©çšããŠãã¹ãã¬ããŒããïŒãŠã§ããµã€ãã«ïŒåã蟌ãã ãããããšã§ãããããããŒã¯AIçæã³ãŒãã®ã»ãã¥ãªãã£ãšä¿¡é Œæ§ã確ä¿ã§ããŸãã
以äžã¯ãGitLab DuoãšGitLab Pagesãçµã¿åãããŠãFlask webãµãŒããŒïŒå€éšãµã€ãïŒãå®è£ ããããšã§AIçæã³ãŒããå®å šãã€åŸ¹åºçã«ãã¹ãããããã®æé ã¬ã€ãã«ãªããŸãã
äžã®ã¹ã¯ãªãŒã³ã·ã§ããã®ã³ã¡ã³ãïŒç·è²ã®ããã¹ãïŒã䜿çšããŠãFlask WebãµãŒããŒãäœæã§ããŸãã

ãŠããããã¹ãã¯ãçæãããã³ãŒãã®æ©èœãæ€èšŒããäžã§äžå¯æ¬ ã§ããGitLab Duoã® /testsã³ãã³ãã䜿çšããŠãçŽæ¥Web IDEå
ã§ãã¹ãã®ææ¡ãçæããŸãããã®ã³ãã³ãã¯ãå
·äœçãªåŽé¢ïŒããã©ãŒãã³ã¹ããªã°ã¬ãã·ã§ã³ãç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšãªã©ïŒã«çŠç¹ãåœãŠãããã«ãæç€ºã远å ããŠã«ã¹ã¿ãã€ãºã§ããŸãã
/testsã³ãã³ãã䜿çšããå¿
èŠã«å¿ããŠæç€ºã远å ããŸãã
GitLab Duoãã£ããã䜿çšããŠãAIãçæããã³ãŒãã®ã¬ãã¥ãŒãšä¿®æ£ãè¡ããŸããããšãã°ãFlask WebãµãŒããŒã®ã³ãŒãã«ã»ãã¥ãªãã£è匱æ§ããªãã確èªããå Žåã¯ã以äžã®ããã³ããã䜿çšããŸãã
ããã³ããïŒãã®ã³ãŒããã¬ãã¥ãŒããŠãæœåšçãªã»ãã¥ãªãã£è匱æ§ãšäŸåé¢ä¿ã®åé¡ãæ€èšŒããŠãã ããã

GitLab Duoãã£ããã䜿çšããããšã§ãäžèšã®ã³ãŒãå ã®è匱æ§ãç¹å®ãããããªããŸãã
ãã¹ããå®è¡ããåŸãGitLab Pagesã䜿çšããŠãããã€ãããã¹ãã¬ããŒããçæããŸãã
ããã³ããïŒGitLab Pagesã䜿çšããŠãããã€ãããã¹ãã¬ããŒããçæããPythonã¹ã¯ãªãããäœæããŠãã ããã

ããã§ã®åŠçå 容ã¯ä»¥äžã®ãšããã§ãã
subprocess.run()ã䜿çšããŠtest_server.pyãã¡ã€ã«ãå®è¡ããåºåïŒãã¹ãçµæïŒããã£ããã£ããŸããtest_reports/test_output.txtã«ä¿åããŸãã<pre>ã¿ã°å
ã«åã蟌ãã HTMLã¬ããŒããçæããtest_reports/index.htmlãšããŠä¿åããŸããGitLab Pagesã䜿çšãããã¹ãã¬ããŒããå
¬éããŸãããã¹ãã¬ããŒãããããã€ããããã®.gitlab-ci.ymlãã¡ã€ã«ã®æ§æã¯æ¬¡ã®ãšããã§ãã
stages:
- test
- deploy
test_job:
stage: test
script:
- python generate_test_report.py
artifacts:
paths:
- test_reports/
pages:
stage: deploy
script:
- mv test_reports public
artifacts:
paths:
- public
ãã®æ§æã§ã¯ãtest_jobã¹ããŒãžã§Pythonã¹ã¯ãªãããå®è¡ããŠãã¹ãã¬ããŒããçæããŸããpagesã¹ããŒãžã§ã¯ãtest_reportsãã£ã¬ã¯ããªãpublicã«ç§»åãããGitLab Pagesããã®ã³ã³ãã³ããæäŸããããã«äœ¿çšãããŸãã
MRãŠã£ãžã§ããã«ãã¹ãã¬ããŒããåã蟌ãããšã§ããã¹ãã®çµæãå³åº§ã«ç¢ºèªã§ããéææ§ãšä¿¡é Œæ§ã確ä¿ã§ããŸããããã¯ã次ã®ããã«ãCI/CDãã€ãã©ã€ã³ã®æ§æã«ãã¹ãã¬ããŒããã¢ãŒãã£ãã¡ã¯ããšããŠå«ããããšã§å®çŸã§ããŸãã
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- echo "Building the project..."
- # Your build commands here
test_job:
stage: test
script:
- mkdir -p test-reports
- python test_server.py > test-reports/results.xml
artifacts:
when: always
reports:
junit: test-reports/results.xml
paths:
- test-reports/results.xml
pages:
stage: deploy
script:
- mkdir .public
- mv test-reports .public/
artifacts:
paths:
- .public
ãã¹ãã¬ããŒããã¢ãŒãã£ãã¡ã¯ããšããŠå«ããã¬ããŒãã»ã¯ã·ã§ã³ã«æå®ããããšã§ãGitLabã«ãã£ãŠãã¹ãçµæãèªåçã«MRãŠã£ãžã§ããã«è¡šç€ºãããŸããããã«ããããã¹ãã®çµæãå³åº§ã«ç¢ºèªã§ããéææ§ãšä¿¡é Œæ§ãåäžããŸãã
AIçæã³ãŒãã®ã¹ããããããæ¢ç¥ã®è匱æ§ãæã€äŸåé¢ä¿ãåã蟌ãã ç¶æ³ãæ³å®ããŠã¿ãŸããããGitLab Duoãšãã®ã»ãã¥ãªãã£ããªã·ãŒã䜿çšããããšã§ããã®äŸåé¢ä¿ã¯ã³ãŒãçæããã»ã¹äžã«æ€åºãããŸããAIã«ãã£ãŠçæããã以äžã®ã¹ããããã®äŸãèŠãŠã¿ãŸãããã
import os
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
query = request.args.get('query')
execute_os_command(query)
return 'You searched for: ' + query
def execute_os_command(command):
os.system(command)
if __name__ == '__main__':
app.run()
ãã®äŸã§ã¯ãæ€çŽ¢ãšã³ããã€ã³ããOSã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ã®è匱æ§ãæã£ãŠããŸããGitLabã®éçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒã³ã³ããŒãã³ããæŽ»çšããããšã§ããã®è匱æ§ã¯CI/CDãã€ãã©ã€ã³äžã«æ€åºãããŸãã
GitLab SASTã¯ãèªåçã«ã³ãŒããåæããŠã»ãã¥ãªãã£è匱æ§ãæ€åºããŸãã以äžã¯ã.gitlab-ci.ymlãã¡ã€ã«ã«çµ±åããŠåé¡ãã¹ãã£ã³ããæ¹æ³ã§ãã
stages:
- build
- test
- sast
- deploy
build_job:
stage: build
script:
- echo "Building the project..."
- # Your build commands here
test_job:
stage: test
script:
- python test_server.py > test-reports/results.xml
artifacts:
when: always
reports:
junit: test-reports/results.xml
paths:
- test-reports/results.xml
sast_job:
stage: sast
script:
- echo "Running SAST..."
artifacts:
reports:
sast: gl-sast-report.json
only:
- branches
pages:
stage: deploy
script:
- mv test-reports public
artifacts:
paths:
- public
ãã®èšå®ã§ã¯ãsast_jobã¹ããŒãžãSASTãå®è¡ããŠã³ãŒãã®è匱æ§ãæ€åºãããã€ãã©ã€ã³ã¢ãŒãã£ãã¡ã¯ãã«å«ãŸããã¬ããŒãïŒgl-sast-report.jsonïŒãçæããŸããGitLab Duoã¯ãã»ãã¥ãªãã£ããªã·ãŒãšåŒ·åãªãã¹ããã¬ãŒã ã¯ãŒã¯ãçµ±åããããšã§ãã客æ§ãAIçæã³ãŒãã®å¹çæ§ãšã»ãã¥ãªãã£ã確ä¿ããããšãæ¯æŽããŸãã
ãœãããŠã§ã¢éçºã«ãããAIã®çµ±åã¯å€§ããªã¡ãªããããããããŸãããæ°ããªèª²é¡ã䌎ããŸããGitLab DuoãGitLab Pagesã®ãããªããŒã«ã䜿çšããããšã§ãããããããŒã¯AIçæã³ãŒãã培åºçã«ãã¹ããããã®ã»ãã¥ãªãã£ãšä¿¡é Œæ§ã確ä¿ã§ããŸãããŸãã¯ãããã®ããŒã«ãã詊ãã«ãªããAIã»ãã¥ãªãã£ãšãã¹ãã®åŒ·åãæ€èšããŠã¿ãŸãããïŒ
ç£ä¿®ïŒå·ç¬ æŽå¹³ @ykawase ïŒGitLabååäŒç€Ÿ ã«ã¹ã¿ããŒãµã¯ã»ã¹æ¬éš ã·ãã¢ã«ã¹ã¿ããŒãµã¯ã»ã¹ãããŒãžã£ãŒïŒ
ä»ããGitLab Ultimateã®ãã©ã€ã¢ã«ãéå§ããŠãGitLab DuoãšGitLab Pagesããå©çšãã ããã