codecommit과 redmine을 연계

개요



세상 중적으로 git→redmine은 방식이 갖추어져 있지만, codecommit→redmine은 없기 때문에 즐거운 기록.
절차는 아니지만 힌트가 될까요.

※이쪽은 PullRequest의 제휴

하고 싶은 구성도



자꾸 이런 칸지


했던 일 개요



redmine 측 설정


  • redmine에 git 연계 플러그인 github_hook 넣기
  • redmine 서버에 codecommit에 리포지토리의 bare 리포지토리를 만듭니다

  • 참고로 한 사이트는 여기

    AWS 측 설정


  • codecommit에서 트리거를 설정하고 codecommit에서 이벤트가있을 때 Lambda가 시작되도록합니다
  • Lambda 설정하기
  • 이벤트 주워 포스트하는 파이썬을 쓴다
  • 대상이 온프레 서버를 위해 VPC를 통해 통신 할 수 있어야하고 Lambda가 VPC를 시작할 수있게합니다.


  • 힘든 점


  • bare 리포지토리를 ID/Pass 입력 없이 fetch 할 수 있게 한다

  • 여기 참고
  • redmine이 컨테이너이므로 컨테이너 안에서 할 수 있도록 exec -it로 들어가서 끝나고 commit이 귀찮습니다

  • github_hook에 무엇을 POST해야할지 모르겠습니다.
  • 자신의 gitlab에서 테스트를 보내 보았는데, 무엇을 보내고 있는지 로그에서 확인했습니다

  • VPC에서 Lambda 시작
  • IAM 정책이 부족하여 오류가 발생했음을 깨닫지 못했습니다 (위쪽에서 엄청나게 큰).


  • Lambda 코드


    import json
    import boto3
    import urllib
    import urllib.request
    
    codecommit = boto3.client('codecommit')
    
    def lambda_handler(event, context):
    
        references = { reference['ref'] for reference in event['Records'][0]['codecommit']['references'] }
        #print("-------------------")
        #print("event: " +str(event)) 
        #print("context: " +str(context)) 
    
        # event(Lambdaに渡される情報)からrepository名とcommitNoを拾ってくる
        repository = event['Records'][0]['eventSourceARN'].split(':')[5]
        commitNo = event['Records'][0]['codecommit']['references'][0]['commit']
    
        try:
            # codecommitからcomittした情報をもろもろ取ってくる
            response = codecommit.get_commit(repositoryName=repository,commitId=commitNo)
    
            # redmine連携に必要な情報をセット
            id = response['commit']['commitId']
            message = response['commit']['message']
            timestamp = response['commit']['author']['date']
            authorname= response['commit']['author']['name']
            authoremail= response['commit']['author']['email']
    
            # codecommitからcodecommitのURL情報を取ってくる(いらないかも)
            response = codecommit.get_repository(repositoryName=repository)
            codecommiturl=response['repositoryMetadata']['cloneUrlHttp'] +"/" +id
    
    
            # redmineにPOSTする
            # <redmine-url><projectname><repositryname>は環境に合わせて
            redmine = 'http://<redmine-url>/github_hook?project_id=<projectname>&repository_id=<repositryname>'
            str_data = {
                'id': id,
                'message': message,
                'timestamp': timestamp,
                'url': codecommiturl,
                'author': {
                    'name': authorname,
                    'email': authoremail
                }
            }
            headers = {
                'Content-Type': 'application/json'
            }
    
    
            json_data = json.dumps(str_data).encode("utf-8")
    
            # requestを作成
            req = urllib.request.Request(url=redmine,data=json_data,headers=headers)
    
            # requestを投げる
            with urllib.request.urlopen(req) as res:
                body = res.read().decode('utf-8')
                print(body)
            try:
                with urllib.request.urlopen(req) as res:
                    body = res.read()
                    print(res)
                    print(body)
            except urllib.error.HTTPError as err:
                print(err.code)
            except urllib.error.URLError as err:
                print(err.reason)
    
            return response['repositoryMetadata']['cloneUrlHttp']
    
        except Exception as e:
            print(e)
            print('Error getting repository {}. Make sure it exists and that your repository is in the same region as this function.'.format(repository))
            raise e
    

    좋은 웹페이지 즐겨찾기