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 = '
'+ custom_strftime('%b {S}, %Y', published_at) +'
'+ release_details["description"] +'