diff --git a/.travis.yml b/.travis.yml index 91c74ed..dbd145f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,35 +1,36 @@ -android: - components: - - build-tools-28.0.3 - - android-28 - - extra-google-google_play_services - - extra-google-m2repository - - extra-android-m2repository - - sys-img-x86-android-26 - - sys-img-armeabi-v7a-android-17 +android: + components: + - build-tools-28.0.3 + - android-28 + - extra-google-google_play_services + - extra-google-m2repository + - extra-android-m2repository + - sys-img-x86-android-26 + - sys-img-armeabi-v7a-android-17 language: android -notifications: - slack: "argila:bXGzFxqVuwbq5AC2pbP4J2yq" -script: - - "./gradlew build" - - echo $TRAVIS_COMMIT_MESSAGE - - log=$(git log $TRAVIS_COMMIT_RANGE --oneline) - - echo $'**Change log:**
'${log//$'\n'/
} -before_deploy: - - "git fetch --tags" - - "echo $TRAVIS_COMMIT_MESSAGE" - - "log=$(git log $TRAVIS_COMMIT_RANGE --oneline)" - - "export TAG=$'v'$TRAVIS_COMMIT_MESSAGE" - - "export BODY=$'**Change log:**
'${log//$'\\n'/
}" -deploy: - - provider: releases - api_key: - secure: TZVw75NsfqF9MYBzyBvV1Inx1EXQWZcBuyQzczLXueuZprIHlXo9jJ6gdxO5GaJC5KABbQiXP1fcDieS/CEvYEVfjqy4191gdcBhQ54/cGyF/qJX4e52FwU+5ufqSegv3MY1tmACwlEFFbRXwZ9aR/uaPa9hMGTC0QsxdNpAf4m5HHkp3HGoA24m+Dj1uoH5woNhNQPIC33KS1QkYxTWYm+RzjHzkF7E4hLETVECfX2/vhL8KMLUi+b8aRzHunDOXzi09BMR3SnODHYb8pjrVwOxazDMHMKyWzKdt19CSnV94+SqRuti+NYqrBaWb3YYR+I3PLHkNgdhJUhh4ucAzE/qhMnlwIjKsOYki6BNl4j2KMPzJsmo8IkdIoq5VQY9naAx83gMa7VUqWae6lSvHeNyTLyt3/GnDcnu3j00l0LqV/O8IwyHln4BFNOyd794NeiocrIvDNJPYNg9n5BsiEOaaleS7slF8x/KoJVoi4+ymuxrISGfylLUwfsh5T8b/HnR2VNMuryHrb5xOMmongvEORySfl/gpNHihW060IdgmwdI7WYKKI2nXpKLgxWSUppVOP7JxeRUw7TIHHbQ95gXZmg9Qvckf4wITmk1fJd2wV6pO4xK82Jqh42BC5Uc+DWFl90hpZAm6tHv6BE0O4tY7ZzdBxiwP30cCQrZYa4= - body: $BODY - file: sample/build/outputs/apk/debug/sample-debug.apk - skip_cleanup: true - on: - tags: true - repo: Andati/BriskPesa - - +notifications: + slack: argila:bXGzFxqVuwbq5AC2pbP4J2yq +script: +- "./gradlew build" +- log=`python scripts/cicd.py $GITHUB_API_KEY $TRAVIS_REPO_SLUG` +- echo ${log//$'\n'/
} +- python --version +before_deploy: +- export BODY=${log//$'\n'/
} +deploy: +- provider: releases + api_key: + secure: TZVw75NsfqF9MYBzyBvV1Inx1EXQWZcBuyQzczLXueuZprIHlXo9jJ6gdxO5GaJC5KABbQiXP1fcDieS/CEvYEVfjqy4191gdcBhQ54/cGyF/qJX4e52FwU+5ufqSegv3MY1tmACwlEFFbRXwZ9aR/uaPa9hMGTC0QsxdNpAf4m5HHkp3HGoA24m+Dj1uoH5woNhNQPIC33KS1QkYxTWYm+RzjHzkF7E4hLETVECfX2/vhL8KMLUi+b8aRzHunDOXzi09BMR3SnODHYb8pjrVwOxazDMHMKyWzKdt19CSnV94+SqRuti+NYqrBaWb3YYR+I3PLHkNgdhJUhh4ucAzE/qhMnlwIjKsOYki6BNl4j2KMPzJsmo8IkdIoq5VQY9naAx83gMa7VUqWae6lSvHeNyTLyt3/GnDcnu3j00l0LqV/O8IwyHln4BFNOyd794NeiocrIvDNJPYNg9n5BsiEOaaleS7slF8x/KoJVoi4+ymuxrISGfylLUwfsh5T8b/HnR2VNMuryHrb5xOMmongvEORySfl/gpNHihW060IdgmwdI7WYKKI2nXpKLgxWSUppVOP7JxeRUw7TIHHbQ95gXZmg9Qvckf4wITmk1fJd2wV6pO4xK82Jqh42BC5Uc+DWFl90hpZAm6tHv6BE0O4tY7ZzdBxiwP30cCQrZYa4= + release_notes: "$BODY" + file: sample/build/outputs/apk/debug/sample-debug.apk + skip_cleanup: true + on: + tags: true + repo: Andati/BriskPesa +after_deploy: +- python scripts/confluence.py $ATLASSIAN_EMAIL $ATLASSIAN_TOKEN $GITHUB_API_KEY $TRAVIS_REPO_SLUG +env: + global: + - secure: 1s70r8zZNAsAHI7fctsEdBTWAAvmiDtvK2tThC+2RBxEJnKZqSFzDkLC1LvM1tX8ufN/dD0y6oBdKhOkxlFaiVci/ow+sUZbTx4PBP1/NsleMwk+muK732MQBiMFz4a7Tcwc6tY8OZYovBrPlcbEuZ/UJroinxMJucUOiPUTMmZbvK6XKBOm+8+jH4zIQjhOskJCE81SoZxaQwVpZ0Dur61nPxevLPlrw27Dz6pGON/leTegWa1LhTbD5Yn4t/tcHCxqgn5SEXjgUt+I4EK4+4WkKhn3hACtLo8q2N5BC8+fXdAoR2EbrCxyX4/zcfDpqwtzvkAzdv4Stfy7miCo29bWGDdufvFXxP/oNHS08HYU1Qkg8F2o3egAMvEbA397QSqC2WjFtgJ06UA/DC6JB5nC/slokaoGKllLq8YJfFP5979a6l8rHmk7uFwRNdSx9NqN0lqIu8ByqqmHhG3ju7Z4HSpxUxWdeK7rV4G04545Xp+u5oJc7MWM8wBTHG/8FaQgrE0/+qw3m8zbsmAT7zhJl0qbug4mF7MPx+om8ViFRH/mlneyOScKnioQt3vfWsxy4oheICxAH6a3LHB9R6RWaKn8VzrWuL5wKIYGk/zttX41fZ+YAIS4DUEQ04DG3FL2l0ztr20a4bYdcdXaZ+QxKSYDaW63oylB9Z957K0= + - secure: S2K63SyyYxAZZR5W1EiX8Sv5FcNjJwzOlIyOcOY2LGx1TR8IYj7aD0zV9PUcS0PLePJYTeQdRXhftx+C34Or1a66VFnVNUQSLEazDkQXIYG9agd727YIdOghq6othttNFGB9PQUgyE6AZ81jmUNT064B3bFm/lXxK4bfV4sHdO6ZUO09jByYXIZbEyxvtwoM9vJaH4rrQPJeBwfVxpsH7QLVfsb3pgN9yj4uqhleeOHaHHvNQVevZdxG9K82lNxEQnp1lkYYJymlLcnKwNBsFArHNqwtKHkAhQ7pneclt+uojXp0qKHi4A2pnBJwHPVA483QopJQxTb/mwPQSCpW/R4tZmgfa1IUJF/Zcc/MjlXIWsF7hr8ZFw90h6j7Wa61gf8OnT/kYNPtmYo6/n0wWwN0ZEVdUmFBcyBF6LRn1tMKyIbjNK5O7fx4G1KqP3senfuyvPoTqmBwq/FDQELKIUD/lSeT1He8Wq0mepuEW5G3xKj98KPHUlZTYhFt8J1Tbl/b+Gea/93btY8iAB1Fvg1mbYW1rOEkPU9rfNjMeY/jNDeaZhxoNn9oI5sCzQ61FEugqZaodoEbpooTPniyhWRc+JJmadJaErk99u2f3zEVywfcPEcGbIawZ9g4nyxCMhosxXdRrBCvv6T/u010AKycgaNw7ghR0iwkpPUKV1Q= + - secure: b6tts5l57ga98XglOGSaKtq7+sMVannkMXI4qZwXQJzslRL1GJ8Qrm3gk/iYcyHNFqmuWM53g/GyFm3NASRNKz9YyXSEfY22Smka34+2aePKkzlNG9R+I0BzNiAqStC0FP29ry6Nbkumpi2TmYpK90g9YTx+DLgqCQY4zoujIPMeZO1Kvy5H9BZhSCiyi7ncjkfYJcZ0MbKUwYLPR07F0Ql9zKmcHNNKJtXAryw+POVqk3jc8Oopj50ZpNZwHRyXY8afRON4gqwOzEq/z9m3DdcZC7sFUt5lv2F/G/YR8nIeL9G5OV9WMfI0HJbUbi4RjNpn7p6528GlxXrL/gXIVzfu5Am3Bg/W3rmvQY6x9PrkTb3Tb8nWwcOHlOtmzHbpqFmh2AmILW7whvWVOTS6UCaoWpwylFnlD/r9uSajrUX+nVuKDhgFJ904tpFBQ5mc+d9IpRrbKTLIxdgpVCMsyxGutWH+znxDMvFNi9h0K3ji07vKA7/r9RcyKMQwVz5nixwMAA7z7D2KZ0SVa/tanVdtfer3YuTm9TpkzDjJInybSOSpM7oVtkoetTKOTVdjNrV6+QKqKXryMpl2IS1Z+weHcNkTC2kuZrf4iaWcvk2GM/uFAeGmFtgj812olP8uAakqiKhylVaFV8uI1lDb2BjYftngZpmc7fVOTo9t7g0= diff --git a/scripts/cicd.py b/scripts/cicd.py new file mode 100644 index 0000000..abe1c98 --- /dev/null +++ b/scripts/cicd.py @@ -0,0 +1,57 @@ +import requests +import sys +import json +from datetime import datetime, timedelta + +GraphQL_URL = "https://api.github.com/graphql" +PERIOD = 150 #days + +if len(sys.argv) < 3: + print("Usage: python %s GITHUB_API_KEY REPO_SLUG" % sys.argv[0]) + exit(0) + +GITHUB_API_KEY = sys.argv[1] +REPO_SLUG = sys.argv[2] +headers = {"Authorization": "Bearer " + GITHUB_API_KEY, "content-type": "application/json"} + +date_since = (datetime.today() - timedelta(days=PERIOD)).strftime("%Y-%m-%d") + +query = """ + { + search(query: "repo:%s is:pr is:merged merged:>%s", type: ISSUE, last: 100) { + edges { + node { + ... on PullRequest { + url + title + bodyText + createdAt + mergedAt + } + } + } + } + } + """ % (REPO_SLUG, date_since) + +def cleanBodyText(body): + res = ""; + for i in range(len(body)): + if(body[i]=='\n'): + if len(res)>1 and res[len(res)-1] != '\n': + res += body[i] + else: + res += body[i] + return res + +response = requests.post(GraphQL_URL, data=json.dumps({'query':query}), headers=headers) +if response.status_code == 200: + json_response = response.json() + edges = json_response['data']['search']['edges'] + if len(edges) == 0: + print "No PR found given the search params: " + REPO_SLUG + for edge in edges: + print cleanBodyText(edge['node']['bodyText']) +else: + print "Error code returned " + str(response.status_code) + diff --git a/scripts/confluence.py b/scripts/confluence.py new file mode 100644 index 0000000..037bc62 --- /dev/null +++ b/scripts/confluence.py @@ -0,0 +1,145 @@ +import json +import requests +import sys +from requests.auth import HTTPBasicAuth +from datetime import datetime + +if len(sys.argv) < 5: + print("Usage: python %s ATLASSIAN_EMAIL ATLASSIAN_TOKEN GITHUB_API_KEY REPO_SLUG" % sys.argv[0]) + exit(0) + +BASE_URL = "https://smartregister.atlassian.net/wiki/rest/api/content" +GraphQL_URL = "https://api.github.com/graphql" +ATLASSIAN_EMAIL = sys.argv[1] +ATLASSIAN_TOKEN = sys.argv[2] +GITHUB_API_KEY = sys.argv[3] + +REPO_SLUG = sys.argv[4] +(OWNER_NAME, REPO_NAME) = REPO_SLUG.split("/") + +BASIC_AUTH = HTTPBasicAuth(ATLASSIAN_EMAIL, ATLASSIAN_TOKEN) + +def get_page_json(page_id, expand = False): + if expand: + suffix = "?expand=" + expand + else: + suffix = "" + + url=BASE_URL + "/" + page_id + suffix + response = requests.get(url, auth=BASIC_AUTH) + if response.status_code == 200: + json_body = json.loads(response.text) + return json_body + else: + print "Error code returned " + str(response.status_code) + +def get_page_info(page_id): + url = '{base}/{page_id}'.format( + base = BASE_URL, + page_id = page_id) + response = requests.get(url, auth = BASIC_AUTH) + if response.status_code == 200: + return json.loads(response.text) + else: + print "Error code returned " + str(response.status_code) + +def update_page(page_id, html): + info = get_page_info(page_id) + version = int(info['version']['number']) + 1 + + data = { + 'id' : str(page_id), + 'type' : 'page', + 'title' : info['title'], + 'version' : {'number' : version}, + 'body' : { + 'storage' : + { + 'representation' : 'storage', + 'value' : str(html), + } + } + } + + data = json.dumps(data) + url = '{base}/{page_id}'.format(base = BASE_URL, page_id = page_id) + + response = requests.put( + url, + data = data, + headers = { 'Content-Type' : 'application/json' }, + auth = BASIC_AUTH + ) + if response.status_code == 200: + return json.loads(response.text) + else: + print "Error code returned " + str(response.status_code) + +def insert_row_to_page(current_content, new_html): + # find last occurrence of + body = current_content['body']['storage']['value'] + k = body.rfind("") + return body[:k] + new_html + body[k:] + + +def get_release_details(): + headers = {"Authorization": "Bearer " + GITHUB_API_KEY, "content-type": "application/json"} + query = """ + { + repository(owner: "%s", name: "%s") { + releases(last: 1) { + edges{ + node{ + tagName + publishedAt + description + releaseAssets(first: 1) { + nodes { + downloadUrl + } + } + } + } + } + } + } + """ % (OWNER_NAME, REPO_NAME) + + response = requests.post(GraphQL_URL, data=json.dumps({'query':query}), headers=headers) + if response.status_code == 200: + json_response = response.json() + if json_response['data']['repository'] == None: + print "Exception encountered: " + response.text + return None + tag_name = json_response['data']['repository']['releases']['edges'][0]['node']['tagName'] + published_at = json_response['data']['repository']['releases']['edges'][0]['node']['publishedAt'] + description = json_response['data']['repository']['releases']['edges'][0]['node']['description'] + download_url = json_response['data']['repository']['releases']['edges'][0]['node']['releaseAssets']['nodes'][0]['downloadUrl'] + return {"published_at":published_at, "description":description, "download_url":download_url, "tag_name":tag_name} + else: + print "Error code returned " + str(response.status_code) + +def suffix(day): + return 'th' if 11<=day<=13 else {1:'st',2:'nd',3:'rd'}.get(day%10, 'th') + +def custom_strftime(format, t): + return t.strftime(format).replace('{S}', str(t.day) + suffix(t.day)) + +current_content = get_page_json("1245380625", "body.storage") +#print current_content + +release_details = get_release_details() +if release_details == None: + exit(0) + +published_at = datetime.strptime(release_details["published_at"], "%Y-%m-%dT%H:%M:%SZ") + +if release_details["description"] == None: + release_details["description"] = "" + +new_html = '

'+ release_details["tag_name"] +'

'+ custom_strftime('%b {S}, %Y', published_at) +'

'+ release_details["description"] +'

' +print new_html + +res = update_page("1245380625", insert_row_to_page(current_content, new_html)) +#print(res) +