![](https://habrastorage.org/webt/b8/yr/3c/b8yr3cnk_sb5zi2j6cpkczd3n5a.png)
G Suiteã®äŒç€Ÿã®ã¡ã€ã³ãã¡ã€ã³ã.ruãã.comã«å€æŽãããã¹ãŠã®ããŒã¿ãã«ã¬ã³ããŒããšã€ãªã¢ã¹ããµãŒãããŒãã£ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãä¿åããå¿ èŠããããŸããã ã€ã³ã¿ãŒããããžã®ç§»è¡ã«é¢ããæ å ±ã¯ããŸããããŸããããŸãã¯ãGoogleã®å©ããé€ããŠãäœãèŠã€ãããªãã£ãããããã®ããŠããŒãäœæãããŸããã 誰ãããããç¹°ãè¿ãããšã«æ±ºããå Žåã«åœ¹ç«ã¡ãŸãã
å®éã«ã¯ãæåã¯äŒç€Ÿãpixonic.ruãã¡ã€ã³ã䜿çšããŠããŸããã ãã®åŸãããã¯ããŒã pixonic.comãè¿œå ãããŸããããããã©ã«ãã§ã¯ã©ãã§ã.ruãŸãŒã³ã«ã¡ãŒã«ããããŸããã ãŸããå€ãã®äŒç€Ÿã®åŸæ¥å¡ã¯å€åœã®ååãã¯ã©ã€ã¢ã³ããšããåãããŠãããããåœéçãªãã©ãŒãããã䜿çšããããšããèŠæããããŸããã ãããè¡ãã«ã¯ãã¢ã«ãŠã³ãèšå®ã«å ¥ããã¡ã€ã³ã®ã¡ãŒã«ã¢ãã¬ã¹ãåå¥ã«å€æŽããäŒæ¥ãã³ãã¬ãŒãã«åŸã£ãŠçœ²åãããå¿ èŠããããŸããã 誰ããããããã£ãããã§ã¯ãããŸããïŒãŸãã¯ãã£ããããã°ããããŠããïŒãã¡ãã»ãŒãžãã©ã³ãã§ã©ã®ãããªæ··ä¹±ãšæ··ä¹±ãèµ·ãã£ãŠãããæ³åã§ããŸãã å€éšããŒãããŒã®å Žåã眲åãç°ãªããããããã¯ããã«èŠæ ããæªãèŠããŸããã
äžè¬ã«ã決å®ãããæãæ¥ãŸãã-ãã¹ãŠã®éä¿¡ã¯pixonic.comã¡ãŒã«ã䜿çšããŠå®æœããå¿ èŠããããŸãã ã¿ã¹ã¯ã¯ã·ã¹ãã 管çè ã«ä»»ãããŸããã
èšäºã®æåŸã«ã¯ãã¹ã¯ãªããå šäœãžã®ãªã³ã¯ããããããããã¹ãã«ã¯ãã®äžéšã®ã¿ãå«ãŸããŸãã
Googleã¯ããžãã¹ã«Googleã䜿çšããŠãããããã¡ãŒã«ã¯åããµãŒãã¹äžã«ãããŸãã ã ããäœããã£ãïŒ
- ãã¡ã€ã³pixonic.ruã
- ãšã€ãªã¢ã¹ã¯pixonic.comããã³pixonic.orgã§ãã
- ã200ã¢ã«ãŠã³ãããã³ã80é åžã°ã«ãŒãã
- äžéšã®ã¢ã«ãŠã³ãã®ãšã€ãªã¢ã¹ã®æã
- äŒç€Ÿã®å ±éã«ã¬ã³ããŒãå«ãã«ã¬ã³ããŒã
- æ¥ç¶ãããGoogle Analyticsã
- Googleãã©ã€ãã«é¢ããæ°åãã©ãã€ãã®éèŠãªæ å ±ã
- Googleã¢ã«ãŠã³ãã䜿çšããŠæ¿èªãè¡ããããµãŒãããŒãã£ã®ãµãŒãã¹JiraãSlackãªã©ã
èšç»ããããã®ïŒ
- pixonic.comãã¡ã€ã³ãã¡ã€ã³ã«ããpixonic.ruãšpixonic.orgããšã€ãªã¢ã¹ã«ããŸãã
- pixonic.comã®ãã¹ãŠã®ã¢ã«ãŠã³ãããGoogleãã©ã€ãã«ä¿åãããŠãããã¹ãŠã®éä¿¡ããã³æ å ±ãšãšãã«ç§»åããŸãã
- åå è ã®æ§æãšæš©å©ãä¿æããéµäŸ¿ã°ã«ãŒãã®ç§»è»¢ã
- ãã¹ãŠã®ãŠãŒã¶ãŒãšã€ãªã¢ã¹ãä¿åããŸãã
- ã¢ã«ãŠã³ãã®Googleãã©ã€ãå ã®ãã¹ãŠã®å ±æãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãä¿åããŸãã
- ã¹ã±ãžã¥ãŒã«ãããäŒè°ããã³ã€ãã³ãã«é¢ããæ å ±ã倱ãããªãããã«ã«ã¬ã³ããŒãä¿åããŸãã
- Jiraããã³Slackã§ã¢ã¯ã»ã¹ãä¿åããŸãã
- ã¡ãŒã«ã®æ倱ãé¿ããããã«æ倧éã«ã
ãã¡ããã圌ãããã¯ãã«ã«ãµããŒãã«æåã«æžããã®ã¯ãã¡ã€ã³ãã¡ã€ã³ãå€æŽããããšã§ããã 圌ãã¯çããåŸãŸãã-圌ãã¯ãããè¡ãããšãã§ãããäžè¬çã«ã圌ãã¯ããã決ããŠå±éºã«ããããªãããšãå©èšããŸããã
ããã£ã åãŠãŒã¶ãŒã®ã¢ã«ãŠã³ããæåã§åæ§æããããšã¯ãããªãèŠèŸŒã¿ããããŸãã ããã«ãæ°ããåŸæ¥å¡ããšã«åæ§ã®æé ãåå¥ã«è¡ãå¿ èŠããããŸãã APIã䜿çšããŠãããå®è¡ããããšãã§ããŸãããããã§ããã¹ãŠã®åé¡ã解決ããããã§ã¯ãããŸããã å€ãã¯ãå€ãèšå®ã§ãµãŒãããŒãã£ã®ã¡ãŒã«ã¯ã©ã€ã¢ã³ãã䜿çšããŠããŸãã ãããŠãæ°å ¥ç€Ÿå¡ã®åé¡ã¯ã©ãã«ãè¡ããŸããã
蚌ææžã«ã¯ãGoogleèªäœãã移è¡ããããã®5ã€ã®ãã€ã³ãããããŸãã
- è¿œå ã®ãã¡ã€ã³ãè¿œå ããMXã¬ã³ãŒããæ§æããŸãã
- æ°ãããã¡ã€ã³ããã©ã€ããªã«ããŸãã
- æ°ãããã©ã€ããªãã¡ã€ã³ã«åŸã£ãŠãŠãŒã¶ãŒã®ååãå€æŽããŸãã
- æ°ãããã©ã€ããªãã¡ã€ã³ã«åŸã£ãŠã°ã«ãŒãã®ååãå€æŽããŸãã
- å€ããã©ã€ããªãã¡ã€ã³ãåé€ããŸãïŒãªãã·ã§ã³ïŒã
è€éã«èŠããŸããããè©ŠããŠã¿ãå¿ èŠããããŸãã
ãã®ãããªè¡åã®çµæãšããŠäœãæ£ç¢ºã«æ®ããäœã倱ãããå¯èœæ§ããããã¯ç€ºãããŠããŸããã ãã®ããããã¹ãç°å¢ãäœæããå¥ã®G Suitãè³Œå ¥ããŠããã¹ããã¡ã€ã³ãè¿œå ããŸããã
次ã«ã移åã®èŠä»¶ãç¹å®ããŸãããæ å ±ã®ä¿åããŠãŒã¶ãŒã®æš©å©ãšã¢ã¯ã»ã¹ã§ãã ã€ãŸã ãšã³ããŠãŒã¶ãŒãçŽé¢ããªããã°ãªããªãã£ãå¯äžã®åé¡ã¯ããã¹ãŠã®ããã€ã¹ã§æ°ããã¢ã«ãŠã³ããåå ¥åããå¿ èŠãããããšã§ããã
ãããŠã圌ãã¯ãã¹ããéå§ããŸããã
èããããã·ããªãªãšãã¹ãã®ãã¹ãã«ã¯ãã»ãŒ1ãæããããŸããã ãã¹ãçµæã¯éåžžã«å¿åŒ·ããã®ã ã£ããããäœæ¥ç°å¢ã§ãã¹ãŠãç¹°ãè¿ãããšã«ããŸããã
ã¢ã¯ã·ã§ã³ã¢ã«ãŽãªãºã
æäœæ¥ãªãã§ã§ããããšã¯ãã¹ãŠãPython 3.6ã¹ã¯ãªããã«ãã£ãŠè¡ãããŸããã ãµãŒãããŒãã£ã®ã¢ãžã¥ãŒã«ãããgoogle-api-python-clientãoauth2clientãhttplib2ãapiclientãããã³pyopensslãå¿ èŠã§ãã pipã䜿çšããŠåé¡ãªãã€ã³ã¹ããŒã«ããŸãã
Google APIã䜿çšããã«ã¯ãéçºè ã³ã³ãœãŒã«ã§ãµãŒãã¹ã¢ã«ãŠã³ããäœæããå¿ èŠããããŸãã ãããè¡ãã«ã¯ããããžã§ã¯ããäœæïŒãŸãã¯æ¢åã®ãã®ã䜿çšïŒãããè³æ Œæ å ±âè³æ Œæ å ±ã®äœæâãµãŒãã¹ã¢ã«ãŠã³ãããŒããéžæããŸãã
![](https://habrastorage.org/webt/ln/rl/pd/lnrlpdpkqdv4ux9_uqfgyn32890.jpeg)
ãæ°ãããµãŒãã¹ã¢ã«ãŠã³ãããéžæããååãä»ãã圹å²ããææè ãã«å²ãåœãŠãããŒP12ãéžæããŸãïŒããŒã«ã€ããŠã¯ããŸãéèŠã§ã¯ãããŸãããããã¹ãäžã«JSONã䜿çšããŠãã°ã€ã³ããã®ã¯ãç¹å®ã®ãŠãŒã¶ãŒããã®æ瀺çãªèš±å¯ã®ã¿ã§ããã®å Žåã¯é©åã§ã¯ãããŸããïŒã
![](https://habrastorage.org/webt/qq/5e/nc/qq5encohrpzf0o2vtifbekg5gt4.jpeg)
管çè ã®ã³ã³ãœãŒã«ã® [ã»ãã¥ãªãã£]â[詳现èšå®]â[APIã¯ã©ã€ã¢ã³ãã¢ã¯ã»ã¹ã®å¶åŸ¡]ã§ãµãŒãã¹ã¢ã«ãŠã³ããæ¿èªããŸãã
APIã¯ãèš±å¯ãããŠãããšãªã¢ã§ã®ã¿æ©èœããŸãïŒãã¹ãŠã®ãšãªã¢ã®èª¬æã¯ãã¡ãã§ç¢ºèªã§ããŸã ïŒã ç§ã¯æ¬¡ã䜿çšããŸããïŒ
- ã¡ãŒã«ïŒèªã¿åã/æžã蟌ã¿/éä¿¡ïŒ mail.google.com
- www.googleapis.com/auth/activity
- ãã¡ã€ã³www.googleapis.com/auth/admin.directory.groupã§ã°ã«ãŒãã®ããããžã§ãã³ã°ã衚瀺ããã³ç®¡çããŸã
- ãã¡ã€ã³www.googleapis.com/auth/admin.directory.userã®ãŠãŒã¶ãŒã®ããããžã§ãã³ã°ã衚瀺ããã³ç®¡çããŸã
- www.googleapis.com/auth/drive.metadata.readonly
- www.googleapis.com/auth/gmail.settings.basic
- www.googleapis.com/auth/gmail.settings.sharing
APIã®æ€èšŒåŸã移è¡äœæ¥èªäœã«é²ãããšãã§ããŸãã
ã¹ã¯ãªããå šäœã®åºæ¬ã¯ãå¿ èŠãªã¢ã¯ã·ã§ã³ã«å¿ããŠãæš©éãååŸããŠãŠãŒã¶ãŒã«å§ä»»ããããšã§ãã ã€ãŸã ã¡ãŒã«å ã®èª°ãã®çœ²åãå€æŽããå¿ èŠãããå Žåã¯ãåãã¢ã«ãŠã³ãã«å§ä»»ããå¿ èŠããããŸãã ãŠãŒã¶ãŒã®ãªã¹ããååŸããå Žå-管çè ã¢ã«ãŠã³ããªã©ãž
ããã¯ç§ã®ããã«èŠããŸãïŒ
def get_credentials(email): # e-mail credentials = ServiceAccountCredentials.from_p12_keyfile( SERVICE_ACCOUNT_EMAIL, SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'notasecret', scopes=['https://www.googleapis.com/auth/admin.directory.user', 'https://www.googleapis.com/auth/gmail.settings.sharing', 'https://www.googleapis.com/auth/gmail.settings.basic', 'https://mail.google.com/', 'https://www.googleapis.com/auth/activity', 'https://www.googleapis.com/auth/drive.metadata.readonly', 'https://www.googleapis.com/auth/admin.directory.group']) delegate_credentials = credentials.create_delegated(email) return delegate_credentials.authorize(httplib2.Http())
å®éãåã¢ã¯ã·ã§ã³ã®åã«ãã®é¢æ°ãåŒã³åºããŠãããAPIãæäœããã³èµ·åããã¢ããªã±ãŒã·ã§ã³ãéžæããŸãã å®è¡APIã¯ãå®è¡ã®çµæãŸãã¯èŠæ±ãããããŒã¿ã®ãããããè¿ããŸãã
http = get_credentials(adminEmail) service = build('admin', 'directory_v1', http=http) data = service.users().aliases().list(userKey=usermail).execute() print(data)
ãŸãããŠãŒã¶ãŒãã°ã«ãŒããã°ã«ãŒãããŠãŒã¶ãŒãšã€ãªã¢ã¹ãã°ã«ãŒããšã€ãªã¢ã¹ã«é¢ããæ å ±ãªã©ãå¿ èŠãªãã¹ãŠã®ãã®ã®ããã¯ã¢ãããäœæããŸãã
ããã§ã¯ãã¹ãŠãç°¡åã§ããGoogleããã¹ãŠã®æ å ±ãJSON圢åŒã§æäŸãããããæäœãããšäŸ¿å©ãªãããæ å ±ãèŠæ±ãããã¡ã€ã«ã«æžã蟌ã¿ãŸãã
def backUpInfo(filename=''): path = os.path.expanduser('~/Documents/backup/') prefix = path+'backup' if not (filename == ''): prefix = path + filename #backupUsers with open(prefix + 'Users.json', 'w') as file: userInfo = getAllInfoUsers() file.write(json.dumps(userInfo, indent=4)) print(prefix + 'Users.json done') #backupGroups with open(prefix + 'Groups.json', 'w') as file: groupInfo = getAllInfoGroups() file.write(json.dumps(groupInfo, indent=4)) print(prefix + 'Groups.json done') #backupUsersInGroups with open(prefix + 'UsersInGroups.json', 'w') as file: groupInfo = getAllUsersInGroups() file.write(json.dumps(groupInfo, indent=4)) print(prefix + 'UsersInGroups.json done') #backupUsersAliases with open(prefix + 'UsersAliases.json', 'w') as file: info = getUsersAliases() file.write(json.dumps(info, indent=4)) print(prefix + 'UsersAliases.json done') #backupGroupsAliases with open(prefix + 'GroupsAliases.json', 'w') as file: info = getGroupAliases() file.write(json.dumps(info, indent=4)) print(prefix + 'GroupsAliases.json done')
次ã®æé ã§ã¯ãcomãšã€ãªã¢ã¹ãåé€ããŠããã¡ã€ã³ãšããŠè¿œå ããŸãã ãããã®ã¢ã¯ã·ã§ã³ã¯ã管çã³ã³ãœãŒã«âãã¡ã€ã³âãã¡ã€ã³ã®è¿œå /åé€ã§å®è¡ãããŸãã
ãã¡ã€ã³ãè¿œå ãããšããMXã¬ã³ãŒããæå®ããå¿ èŠãããããµãŒãã¹ããããããã§ãã¯ããã®ã«æéãå¿ èŠã§ãïŒãã®å Žåãæ°åããããŸããïŒã ååãšããŠããã¹ãã®çµäºã¯åŸ ã€ããšãã§ãããäœæ¥ãç¶è¡ã§ããŸããã
ãã¡ã€ã³ãè¿œå ããåŸããã¡ã€ã³ãã¡ã€ã³ãã¡ã€ã³ã«ããããšãã§ããŸãïŒããã¯Gã¹ãŒãã®è©Šçšçã§ã¯äžå¯èœã§ããææçã«ã®ã¿è¡šç€ºãããæ¯æãçŽåŸã§ã¯ãªããè©ŠçšæéãçµäºããåŸã«ã®ã¿è¡šç€ºãããŸãããããã¯å¥åŠã§ãïŒã
次ã«ããŠãŒã¶ãŒãšã°ã«ãŒããæ°ãããã¡ã€ã³ã«è»¢éããŸãã ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- 管çè ã¢ã«ãŠã³ãã«æš©éãå§ä»»ããŸãã
- ãŠãŒã¶ãŒã®ãªã¹ãå šäœãã¢ã³ããŒãããŸãã
- äœæ¥ãè¡ã管çè ã¢ã«ãŠã³ããé€ããåãŠãŒã¶ãŒã確èªããŸãã
- APIé¢æ°usersïŒïŒã䜿çšããŠprimaryEmailãã£ãŒã«ããå€æŽããŸãïŒïŒãupdateïŒïŒã
ã€ãŸã APIãä»ããŠãŠãŒã¶ãŒã転éããã«ã¯ãã¡ã€ã³ã®ã¡ãŒã«ã¢ãã¬ã¹ã®ãã¡ã€ã³ã.ruãã.comã«å€æŽããŸãã 次ã®ããã«ãªããŸãã
def moveUsers(domain): # users = getUsers() # , adminEmail for a in users: if adminEmail in a[0]: continue try: renameUser(a[0], domain) print('Done: ' + a[0]) except Exception as e: print(sys.exc_info()[0], ":", e) print('Failed: ' + a[0]) print("Users done!!!")
ãŠãŒã¶ãŒïŒïŒãæŽæ°ïŒïŒé¢æ°ã¯ããŠãŒã¶ãŒãããã¡ã€ã«ã®æ å ±ãå€æŽã§ãããããéåžžã«äŸ¿å©ã§ãã JSON圢åŒã®ãŠãŒã¶ãŒãã°ã€ã³ããã³å€æ°ãã©ã¡ãŒã¿ãŒã¯ããã©ã¡ãŒã¿ãŒã§æž¡ãããŸãã
def renameUser(email, domain): patch = {'primaryEmail': changeMailDomain(email=email, domain=domain)} http = get_credentials(adminEmail) service = build('admin', 'directory_v1', http=http) service.users().update(userKey=email, body=patch).execute()
åæ§ã«ããããã¡ã€ã«ã«æ å ±ãè¿œå ã§ããŸããããšãã°ãSkypeã¢ã«ãŠã³ããè¿œå ã®ããžã·ã§ã³ããã®ä»ã®å¥œã¿ã®ãã®ã§ãã
ã°ã«ãŒãã«å¯ŸããŠãåæ§ã®æäœãå®è¡ããŸãã
ã¢ã«ãŠã³ããæ°ãããã¡ã€ã³ã«ç§»ããŸãã ãã®åŸãæ°ããã¢ã«ãŠã³ãã«ãã°ã€ã³ããŠããµãŒãã¹ã¢ã«ãŠã³ããå床èªèšŒããå¿ èŠããããŸãã ãã®äžã®äœããå€æŽããå¿ èŠã¯ãªãããAuthorized API ClientsãåããååãååŸãã2çªç®ã®åããå¿ èŠãªé åã®ãªã¹ããååŸããŸãã
çŸåšãå€ããã¡ã€ã³ã«ã¯èª°ãããã¹ãã§ã¯ãããŸããã ãããã£ãŠã管çã³ã³ãœãŒã«ã®ãã¡ã€ã³ã®ãªã¹ãã«ç§»åããŠåé€ããŸãã ãããŠããããå Žæã«è¿œå ããŸããããã§ã«ãšã€ãªã¢ã¹ãšããŠïŒå€ããã¡ã€ã³ãå¿ èŠãªå ŽåïŒã
æåŸã®ä»äžãããããŸãã ãšã€ãªã¢ã¹ãcomããæåã«åé€ããåŸããã¹ãŠã®ãŠãŒã¶ãŒãšã°ã«ãŒãã®ãšã€ãªã¢ã¹ãåé€ããããããæåã«è¡ã£ãããã¯ã¢ãããããããã埩å ããå¿ èŠããããŸãã åæã«ããã¹ãŠã®ãšã€ãªã¢ã¹ã§ãã¡ã€ã³ãæ°ãããã¡ã€ã³ã«å€æŽããããšã¯çã«ããªã£ãŠããŸãã ãšã€ãªã¢ã¹ã¯ãã¹ãŠã®ã»ã«ã³ããªãã¡ã€ã³ã«èªåçã«è¡šç€ºãããŸãã ãããè¡ãã«ã¯ãããã¯ã¢ããããæ å ±ãããŠã³ããŒãããåãŠãŒã¶ãŒã調ã¹ãŠããŠãŒã¶ãŒã䜿çšããŠäœ¿çšå¯èœãªå Žåã¯ãã¹ãŠã®ãšã€ãªã¢ã¹ã埩å ããŸãïŒïŒããšã€ãªã¢ã¹ïŒïŒãæ¿å ¥ïŒuserKey = emailãbody = bodyïŒã
åæ§ã®æäœãã°ã«ãŒãã«å¯ŸããŠå®è¡ãããŸãã
ãŸããããã ãã§ãã
Githubãžã®ãªã³ã¯ã
PSäžéšã®å€æŽã¯ããã«ã¯è¡šç€ºãããŸããã ããšãã°ãå€ããã¡ã€ã³ãåé€ããŠãšã€ãªã¢ã¹ãšããŠè¿œå ããåŸã管çããã«ã§ä»ã®ãŠãŒã¶ãŒã®ã¢ã«ãŠã³ãã«ã¢ã¯ã»ã¹ãããšããã®ãšã€ãªã¢ã¹ã¯ããã«è¡šç€ºãããŸãããå®éã«ã¯ååšããŸããã ãããã«ããããããã埩å ããå¿ èŠããããŸãã
çµæã¯äœã§ããïŒ
æå°éã®æ倱ã§ç§»åããŸããã ããã¯ã¢ããã³ããŒãäœæããŠãããšã€ãªã¢ã¹ã®åŸ©å ã«20åã»ã©ããããŸã§äœæ¥ããŸãã
ã¢ã¯ã»ã¹ã¯å€±ããããã¡ãŒã«ã°ã«ãŒãã®æ§æã¯å€æŽãããŠããŸããã ã¢ã«ãŠã³ãã®åé¡ã«ã€ããŠèª°ãäžæºãèšããªãã£ãã圌ãã¯ç§ãã¢ã«ãŠã³ãã«ãã°ã€ã³ããããšããã¡ã€ã«ãèªãããšãã§ããªããšèšãã äžè¬çãªã«ã¬ã³ããŒã¯ãã®ãŸãŸã§ãã¹ã±ãžã¥ãŒã«ãããã€ãã³ãã¯æ¶ããŸããã§ããã
ãµãŒãããŒãã£ã®ãµãŒãã¹ã§ã¯ããã¹ãŠãããã»ã©åã°ããããã§ã¯ãããŸããããåãå ¥ããããŸãã ãããã®èªèšŒã¯é£ã³å»ããŸããã§ããããå€ãã¡ãŒã«ã«ç»é²ãã人ã¯èª°ã§ããã®äžã«è¡ãå¿ èŠããããããGoogle +ãããã°ã€ã³ãéžæããããšã¯ã§ããŸããã ããã¯ããŸã圱é¿ããŸããã§ããããªããªã ãã¹ãŠã®ãŠãŒã¶ãŒã¯ãäœæ¥ã®ååŸã«ããã«ã€ããŠèŠåãããŸããã Slackã®å ŽåããŠãŒã¶ãŒã®ã¢ãã¬ã¹ãå€æŽããããšã«ãããAPIãéããŠåé¡ã解決ããããšãã§ããŸãã æ²ããããªãã¯ã©ãŠãJiraã§ã¯ããã¯æ©èœããŸããããããŒã«ã«ãµãŒããŒã䜿çšãããšåé¡ã¯è§£æ±ºããŸãã
ããŒãã¹ãšããŠãäŒæ¥ã®ãã³ãã¬ãŒãã«åŸã£ãŠäœæãããæ¢è£œã®çœ²åã䜿çšããŠãŠãŒã¶ãŒãäœæããããã®åªããããŒã«ããããŸããã ãŸããå¿ èŠã«å¿ããŠããŠãŒã¶ãŒã®ä»å ¥ãªãã«çœ²åãç°¡åã«æŽæ°ã§ããŸãã ããã«ãAPIã䜿çšãããšãåŸæ¥å¡ãããã¡ã€ã«ã®æ å ±ãæŽæ°ããããéã«åä¿¡ãããããã®ã«äŸ¿å©ã§ãã