Skip to content

Commit 72ad22b

Browse files
authored
[DEVOPS-18]: Add map file parser, mariadb inserter (#2732)
1 parent d9a9fa0 commit 72ad22b

File tree

3 files changed

+414
-18
lines changed

3 files changed

+414
-18
lines changed

.github/workflows/build.yml

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -100,25 +100,31 @@ jobs:
100100
cp build/f7-firmware-*/firmware.elf map_analyser_files/firmware.elf
101101
cp ${{ github.event_path }} map_analyser_files/event.json
102102
103-
- name: 'Upload map analyser files to storage'
103+
- name: 'Analyse map file'
104104
if: ${{ !github.event.pull_request.head.repo.fork }}
105-
uses: prewk/s3-cp-action@v2
106-
with:
107-
aws_s3_endpoint: "${{ secrets.MAP_REPORT_AWS_ENDPOINT }}"
108-
aws_access_key_id: "${{ secrets.MAP_REPORT_AWS_ACCESS_KEY }}"
109-
aws_secret_access_key: "${{ secrets.MAP_REPORT_AWS_SECRET_KEY }}"
110-
source: "./map_analyser_files/"
111-
dest: "s3://${{ secrets.MAP_REPORT_AWS_BUCKET }}/${{steps.names.outputs.random_hash}}"
112-
flags: "--recursive --acl public-read"
113-
114-
- name: 'Trigger map file reporter'
115-
if: ${{ !github.event.pull_request.head.repo.fork }}
116-
uses: peter-evans/repository-dispatch@v2
117-
with:
118-
repository: flipperdevices/flipper-map-reporter
119-
token: ${{ secrets.REPOSITORY_DISPATCH_TOKEN }}
120-
event-type: map-file-analyse
121-
client-payload: '{"random_hash": "${{steps.names.outputs.random_hash}}", "event_type": "${{steps.names.outputs.event_type}}"}'
105+
run: |
106+
source scripts/toolchain/fbtenv.sh
107+
get_size()
108+
{
109+
SECTION="$1";
110+
arm-none-eabi-size \
111+
-A map_analyser_files/firmware.elf \
112+
| grep "^$SECTION" | awk '{print $2}'
113+
}
114+
export BSS_SIZE="$(get_size ".bss")"
115+
export TEXT_SIZE="$(get_size ".text")"
116+
export RODATA_SIZE="$(get_size ".rodata")"
117+
export DATA_SIZE="$(get_size ".data")"
118+
export FREE_FLASH_SIZE="$(get_size ".free_flash")"
119+
python3 -m pip install mariadb==1.1.6 cxxfilt==0.3.0
120+
python3 scripts/map_parser.py map_analyser_files/firmware.elf.map map_analyser_files/firmware.elf.map.all
121+
python3 scripts/map_mariadb_insert.py \
122+
${{ secrets.AMAP_MARIADB_USER }} \
123+
${{ secrets.AMAP_MARIADB_PASSWORD }} \
124+
${{ secrets.AMAP_MARIADB_HOST }} \
125+
${{ secrets.AMAP_MARIADB_PORT }} \
126+
${{ secrets.AMAP_MARIADB_DATABASE }} \
127+
map_analyser_files/firmware.elf.map.all
122128
123129
- name: 'Upload artifacts to update server'
124130
if: ${{ !github.event.pull_request.head.repo.fork }}

scripts/map_mariadb_insert.py

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#!/usr/bin/env python3
2+
3+
# Requiremets:
4+
# mariadb==1.1.6
5+
6+
from datetime import datetime
7+
import argparse
8+
import mariadb
9+
import sys
10+
import os
11+
12+
13+
def parseArgs():
14+
parser = argparse.ArgumentParser()
15+
parser.add_argument("db_user", help="MariaDB user")
16+
parser.add_argument("db_pass", help="MariaDB password")
17+
parser.add_argument("db_host", help="MariaDB hostname")
18+
parser.add_argument("db_port", type=int, help="MariaDB port")
19+
parser.add_argument("db_name", help="MariaDB database")
20+
parser.add_argument("report_file", help="Report file(.map.all)")
21+
args = parser.parse_args()
22+
return args
23+
24+
25+
def mariadbConnect(args):
26+
try:
27+
conn = mariadb.connect(
28+
user=args.db_user,
29+
password=args.db_pass,
30+
host=args.db_host,
31+
port=args.db_port,
32+
database=args.db_name,
33+
)
34+
except mariadb.Error as e:
35+
print(f"Error connecting to MariaDB: {e}")
36+
sys.exit(1)
37+
return conn
38+
39+
40+
def parseEnv():
41+
outArr = []
42+
outArr.append(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
43+
outArr.append(os.getenv("COMMIT_HASH", default=None))
44+
outArr.append(os.getenv("COMMIT_MSG", default=None))
45+
outArr.append(os.getenv("BRANCH_NAME", default=None))
46+
outArr.append(os.getenv("BSS_SIZE", default=None))
47+
outArr.append(os.getenv("TEXT_SIZE", default=None))
48+
outArr.append(os.getenv("RODATA_SIZE", default=None))
49+
outArr.append(os.getenv("DATA_SIZE", default=None))
50+
outArr.append(os.getenv("FREE_FLASH_SIZE", default=None))
51+
outArr.append(os.getenv("PULL_ID", default=None))
52+
outArr.append(os.getenv("PULL_NAME", default=None))
53+
return outArr
54+
55+
56+
def createTables(cur, conn):
57+
headerTable = "CREATE TABLE IF NOT EXISTS `header` ( \
58+
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, \
59+
`datetime` datetime NOT NULL, \
60+
`commit` varchar(40) NOT NULL, \
61+
`commit_msg` text NOT NULL, \
62+
`branch_name` text NOT NULL, \
63+
`bss_size` int(10) unsigned NOT NULL, \
64+
`text_size` int(10) unsigned NOT NULL, \
65+
`rodata_size` int(10) unsigned NOT NULL, \
66+
`data_size` int(10) unsigned NOT NULL, \
67+
`free_flash_size` int(10) unsigned NOT NULL, \
68+
`pullrequest_id` int(10) unsigned DEFAULT NULL, \
69+
`pullrequest_name` text DEFAULT NULL, \
70+
PRIMARY KEY (`id`), \
71+
KEY `header_id_index` (`id`) )"
72+
dataTable = "CREATE TABLE IF NOT EXISTS `data` ( \
73+
`header_id` int(10) unsigned NOT NULL, \
74+
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, \
75+
`section` text NOT NULL, \
76+
`address` text NOT NULL, \
77+
`size` int(10) unsigned NOT NULL, \
78+
`name` text NOT NULL, \
79+
`lib` text NOT NULL, \
80+
`obj_name` text NOT NULL, \
81+
PRIMARY KEY (`id`), \
82+
KEY `data_id_index` (`id`), \
83+
KEY `data_header_id_index` (`header_id`), \
84+
CONSTRAINT `data_header_id_foreign` FOREIGN KEY (`header_id`) REFERENCES `header` (`id`) )"
85+
cur.execute(headerTable)
86+
cur.execute(dataTable)
87+
conn.commit()
88+
89+
90+
def insertHeader(data, cur, conn):
91+
query = "INSERT INTO `header` ( \
92+
datetime, commit, commit_msg, branch_name, bss_size, text_size, \
93+
rodata_size, data_size, free_flash_size, pullrequest_id, pullrequest_name) \
94+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
95+
cur.execute(query, data)
96+
conn.commit()
97+
return cur.lastrowid
98+
99+
100+
def parseFile(fileObj, headerID):
101+
arr = []
102+
fileLines = fileObj.readlines()
103+
for line in fileLines:
104+
lineArr = []
105+
tempLineArr = line.split("\t")
106+
lineArr.append(headerID)
107+
lineArr.append(tempLineArr[0]) # section
108+
lineArr.append(int(tempLineArr[2], 16)) # address hex
109+
lineArr.append(int(tempLineArr[3])) # size
110+
lineArr.append(tempLineArr[4]) # name
111+
lineArr.append(tempLineArr[5]) # lib
112+
lineArr.append(tempLineArr[6]) # obj_name
113+
arr.append(tuple(lineArr))
114+
return arr
115+
116+
117+
def insertData(data, cur, conn):
118+
query = "INSERT INTO `data` ( \
119+
header_id, section, address, size, \
120+
name, lib, obj_name) \
121+
VALUES (?, ?, ?, ?, ? ,?, ?)"
122+
cur.executemany(query, data)
123+
conn.commit()
124+
125+
126+
def main():
127+
args = parseArgs()
128+
dbConn = mariadbConnect(args)
129+
reportFile = open(args.report_file)
130+
dbCurs = dbConn.cursor()
131+
createTables(dbCurs, dbConn)
132+
headerID = insertHeader(parseEnv(), dbCurs, dbConn)
133+
insertData(parseFile(reportFile, headerID), dbCurs, dbConn)
134+
reportFile.close()
135+
dbCurs.close()
136+
137+
138+
if __name__ == "__main__":
139+
main()

0 commit comments

Comments
 (0)