codecommitとredmineを連携させる


概要

世の中的にgit→redmineはやり方整ってるけど、codecommit→redmineは無いのでごにょごにょした記録。
手順にはなってませんが、ヒントにはなるかな、と。

※こっちはPullRequestの連携

やりたい構成図

ざっくりこんなかんじ

やったこと概要

redmine側の設定

  • redmineにgit連携のプラグインgithub_hookを入れる
  • redmineのサーバにcodecommit上のリポジトリのbareリポジトリを作る

参考にしたサイトはこちら

AWS側の設定

  • codecommitにトリガーを設定し、codecommit上で何かイベントがあったときにLambdaが起動するようにする
  • Lambdaの設定をする
    • イベント拾ってpostするpythonを書く
    • 宛先がオンプレサーバのため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