6
Build, Rilis, dan Publikasi
APKLeaks keluar lewat dua kanal: paket Python di PyPI dan image Docker di Docker Hub. README mendokumentasikan keduanya sebagai pip3 install apkleaks dan docker pull dwisiswant0/apkleaks:latest. README.md:27-311 README.md:43-492 Makefile merangkai build dan unggah kedua kanal itu di mesin lokal, sedangkan .github/workflows/publish.yaml mengulang jalur image setiap kali tag v* didorong. Analisis statis CodeQL berjalan di alur terpisah dan tidak menyentuh artefak rilis.
Variabel dan turunan versi
Makefile menetapkan AUTHOR := dwisiswant0 dan APP := apkleaks, lalu menurunkan IMAGE := $(AUTHOR)/$(APP) menjadi dwisiswant0/apkleaks. VERSION dibaca dari berkas VERSION dengan cat VERSION | tr -d '\n', sedangkan PACKAGE membuang karakter pertama nilai itu lewat cut -c 2- agar nama paket tidak membawa awalan v. Makefile:1-5 Nilai yang terbaca pada commit ini adalah v2.6.3. VERSION:1-1
Pemilihan interpreter juga dinamis: bila direktori venv sudah ada, PYTHON diganti menjadi venv/bin/python3. Makefile:7-14 Target venv membuat virtualenv dengan python3 -m venv venv, setup memasang requirements.txt lalu paket build dan twine, dan setup-venv menjalankan setup dengan PYTHON diarahkan ke virtualenv tersebut. Makefile:16-25
| Variabel | Definisi di Makefile | Nilai pada commit ini |
|---|---|---|
APP | literal | apkleaks |
IMAGE | $(AUTHOR)/$(APP) | dwisiswant0/apkleaks |
VERSION | isi berkas VERSION tanpa newline | v2.6.3 |
PACKAGE | $(APP)- plus VERSION tanpa karakter pertama | apkleaks-2.6.3 |
Makefile:1-5 VERSION:1-1
Graf target Makefile
Target Make saling bergantung lewat prerequisite, bukan lewat urutan penulisan badan resep. build-all menarik build-package dan build-images sekaligus, dan upload-all menarik upload-package serta upload-images. Makefile:48-50 docker hanya alias untuk build-images, sehingga tidak menambah langkah build baru. Makefile:46-46 Target pypi menarik check-package dan build-package. Makefile:36-36
graph TD
venv["venv"] --> setup["setup"]
venv --> setupvenv["setup-venv"]
setup --> buildpkg["build-package"]
setup --> checkpkg["check-package"]
checkpkg --> pypi["pypi"]
buildpkg --> pypi
buildpkg --> uploadpkg["upload-package"]
buildimg["build-images"] --> docker["docker"]
buildimg --> uploadimg["upload-images"]
buildpkg --> buildall["build-all"]
buildimg --> buildall
uploadpkg --> uploadall["upload-all"]
uploadimg --> uploadall
clean["clean"]
style venv fill:#8b5cf6,color:#fff
style setup fill:#8b5cf6,color:#fff
style setupvenv fill:#8b5cf6,color:#fff
style buildpkg fill:#2d7d46,color:#fff
style buildimg fill:#2d7d46,color:#fff
style uploadpkg fill:#2d7d46,color:#fff
style uploadimg fill:#2d7d46,color:#fff
style buildall fill:#336791,color:#fff
style uploadall fill:#336791,color:#fff
style pypi fill:#f59e0b,color:#000
style checkpkg fill:#f59e0b,color:#000
style clean fill:#dc2626,color:#fff
style docker fill:#8b5cf6,color:#fff
%% fig: Graf target Makefile
%% desc: Prerequisite mengarahkan build-package dan build-images ke target gabungan build-all serta ke target unggah upload-all.Jalur paket Python
build-package menjalankan $(PYTHON) -m build, check-package memvalidasi metadata dist/$(PACKAGE)* dengan twine check, dan upload-package mendorong berkas yang sama dengan twine upload. Makefile:27-36 Metadata build diambil dari pyproject.toml: version bersifat dinamis dari berkas VERSION dan dependencies dibaca dari requirements.txt. pyproject.toml:22-243 Satu-satunya dependency runtime yang tercatat saat ini adalah pyaxmlparser>=0.3.24. requirements.txt:14
Backend build adalah setuptools.build_meta dengan requires = ["setuptools>=68"]. pyproject.toml:32-345 [project.scripts] memasang perintah apkleaks yang menunjuk ke apkleaks.cli:main, sedangkan package-data menyertakan *.json untuk paket apkleaks* dan config* agar berkas pola ikut terpasang. pyproject.toml:16-176 pyproject.toml:26-307 Konsekuensinya, versi yang dibaca header() pada instalasi PyPI berasal dari metadata paket, dengan fallback terakhir membaca berkas VERSION bila metadata tidak tersedia. apkleaks/cli.py:10-198 Rincian pemasangan untuk pemakai akhir ada di Instalasi dan Dependensi.
| Target | Perintah | Efek |
|---|---|---|
build-package | $(PYTHON) -m build | menulis artefak ke dist/ |
check-package | twine check dist/$(PACKAGE)* | memeriksa metadata rilis |
upload-package | twine upload dist/$(PACKAGE)* | mengunggah ke PyPI |
Makefile:27-36
Jalur image Docker
build-images membangun image dari Dockerfile di direktori kerja dengan tag dwisiswant0/apkleaks:latest, lalu menandainya ulang dengan $(VERSION) sehingga muncul tag kedua bernilai v2.6.3. upload-images mendorong kedua tag itu. Makefile:38-44 Dockerfile berangkat dari python:3-slim, memasang openjdk-17-jre-headless dan unzip, mengunduh rilis jadx 1.2.0 dari GitHub, membuka zip ke /opt/jadx, dan membuat symlink /usr/local/bin/jadx. Dockerfile:1-16 Setelah itu WORKDIR diset ke /app, requirements.txt disalin dan dipasang, seluruh isi repository disalin, dan image dijalankan lewat ENTRYPOINT ["python", "/app/apkleaks.py"]. Dockerfile:18-25
graph TD
base["python:3-slim"] --> toolchain["openjdk-17-jre-headless dan unzip"]
toolchain --> jadx["jadx 1.2.0 di /opt/jadx"]
jadx --> deps["pip install requirements.txt"]
deps --> copy["COPY . . ke /app"]
copy --> entry["ENTRYPOINT python /app/apkleaks.py"]
style base fill:#f59e0b,color:#000
style toolchain fill:#8b5cf6,color:#fff
style jadx fill:#8b5cf6,color:#fff
style deps fill:#336791,color:#fff
style copy fill:#336791,color:#fff
style entry fill:#2d7d46,color:#fff
%% fig: Urutan lapisan build Dockerfile
%% desc: Image dibangun dari python:3-slim, ditambah JDK dan jadx, lalu dependencies dan kode APKLeaks disalin sebelum entrypoint dijalankan.Workflow Publish
publish.yaml berjalan pada push tag v* dan pada workflow_dispatch yang mewajibkan input tag. .github/workflows/publish.yaml:1-119 Satu variabel VERSION menyatukan kedua jalur: nilainya github.event.inputs.tag untuk dispatch dan github.ref_name untuk push tag, lalu dipakai sebagai ref pada actions/checkout@v4 dengan fetch-depth: 0. .github/workflows/publish.yaml:13-2310
docker/metadata-action@v5 dengan id: meta menurunkan daftar tag dari images: ${{ github.repository }} memakai type=schedule, tiga pola type=semver ({{version}} dengan match=v(\d.\d.\d), {{major}}.{{minor}} dengan match=v(\d.\d), {{major}} dengan match=v(\d)), dan type=sha. .github/workflows/publish.yaml:25-3411 Setelah QEMU dan Buildx disiapkan, docker/login-action@v3 masuk memakai secrets.DOCKER_USERNAME dan secrets.DOCKER_TOKEN, lalu docker/build-push-action@v6 mendorong image dengan push: true, tags dan labels dari output meta, serta build-args VERSION=${{ env.VERSION }}. .github/workflows/publish.yaml:36-4912
graph LR
tag["push tag v*"] --> ver["env VERSION"]
dispatch["workflow_dispatch input tag"] --> ver
ver --> checkout["actions/checkout ref VERSION"]
checkout --> meta["docker/metadata-action id meta"]
meta --> taglist["tags semver dan sha"]
meta --> labels["labels"]
taglist --> buildpush["docker/build-push-action"]
labels --> buildpush
qemu["setup-qemu-action"] --> buildpush
buildx["setup-buildx-action"] --> buildpush
login["docker/login-action"] --> buildpush
secrets["secrets DOCKER_USERNAME dan DOCKER_TOKEN"] --> login
buildpush --> hub["image di Docker Hub"]
style tag fill:#f59e0b,color:#000
style dispatch fill:#f59e0b,color:#000
style ver fill:#8b5cf6,color:#fff
style meta fill:#8b5cf6,color:#fff
style taglist fill:#8b5cf6,color:#fff
style secrets fill:#dc2626,color:#fff
style login fill:#dc2626,color:#fff
style buildpush fill:#2d7d46,color:#fff
style hub fill:#336791,color:#fff
%% fig: Alur workflow Publish
%% desc: Tag atau input manual menentukan VERSION, metadata-action menurunkan tag image, lalu build-push-action mendorong image ke Docker Hub.| Step | Action atau nilai | Peran |
|---|---|---|
| checkout | actions/checkout@v4, ref: "${{ env.VERSION }}" | mengambil kode tepat pada tag rilis |
| meta | docker/metadata-action@v5 | menurunkan tag dari semver dan sha |
| login | docker/login-action@v3 | autentikasi ke Docker Hub |
| build | docker/build-push-action@v6, push: true | build dan dorong image |
.github/workflows/publish.yaml:36-4912
Analisis CodeQL
codeql.yaml menjalankan satu job analyze di ubuntu-latest dengan matrix satu bahasa, python, dan fail-fast: false agar kegagalan satu entri tidak membatalkan entri lain. .github/workflows/codeql.yaml:14-2213
| Event | Konfigurasi |
|---|---|
push | branch master |
pull_request | branch master dan dev |
schedule | cron 26 16 * * 0 |
.github/workflows/codeql.yaml:1-1214
Langkah analisis memakai actions/checkout@v2, lalu github/codeql-action/init@v1 dengan languages: ${{ matrix.language }}, github/codeql-action/autobuild@v1, dan github/codeql-action/analyze@v1. .github/workflows/codeql.yaml:22-3215 Versi action di berkas ini tertinggal dari publish.yaml yang sudah memakai actions/checkout@v4 dan action v5/v6. Prosedur pelaporan temuan ada di Kebijakan Keamanan dan Pelaporan Kerentanan.
Catatan operasional
⚠️
make pypimendaftarkancheck-packagesebagai prerequisite pertama. GNU Make menjalankan prerequisite dari kiri ke kanan pada build non-paralel, jaditwine check dist/$(PACKAGE)*berjalan sebelumpython -m build. Pada salinan bersih,dist/belum ada sehingga glob tidak menemukan berkas. Makefile:36-36 Jalankanmake build-package check-packagedua kali berurutan, atau panggilupload-packagesetelahbuild-package. Makefile:27-36
⚠️
make cleanbersifat destruktif:rm -rfv dist/ venv/menghapus artefak build dan virtualenv, laludocker image rm -f dwisiswant0/apkleaksmenghapus image lokal. Nama image pada baris itu ditulis literal, bukan lewat$(IMAGE), sehingga pemindahan variabelIMAGEtidak mengubah sasarannya. Makefile:52-54
⚠️
publish.yamlmengirimbuild-args VERSION=${{ env.VERSION }}, tetapi Dockerfile tidak mendeklarasikanARG VERSION. Nilai itu hanya tercermin pada tag image, bukan pada lapisan build. .github/workflows/publish.yaml:36-4912 Dockerfile:1-16
⚠️ Makefile menandai image dengan string
VERSIONapa adanya (dwisiswant0/apkleaks:v2.6.3), sedangkanmetadata-actionmenurunkan tag lewat pola{{version}},{{major}}.{{minor}}, dan{{major}}yang bekerja pada nilai hasilmatch=v(\d.\d.\d). Periksa tag yang benar-benar terbit di Docker Hub sebelum menarik image. Makefile:38-44 .github/workflows/publish.yaml:25-3411