codecommit의 PullRequest를 redmine 티켓에 연결

개요



이것의 시리즈
codecommit에서 pullrequest했을 때에, 관련하는 redmine의 티켓의 코멘트에 통지를 내고 싶어서 고맙게 한 기록.
절차는 아니지만 힌트가 될까요.
이런 식으로.


하고 싶은 구성도



자꾸 이런 칸지


했던 일 개요



전제



codecommit에서 브랜치를 끊을 때 반드시 redmine의 티켓 번호를 기재하는 운용 룰로 하고 있었으므로, 갱신 대상의 티켓 번호는 브랜치명으로부터 가져오기로 했다

redmine 측 설정



API 사용
  • 관리자로 들어가 "관리"→ "설정"에서



  • AWS 측 설정



    Lambda 설정하기
  • sns에서 통지 된 메시지를 집어 들고 redmine의 restAPI를 두드리는 파이썬 작성

  • python_redmine을 사용하도록 LambdaLayer를 구성했습니다
  • 참고로 한 사이트는 여기
  • 대상이 온프레임 서버로 VPC를 통해 통신할 수 있어야 하고 Lambda가 VPC를 시작할 수 있도록 허용

  • codecommit에 알림 규칙을 설정하고 codecommit에서 이벤트가있을 때 SNS에 메시지가 날아갑니다.
  • 이번은 이하의 설정으로했다



  • 힘든 점


  • sns에서받은 데이터 (json 형식)의 "Message"는 codecommit이 발한 json이라고 생각되며 여기에서 필요한 것을 redmine에 던지고 싶었지만 이것을 얻기 어려웠습니다. 했다.
  • 다음과 같이 할 수 있었다.
    ※여기에 대해 좋은 방법이나 메카니즘을 알면 꼭 가르쳐 주세요
  • 
        # このような取り出しをしたら「TypeError: string indices must be integers」になった
        # eventName = event['Records'][0]['Sns']['Message']['detail']['event']
    
        # どうも"Message"は単なるstringみたいなので、
        # 仕方ないので一度json形式に変換して必要なキーを取り出した
    
        Message_str = event['Records'][0]['Sns']['Message'] 
        Message = json.loads(Message_str)
        eventName = Message['detail']['event']
    

    Lambda 코드


    import json
    from redminelib import Redmine
    import re
    
    def lambda_handler(event, context):
    
        # SNSのメッセージからcodecommitのメッセージを抜き出す
        # ただしstringになってしまうので、最後にjson.loadsをする
        Message_str = event['Records'][0]['Sns']['Message']
        Message = json.loads(Message_str)
        # print("Message " +str(Message))
    
        # redmineに投げるリクエストに必要な要素を取り出す
        branchName = Message['detail']['sourceReference'].split('/')[2]
        eventName = Message['detail']['event']
        notificationBody = Message['detail']['notificationBody']
    
        #print("branchName " +str(branchName))
        #print("eventName " +str(eventName))
        #print("notificationBody "+str(notificationBody))
    
    
        # redmineを更新する
    
        # 対象チケット番号をブランチ名から取得する
        m = re.search(r'#\d+', branchName)
        issueNo_str = str(m.group())
    
        # もしも対象チケット番号がなかったら処理しない、あったら処理する
        if issueNo_str:
            issueNo = int(issueNo_str[1:])
    
            redmine = Redmine('http://<redmineurl>/', username='admin', password='xxxxxx')
            issue = redmine.issue.get(issueNo)
            issue.notes = notificationBody
            issue.save()
    
            #print(issue)
            #print(issue.notes)
    
    
    
    

    좋은 웹페이지 즐겨찾기