ãã®èšäºã¯æçš¿è ã«ãã£ãŠå¯çš¿ãããŸãã ãã¹ã¹ã»ãšã¹ãããMattermostã®ããªã³ã·ãã«ãšã³ãžãã¢ã
é²åãç¶ãããœãããŠã§ã¢éçºç°å¢ã«ãããŠãå ç¢ã§ä¿¡é Œæ§ã®é«ããã©ã°ã€ã³çµ±åã確ä¿ããããšã¯ç°¡åãªããšã§ã¯ãããŸããã Mattermostã«ãšã£ãŠããã©ã°ã€ã³ãã¹ããã¢ãã¯ã®ã¿ã«é Œãããšãå¶éãšãªãããã¹ããè匱ã«ãªããçµ±åã®åé¡ãèŠèœãšãããŸããã Testcontainersã¯ãåé¢ãããDockerç°å¢ãæäŸãããªãŒãã³ãœãŒã¹ããŒã«ã§ãè€éãªçµ±åãã¹ããå®çŸå¯èœã«ããã ãã§ãªããå¹ççã«ããŸããÂ
ãã®ããã°èšäºã§ã¯ãMattermostãTestcontainersãæ¡çšããŠãã¹ãæŠç¥ãå šé¢çã«èŠçŽããèªååã®é²è¡ã粟床ã®åäžãæå°éã®ãªãŒããŒãããã§ã®ã·ãŒã ã¬ã¹ãªãã©ã°ã€ã³çµ±åãå®çŸããæ¹æ³ã«ã€ããŠè©³ãã説æããŸãã

以åã®ã¢ãããŒã
ãããŸã§ãMattermostã¯ãã©ã°ã€ã³ã®ãã¹ãã«ã¢ãã¯ã«å€§ããäŸåããŠããŸããã ãã®ã¢ãããŒãã«ã¯ã¡ãªããããããŸãããã倧ããªæ¬ ç¹ããããŸããã ãã¹ãã¯è匱ã§ãã³ãŒãããŒã¹ã«å€æŽãå ãããããšå£ããããšããããããŸããã ããã«ãããéçºè ã¯ã³ãŒãã®å€æŽãåæ ããããã«ã¢ãã¯ãåžžã«æŽæ°ããå¿ èŠããã£ãããããã¹ãã®éçºãšä¿å®ãå°é£ã«ãªããŸããã
ããã«ãã¢ãã¯ã®äœ¿çšã¯ããã¹ãã®çµ±åã®åŽé¢ãã»ãšãã©èŠèœãšãããããšãæå³ããŠããŸããã ãã®ãã¹ãã§ã¯ãã·ã¹ãã ã®ããŸããŸãªã³ã³ããŒãã³ããçžäºã«ã©ã®ããã«çžäºäœçšããããèæ ®ãããŠããªãã£ããããæ¬çªç°å¢ã§äºæããªãåé¡ãçºçããå¯èœæ§ããããŸããÂ
ããã«ã以åã®ã¢ãããŒãã§ã¯ãèªååãããæ¹æ³ã§ã®é©åãªçµ±åãã¹ããã§ããŸããã§ããã èªååãé²ãã§ããªãã£ãããããã¹ãããã»ã¹ã«æéããããã人çºçãã¹ãçºçãããããªã£ãŠããŸããã ãããã®èª²é¡ã«ãããMattermostã®ãã¹ãæŠç¥ã®è»¢æãå¿ èŠãšãªããè€éãªçµ±åãã¹ãã« Testcontainers ãæ¡çšããããšã«ãªããŸããã
çµ±åãã¹ãã«å¯ŸããMattermostã®ã¢ãããŒã
Goçšã®Testcontainers
Mattermostã¯ãTestcontainers for Goã䜿çšããŠããã©ã°ã€ã³ã®åé¢ããããã¹ãç°å¢ãäœæããŸãã ãã®ãã¹ãç°å¢ã«ã¯ãMattermostãµãŒããŒãPostgreSQLãµãŒããŒãããã³å Žåã«ãã£ãŠã¯APIã¢ãã¯ãµãŒããŒãå«ãŸããŸãã ãã®åŸããã©ã°ã€ã³ã¯MattermostãµãŒããŒã«ã€ã³ã¹ããŒã«ãããéåžžã®APIåŒã³åºããŸãã¯Playwrightãªã©ã®ãšã³ãããŒãšã³ãã®ãã¹ããã¬ãŒã ã¯ãŒã¯ãéããŠãå¿ èŠãªãã¹ããå®è¡ããŸãã
MattermostãµãŒããŒå°çšã®Testcontainersã¢ãžã¥ãŒã«ãäœæããŸããããã®ã¢ãžã¥ãŒã«ã¯ PostgreSQL ãäŸåé¢ä¿ãšããŠäœ¿çšãããã¹ãç°å¢ãæ¬çªç°å¢ã坿¥ã«ãã©ãŒãªã³ã°ããããšãä¿èšŒããŸãã ç§ãã¡ã®ã¢ãžã¥ãŒã«ã䜿çšãããšãéçºè ã¯MattermostãµãŒããŒã«å¿ èŠãªãã©ã°ã€ã³ãç°¡åã«ã€ã³ã¹ããŒã«ããã³æ§æã§ããŸãã
ã·ã¹ãã ã®å颿§ãåäžãããããã«ãMattermostã¢ãžã¥ãŒã«ã«ã¯ããµãŒããŒçšã®ã³ã³ãããšPostgreSQLããŒã¿ããŒã¹çšã®ã³ã³ãããå«ãŸããŠããããããã¯å éšDockerãããã¯ãŒã¯ãä»ããŠæ¥ç¶ãããŠããŸãã
ããã«ãMattermostã¢ãžã¥ãŒã«ã¯ãããŒã¿ããŒã¹ãžã®çŽæ¥ã¢ã¯ã»ã¹ãGoã¯ã©ã€ã¢ã³ããä»ããMattermost APIãžã®çŽæ¥ã¢ã¯ã»ã¹ãå¯èœã«ãããŠãŒãã£ãªãã£æ©èœãããã³ç®¡çè ããŠãŒã¶ãŒããã£ãã«ãããŒã ãäœæããããæ§æã倿Žãããã§ããããã«ããäžéšã®ãŠãŒãã£ãªãã£æ©èœãå ¬éããŠããŸãã ãã®æ©èœã¯ãAPIåŒã³åºãããŠãŒã¶ãŒ/ããŒã /ãã£ãã«ã®äœæãæ§æã®å€æŽãããã«ã¯SQLã¯ãšãªã®å®è¡ãªã©ããã¹ãäžã«è€éãªæäœãå®è¡ããã®ã«éåžžã«åœ¹ç«ã¡ãŸããÂ
ãã®ã¢ãããŒãã¯ããã¹ããèšå®ããæåŸ ããåäœãæ€èšŒããããã®ãã¹ãŠãæºåããããã®åŒ·åãªããŒã«ã»ãããæäŸããŸãã ãã¹ã ã³ã³ãã ã€ã³ã¹ã¿ã³ã¹ã®äœ¿ãæšãŠã®æ§è³ªãšçµã¿åãããããšã§ãåé¢ããããŸãŸã§ã·ã¹ãã ãçè§£ãããããªããŸãã
ãã®å æ¬çãªãã¹ãã¢ãããŒãã«ãããMattermostãµãŒããŒãšãã®ãã©ã°ã€ã³ã®ãã¹ãŠã®åŽé¢ã培åºçã«ãã¹ããããä¿¡é Œæ§ãšæ©èœãåäžããŸãã ãããã䜿çšã®ã³ãŒãäŸãèŠãŠã¿ãŸãããã
次ã®ãããªãã©ã°ã€ã³ã䜿çšããŠãMattermostç°å¢ã®ã»ããã¢ãããéå§ã§ããŸãã
pluginConfig := map[string]any{}
options := []mmcontainer.MattermostCustomizeRequestOption{
mmcontainer.WithPlugin("sample.tar.gz", "sample", pluginConfig),
}
mattermost, err := mmcontainer.RunContainer(context.Background(), options...)
defer mattermost.Terminate(context.Background()
Mattermostã€ã³ã¹ã¿ã³ã¹ãåæåãããããæ¬¡ã®ãããªãã¹ããäœæã§ããŸãã
func TestSample(t *testing.T) {
client, err mattermost.GetClient()
require.NoError(t, err)
reqURL := client.URL + "/plugins/sample/sample-endpoint"
resp, err := client.DoAPIRequest(context.Background(), http.MethodGet, reqURL, "", "")
require.NoError(t, err, "cannot fetch url %s", reqURL)
defer resp.Body.Close()
bodyBytes, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.Equal(t, 200, resp.StatusCode)
assert.Contains(t, string(bodyBytes), "sample-response")
}
ããã§ã¯ãMattermostã€ã³ã¹ã¿ã³ã¹ããã€åè§£ããŠåäœæããããæ±ºå®ã§ããŸãã ãã¹ãããšã«1åã§ãã? äžé£ã®ãã¹ãããšã«äžåºŠã§ãã? ããã¯ããªã次第ã§ãããããªãã®ããŒãºãšãã¹ãã®æ§è³ªã«å³å¯ã«äŸåããŸãã
Node.jsçšãã¹ãã³ã³ãã
Mattermost ã¯ãGo çšã® Testcontainers ã䜿çšããã ãã§ãªãã Testcontainers for ã® Node.js ãæŽ»çšããŠãã¹ãç°å¢ãã»ããã¢ããããŠããŸãã ãåããªãæ¹ã®ããã«èª¬æãããšãTestcontainers for Node.jsã¯ãTestcontainers for Goãšåæ§ã®æ©èœãæäŸããNode.jsã©ã€ãã©ãªã§ãã Testcontainers for Startups Node.jsã Testcontainers for Goã§è¡ã£ãã®ãšåãæ¹æ³ã§ç°å¢ãèšå®ã§ããŸãã ããã«ãããJavaScriptã䜿çšã㊠Playwright ãã¹ããäœæããTestcontainersã«ãã£ãŠäœæãããåé¢ãããMattermostç°å¢ã§ããããå®è¡ããããšãã§ãããã©ã°ã€ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšçŽæ¥å¯Ÿè©±ããçµ±åãã¹ããå®è¡ã§ããŸãã ã³ãŒã㯠GitHub ã§å ¥æã§ããŸãã Â
ãã®ã¢ãããŒãã¯ãTestcontainers for Goãšåãå©ç¹ãæäŸããããã€ã³ã¿ãŒãã§ãŒã¹ããŒã¹ã®ãã¹ãããŒã«(ãã®å Žåã¯Playwright)ã䜿çšããããšãã§ããŸãã Node.js ãš Playwright ã®å®è£ ã«é¢ããã³ãŒããå°ã瀺ããŸãããã
åãã¹ãã®ã³ã³ãããéå§ããã³åæ¢ããŸãã
test.beforeAll(async () => { mattermost = await RunContainer() })
test.afterAll(async () => { await mattermost.stop(); })
次ã«ãMattermostã€ã³ã¹ã¿ã³ã¹ãå®è¡äžã®ä»ã®ãµãŒããŒãšåæ§ã«äœ¿çšããŠãPlaywrightãã¹ããå®è¡ã§ããŸãã
test.describe('sample slash command', () => {
test('try to run a sample slash command', async ({ page }) => {
const url = mattermost.url()
await login(page, url, "regularuser", "regularuser")
await expect(page.getByLabel('town square public channel')).toBeVisible();
await page.getByTestId('post_textbox').fill("/sample run")
await page.getByTestId('SendMessageButton').click();
await expect(page.getByText('Sample command result', { exact: true })).toBeVisible();
await logout(page)
});
});
ããã 2 ã€ã®ã¢ãããŒãã䜿çšãããšãä»ã®åæç°å¢ãã¢ãã¯ããã䜿çšãããããããšãªããAPI ãšã€ã³ã¿ãŒãã§ã€ã¹ãã«ããŒããçµ±åãã¹ããäœæã§ããŸãã ãŸããTestcontainersã€ã³ã¹ã¿ã³ã¹ãåå©çšãããã©ãããæèçã«æ±ºå®ããããã絶察çã«åé¢ããŠãã¹ãã§ããŸãã ãŸããé«åºŠãªåé¢ãéæã§ããããããšã³ãããŒãšã³ãã®ãã¹ããè¡ãéã«æ±æãããç°å¢ã«ãã£ãŠåŒãèµ·ããããäžå®å®ããåé¿ã§ããŸãã
䜿çšäŸ
çŸåšããã®ã¢ãããŒãã 2 ã€ã®ãã©ã°ã€ã³ã«äœ¿çšããŠããŸãã
1ã Mattermost AIã³ãã€ããã
ãã®çµ±åã¯ãAI å€§èŠæš¡èšèªã¢ãã« (LLM) ã䜿çšããŠãŠãŒã¶ãŒã®æ¥åžžæ¥åãæ¯æŽããã¹ã¬ãããäŒè°ã®æŠèŠäœæãã³ã³ããã¹ãããŒã¹ã®åãåãããªã©ãæäŸããŸãã
ãã®ãã©ã°ã€ã³ã¯è±å¯ãªã€ã³ã¿ãŒãã§ãŒã¹ãåããŠãããããTestcontainers for Node ãš Playwright ã®ã¢ãããŒãã䜿çšããŠãã€ã³ã¿ãŒãã§ãŒã¹ãéããŠã·ã¹ãã ãé©åã«ãã¹ãã§ããããã«ããŸããã ãŸãããã®ãã©ã°ã€ã³ã¯ API ãä»ã㊠AI LLM ãåŒã³åºãå¿ èŠããããŸãã ãã®ãªãœãŒã¹ã倧éã«æ¶è²»ããã¿ã¹ã¯ãåé¿ããããã«ãä»»æã® API ãã·ãã¥ã¬ãŒãããå¥ã®ã³ã³ããã§ãã API ã¢ãã¯ã䜿çšããŸãã
ãã®ã¢ãããŒãã«ããããµãŒããŒåŽã®ã³ãŒãã ãã§ãªããéçºäžã«äœãå£ããŠããªãããšã確èªã§ãããããã€ã³ã¿ãŒãã§ã€ã¹åŽã«ãèªä¿¡ãæã€ããšãã§ããŸãã
2ã Mattermost MS Teamsãã©ã°ã€ã³
ãã®çµ±åã¯ãMS TeamsãšMattermostãã·ãŒã ã¬ã¹ã«æ¥ç¶ããäž¡æ¹ã®ãã©ãããã©ãŒã éã§ã¡ãã»ãŒãžãåæããããã«èšèšãããŠããŸãã
ãã®ãã©ã°ã€ã³ã§ã¯ãäž»ã«APIåŒã³åºããè¡ãå¿ èŠããããããTestcontainers for Goã䜿çšããGoã§æžãããã¯ã©ã€ã¢ã³ãã䜿çšããŠAPIãçŽæ¥ãããããŸããã ãã®å Žåãããã©ã°ã€ã³ã¯ãµãŒãããŒãã£ã®ãµãŒãã¹ã§ããMicrosoftã® Microsoft Graph API ã«äŸåããŠããŸãã ãã®ããã«ãAPIã¢ãã¯ã䜿çšããŠããããµãŒãããŒãã£ã®ãµãŒãã¹ã«äŸåããã«ãã©ã°ã€ã³å šäœããã¹ãã§ããŸãã
Microsoft Graph ã®åŒã³åºããé©åã«åŠçããŠããããšã確èªããããã«ãåã Testcontainers ã€ã³ãã©ã¹ãã©ã¯ãã£ã䜿çšããŠãå®éã® Teams API ãšã®çµ±åãã¹ãããŸã ããã€ããããŸãã
Testcontainersã©ã€ãã©ãªã䜿çšããå©ç¹
çµ±åãã¹ãã« Testcontainers ã䜿çšãããšã次ã®ãããªå©ç¹ããããŸãã
- åé¢: åãã¹ãã¯ç¬èªã® Docker ã³ã³ãããŒã§å®è¡ãããããããã¹ãã¯äºãã«å®å šã«åé¢ãããŸãã ãã®ã¢ãããŒãã«ããããã¹ããäºãã«å¹²æžããã®ãé²ããåãã¹ããçœçŽã®ç¶æ ããéå§ãããŸãã
- åçŸæ§: ãã¹ãç°å¢ã¯èªåçã«èšå®ãããããããã¹ãã®åçŸæ§ã¯é«ããªããŸãã ã€ãŸããéçºè ã¯ãã¹ããè€æ°åå®è¡ããŠåãçµæãåŸãããšãã§ãããã¹ãã®ä¿¡é Œæ§ãåäžããŸãã
- 䜿ãããã: Testcontainersã¯ãDockerã³ã³ããã®ã»ããã¢ãããšç Žæ£ã®è€éãããã¹ãŠåŠçããããã䜿ããããã§ãã ããã«ãããéçºè
ã¯ãã¹ãç°å¢ã®ç®¡çã§ã¯ãªãããã¹ãã®äœæã«éäžã§ããŸãã
Testcontainersã§ãã¹ããç°¡åã«
Mattermostããã©ã°ã€ã³ã®è€éãªçµ±åãã¹ãã«Testcontainersã©ã€ãã©ãªã䜿çšããŠããããšã¯ãTestcontainersã®ãã¯ãŒãšæ±çšæ§ã®èšŒã§ãã
Mattermostã¯ãååã«åé¢ãããåçŸæ§ã®ãããã¹ãç°å¢ãäœæããããšã«ããããã©ã°ã€ã³ã培åºçã«ãã¹ããããé«ãä¿¡é Œæ§ãä¿èšŒãããããšãä¿èšŒããŸãã
ããã«è©³ãã
- Docker Newsletter ã賌èªããŠãã ãããÂ
- Testcontainers ã® Web ãµã€ãã«ã¢ã¯ã»ã¹ããŸãã
- ç¡æã¢ã«ãŠã³ããäœæããŠãTestcontainers Cloud ã®äœ¿çšãéå§ããŠãã ããã
- 次ã®ãã®ã«æç¥šããŠãã ãã! å ¬éããŒãããããã芧ãã ããã
- 質åããããŸãã? Docker ã³ãã¥ããã£ããæäŒãããŸãã
- ããã«ãŒã¯åããŠã§ãã? å§ããŸãããã