ci

package
v1.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2026 License: MIT Imports: 2 Imported by: 0

README

F-Droid Server Tools CI/CD Pipeline

This is the F-Droid server tools' CI/CD pipeline, imported from fdroid/fdroidserver.

Overview

F-Droid Server is the server and build tools for F-Droid, the free and open-source Android app repository. This pipeline demonstrates Python application testing and Android build integration.

Pipeline Characteristics

  • Project ID: 36527
  • Lines of Code: ~375 lines
  • Language: Python
  • Features Demonstrated:
    • Python testing across multiple versions
    • Android SDK integration
    • APK building and signing
    • Reproducible builds
    • Comprehensive test coverage

Key Features

Multi-Version Python Testing

Tests across Python 3.x versions to ensure compatibility.

Android Build Pipeline

Integration with Android SDK for APK building and verification.

Reproducible Builds

Ensures builds are reproducible for security and verification.

Comprehensive Testing

Unit tests, integration tests, and end-to-end testing of build tools.

What You Can Learn

  1. Python CI/CD - Testing Python applications across versions
  2. Android build automation - Automating Android app builds
  3. Reproducible builds - Ensuring build reproducibility
  4. F-Droid infrastructure - How F-Droid's build system works

Source

Building This Example

cat pipeline.go
mkdir my-fdroid-pipeline && cp pipeline.go my-fdroid-pipeline/
cd my-fdroid-pipeline && go mod init example/my-fdroid-pipeline && go mod tidy

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Bandit = pipeline.Job{
	Name:         "bandit",
	Script:       List("apt-get install python3-pip", "$pip install --break-system-packages bandit", "bandit -r -ii --ini .bandit"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroid", "makebuildserver", "setup.py", "fdroidserver/*.py", "tests/*.py"),
		},
	),
}
View Source
var Black = pipeline.Job{
	Name:         "black",
	Stage:        "lint",
	Script:       List("apt-get install black", "black --check --diff --color $CI_PROJECT_DIR"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:trixie-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
}
View Source
var BuildDocumentation = pipeline.Job{
	Name:         "Build documentation",
	Script:       List("apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver", "apt purge fdroidserver", "pydocstyle --verbose --match='(?!apksigcopier|looseversion|setup|test_).*\\.py' fdroidserver", "cd docs", "sphinx-apidoc -o ./source ../fdroidserver -M -e", "PYTHONPATH=.. sphinx-autogen -o generated source/*.rst", "PYTHONPATH=.. make html"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroid", "makebuildserver", "setup.py", "fdroidserver/*.py", "tests/*.py"),
		},
	),
	Artifacts: pipeline.Artifacts{
		Paths: List("docs/build/html/"),
	},
}
View Source
var BuildserverRunTests = pipeline.Job{
	Name:   "buildserver run-tests",
	Script: List("apt-get update", "apt-get install gnupg-agent python3-babel python3-biplist python3-clint python3-pycountry", "./tests/run-tests", "cd $CI_PROJECT_DIR/locale", "for locale in *; do test -d $locale || continue; for cmd in `sed -n 's/.*(\"\\(.*\\)\", *_.*/\\1/p' $CI_PROJECT_DIR/fdroid`; do LANGUAGE=$locale $CI_PROJECT_DIR/fdroid $cmd --help > /dev/null; done done"),
	Image:  pipeline.Image{Name: "registry.gitlab.com/fdroid/fdroidserver:buildserver"},
}
View Source
var DebianTesting = pipeline.Job{
	Name:         "debian_testing",
	Script:       List("apt-get install aapt androguard apksigner dexdump fdroidserver git gnupg ipfs-cid python3-biplist python3-defusedxml python3-libcloud python3-pycountry python3-setuptools sdkmanager", "python3 -c 'import fdroidserver'", "python3 -c 'import androguard'", "python3 -c 'import sdkmanager'", "cd tests", "./run-tests"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:testing"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			If: "$CI_COMMIT_BRANCH == \"master\" && $CI_PROJECT_PATH == \"fdroid/fdroidserver\"",
		},
	),
}
View Source
var Docker = pipeline.Job{
	Name:   "docker",
	Script: List("export TEST_IMAGE=$CI_REGISTRY_IMAGE:$(printf $CI_COMMIT_REF_NAME | sed 's,[^a-zA-Z0-9_.-],_,g')", "cd buildserver", "docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) .", "docker tag $TEST_IMAGE $RELEASE_IMAGE", "docker tag $TEST_IMAGE ${RELEASE_IMAGE}-bookworm", "echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com", "if test -z \"$FDROID_PUSH_DOCKER_IMAGE\"; then echo \"Skipping docker push to save quota on your gitlab namespace.\"; echo \"If you want to enable the push, set FDROID_PUSH_DOCKER_IMAGE in\"; echo \"https://gitlab.com/$CI_PROJECT_NAMESPACE/fdroidserver/-/settings/ci_cd#js-cicd-variables-settings\"; exit 0; fi", "docker push $RELEASE_IMAGE", "docker push $RELEASE_IMAGE-bookworm"),
	Image:  pipeline.Image{Name: "docker:dind"},
	Services: List(
		pipeline.Service{Name: "docker:dind"},
	),
	Variables: Json{
		"RELEASE_IMAGE": "$CI_REGISTRY_IMAGE:buildserver",
	},
	Rules: List(
		pipeline.Rule{
			If:      "$CI_COMMIT_BRANCH == \"master\" && $CI_PROJECT_PATH == \"fdroid/fdroidserver\"",
			Changes: List(".gitlab-ci.yml", "makebuildserver", "buildserver/*"),
		},
	),
}
View Source
var FdroidBuild = pipeline.Job{
	Name:   "fdroid build",
	Script: List("apt-get update", "apt-get dist-upgrade", "apt-get clean", "test -n \"$fdroidserver\" || source /etc/profile.d/bsenv.sh", "ln -fsv \"$CI_PROJECT_DIR\" \"$fdroidserver\"", "apt-get install sdkmanager", "rm -rf \"$ANDROID_HOME/tools\"", "sdkmanager \"tools\" \"platform-tools\" \"build-tools;31.0.0\"", "git ls-remote https://gitlab.com/fdroid/fdroiddata.git master", "git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git", "cd fdroiddata", "for d in build logs repo tmp unsigned $home_vagrant/.android; do test -d $d || mkdir $d; chown -R vagrant $d; done", "export GRADLE_USER_HOME=$home_vagrant/.gradle", "export fdroid=\"sudo --preserve-env --user vagrant env PATH=$fdroidserver:$PATH env PYTHONPATH=$fdroidserver:$fdroidserver/examples env PYTHONUNBUFFERED=true env TERM=$TERM env HOME=$home_vagrant fdroid\"", "git -C $home_vagrant/gradlew-fdroid pull", "chown -R vagrant $home_vagrant", "chown -R vagrant $fdroidserver/.git", "chown vagrant $fdroidserver/", "chown -R vagrant .git", "chown vagrant .", "$fdroid build --verbose --latest org.fdroid.fdroid.privileged", "$fdroid build --verbose --on-server --no-tarball --latest org.fdroid.fdroid", "if dpkg --list sudo; then echo \"sudo should not be still there\"; exit 1; fi", "if [ ! -f repo/status/running.json ]; then echo \"ERROR: running.json does not exist!\"; exit 1; fi", "if [ ! -f repo/status/build.json ]; then echo \"ERROR: build.json does not exist!\"; exit 1; fi"),
	Image:  pipeline.Image{Name: "registry.gitlab.com/fdroid/fdroidserver:buildserver"},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroidserver/build.py", "fdroidserver/common.py", "fdroidserver/exception.py", "fdroidserver/metadata.py", "fdroidserver/net.py", "fdroidserver/scanner.py", "fdroidserver/vmtools.py", "makebuildserver", "buildserver/*"),
		},
	),
	Cache: pipeline.Cache{
		Key:   "$CI_JOB_NAME",
		Paths: List(".gradle"),
	},
}
View Source
var FedoraLatest = pipeline.Job{
	Name:   "fedora_latest",
	Script: List("echo \"timeout=600\" >> /etc/dnf/dnf.conf", "echo \"retries=50\" >> /etc/dnf/dnf.conf", "echo \"keepcache=True\" >> /etc/dnf/dnf.conf", "dnf -y update || dnf -y update", "dnf -y install @development-tools diffutils findutils git gnupg java-17-openjdk-devel openssl python3 python3-babel python3-matplotlib python3-pip python3-pycountry rsync which", "$pip install sdkmanager", "./setup.py sdist", "useradd -m -c \"test account\" --password \"fakepassword\"  testuser", "su testuser --login --command \"cd `pwd`; $pip install --user dist/fdroidserver-*.tar.gz\"", "test -e ~testuser/.local/share/locale/de/LC_MESSAGES/fdroidserver.mo", "export BUILD_TOOLS_VERSION=`sed -n \"s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\\s*=\\s*['\\\"]\\(.*\\)[['\\\"],\\1,p\" fdroidserver/common.py`", "export ANDROID_HOME=`pwd`/android-sdk", "mkdir -p $ANDROID_HOME/licenses/", "printf \"\\n8933bad161af4178b1185d1a37fbf41ea5269c55\\nd56f5187479451eabf01fb78af6dfcb131a6481e\\n24333f8a63b6825ea9c5514f83c2829b004d1fee\" > $ANDROID_HOME/licenses/android-sdk-license", "printf \"\\n84831b9409646a918e30573bab4c9c91346d8abd\" > $ANDROID_HOME/licenses/android-sdk-preview-license", "printf \"\\n79120722343a6f314e0719f863036c702b0e6b2a\\n84831b9409646a918e30573bab4c9c91346d8abd\" > $ANDROID_HOME/licenses/android-sdk-preview-license-old", "mkdir ~/.android", "touch ~/.android/repositories.cfg", "sdkmanager \"platform-tools\" \"build-tools;$BUILD_TOOLS_VERSION\"", "chown -R testuser .", "cd tests", "su testuser --login --command \"cd `pwd`; export CI=$CI ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests\""),
	Image:  pipeline.Image{Name: "fedora:39"},
}
View Source
var HooksPreCommit = pipeline.Job{
	Name:   "hooks/pre-commit",
	Stage:  "lint",
	Script: List("apt-get update", "apt-get -y install --no-install-recommends bash ca-certificates dash gcc git make pycodestyle pyflakes3 python3-dev python3-git python3-nose python3-pip python3-yaml", "./hooks/pre-commit"),
	Image:  pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"LANG": "C.UTF-8",
	},
}
View Source
var Locales = pipeline.Job{
	Name:   "locales",
	Stage:  "lint",
	Script: List("apt-get update", "apt-get -y install --no-install-recommends gettext make python3-babel", "export EXITVALUE=0", "function set_error() { export EXITVALUE=1; printf \"\\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\\x1b[0m\\n\"; }", "make -C locale compile || set_error", "rm -f locale/*/*/*.mo", "pybabel compile --domain=fdroidserver --directory locale 2>&1 | { grep -F \"error:\" && exit 1; } || true", "exit $EXITVALUE"),
	Image:  pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"LANG": "C.UTF-8",
	},
}
View Source
var MacOS = pipeline.Job{
	Name:   "macOS",
	Script: List("export HOMEBREW_CURL_RETRIES=10", "brew update > /dev/null", "brew upgrade", "brew install fdroidserver", "brew install --cask android-commandlinetools temurin", "brew install bash coreutils gnu-sed", "export PATH=\"$(brew --prefix fdroidserver)/libexec/bin:$(brew --prefix coreutils)/libexec/gnubin:$PATH\"", "brew autoremove", "brew info fdroidserver", "export BUILD_TOOLS_VERSION=`gsed -n \"s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\\s*=\\s*['\\\"]\\(.*\\)[['\\\"],\\1,p\" fdroidserver/common.py`", "export ANDROID_HOME=\"$(brew --prefix)/share/android-commandlinetools\"", "mkdir -p \"$ANDROID_HOME/licenses\"", "echo -e \"\\n8933bad161af4178b1185d1a37fbf41ea5269c55\" > \"$ANDROID_HOME/licenses/android-sdk-license\"", "echo -e \"\\nd56f5187479451eabf01fb78af6dfcb131a6481e\" >> \"$ANDROID_HOME/licenses/android-sdk-license\"", "echo -e \"\\n24333f8a63b6825ea9c5514f83c2829b004d1fee\" >> \"$ANDROID_HOME/licenses/android-sdk-license\"", "$(brew --prefix)/bin/sdkmanager \"build-tools;$BUILD_TOOLS_VERSION\"", "echo \"macOS sticks with bash 3.x because of licenses, so avoid new bash syntax\"", "/bin/bash --version", "/bin/bash -n tests/run-tests", "fdroid=\"$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid\" ./tests/run-tests"),
	Rules: List(
		pipeline.Rule{
			If: "$CI_COMMIT_BRANCH == \"master\" && $CI_PROJECT_PATH == \"fdroid/fdroidserver\"",
		},
	),
	Tags: List("saas-macos-medium-m1"),
}
View Source
var MainPipeline = pipeline.Pipeline{
	Stages: List("lint", "test", "deploy"),
	Variables: Json{
		"pip":       "pip3 --timeout 100 --retries 10",
		"GIT_DEPTH": 1,
	},
}
View Source
var MetadataV0 = pipeline.Job{
	Name:   "metadata_v0",
	Script: List("git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID", "cd tests", "export GITCOMMIT=$(git rev-parse HEAD)", "git checkout $RELEASE_COMMIT_ID", "cd ..", "git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git", "rm -f fdroiddata/config.yml", "cd fdroiddata", "../tests/dump_internal_metadata_format.py", "cd ..", "git reset --hard", "git checkout $GITCOMMIT", "cd fdroiddata", "../tests/dump_internal_metadata_format.py", "sed -i -e '/ArchivePolicy:/d' -e '/FlattrID:/d' -e '/RequiresRoot:/d' metadata/dump_*/*.yaml", "diff -uw metadata/dump_*"),
	Image:  pipeline.Image{Name: "registry.gitlab.com/fdroid/fdroidserver:buildserver"},
	Variables: Json{
		"GIT_DEPTH":         1000,
		"RELEASE_COMMIT_ID": "d172d991803b27ad5213d11b5a737e5cb9e5fc3a",
	},
}
View Source
var PUBLISH = pipeline.Job{
	Name:   "PUBLISH",
	Script: List("apt-get update", "apt-get -qy upgrade", "apt-get -qy install --no-install-recommends -t bookworm-backports androguard apksigner curl default-jdk-headless git gpg gpg-agent python3-asn1crypto python3-defusedxml python3-git python3-ruamel.yaml python3-yaml rsync", "python3 -m unittest tests/test_gpgsign.py tests/test_metadata.py tests/test_publish.py tests/test_signatures.py tests/test_signindex.py", "cd tests", "mkdir archive", "mkdir unsigned", "cp urzip-release-unsigned.apk unsigned/info.guardianproject.urzip_100.apk", "grep '^key.*pass' config.yml | sed 's,\\x3a ,=,' > $CI_PROJECT_DIR/variables", "sed -Ei 's,^(key.*pass|keystore)\\x3a.*,\\1\\x3a {env\\x3a \\1},' config.yml", "printf '\\ngpghome\\x3a {env\\x3a gpghome}\\n' >> config.yml", "tee --append $CI_PROJECT_DIR/variables <<EOF\n    gpghome=$CI_PROJECT_DIR/tests/gnupghome\n    keystore=$CI_PROJECT_DIR/tests/keystore.jks\n    serverwebroot=/tmp\n    export gpghome keypass keystorepass keystore serverwebroot\nEOF\n", "source $CI_PROJECT_DIR/variables", "chmod 0600 config.yml config/*.yml config/*/*.yml", "chmod 0700 $gpghome", "export PATH=$CI_PROJECT_DIR:$PATH", "fdroid publish --verbose", "fdroid gpgsign --verbose", "rsync --progress repo/* $serverwebroot/", "fdroid gpgsign --verbose", "fdroid signindex --verbose", "rsync --stats repo/* $serverwebroot/"),
	Image:  pipeline.Image{Name: "debian:bookworm-backports"},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroid", "makebuildserver", "setup.py", "fdroidserver/*.py", "tests/*.py"),
		},
	),
}
View Source
var Pages = pipeline.Job{
	Name:   "pages",
	Stage:  "deploy",
	Script: List("cp docs/build/html public -r"),
	Image:  pipeline.Image{Name: "alpine:latest"},
	Rules: List(
		pipeline.Rule{
			If: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
		},
	),
	Needs: []any{BuildDocumentation},
	Artifacts: pipeline.Artifacts{
		Paths: List("public"),
	},
}
View Source
var PipAudit = pipeline.Job{
	Name:   "pip-audit",
	Stage:  "lint",
	Script: List("apt update -yyq", "apt upgrade -yyq", "apt install -yyq --no-install-recommends python3 python3-venv", "python3 -m venv env", ". env/bin/activate", "python3 -m ensurepip", "python3 -m pip install --upgrade pip", "python3 -m pip install pip-audit", "python3 -m pip_audit -f json | python3 -m json.tool --indent=2 || true", "python3 -m pip_audit"),
	Image:  pipeline.Image{Name: "debian:13-slim"},
}
View Source
var PluginFetchsrclibs = pipeline.Job{
	Name:         "plugin_fetchsrclibs",
	Script:       List("apt-get install curl git python3-cffi python3-matplotlib python3-nacl python3-paramiko python3-pil python3-pip python3-pycparser python3-venv", "python3 -m venv --system-site-packages env", ". env/bin/activate", "export PATH=\"$CI_PROJECT_DIR:$PATH\"", "export PYTHONPATH=\"$CI_PROJECT_DIR/examples\"", "export SETUPTOOLS_USE_DISTUTILS=stdlib", "$pip install -e .", "fdroid | grep fetchsrclibs", "mkdir fdroiddata", "commitid=b9e9a077d720c86ff6fff4dbb341254cc4370b1a", "curl https://gitlab.com/fdroid/fdroiddata/-/archive/${commitid}/fdroiddata-${commitid}.tar.gz | tar -xz --directory=fdroiddata --strip-components=1", "cd fdroiddata", "fdroid fetchsrclibs freemap.opentrail:4 --verbose", "test -d build/freemap.opentrail/.git", "test -d build/srclib/andromaps/.git", "test -d build/srclib/freemaplib/.git", "test -d build/srclib/freemaplibProj/.git", "test -d build/srclib/JCoord/.git", "test -d build/srclib/javaproj/.git"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"LANG":            "C.UTF-8",
		"DEBIAN_FRONTEND": "noninteractive",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "examples/fdroid_fetchsrclibs.py", "fdroidserver/__main__.py"),
		},
	),
}
View Source
var PodmanSystemService = pipeline.Job{
	Name:         "podman system service",
	Script:       List("apt-get install python3-asn1crypto python3-defusedxml python3-git python3-pillow python3-podman python3-ruamel.yaml python3-yaml", "python3 -m unittest tests/test_up.py --verbose"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:trixie-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroidserver/up.py", "tests/test_up.py"),
		},
	),
}
View Source
var Pylint = pipeline.Job{
	Name:         "pylint",
	Stage:        "lint",
	Script:       List("apt-get install pylint python3-pip", "$pip install --break-system-packages pylint-gitlab", "pylint --output-format=colorized,pylint_gitlab.GitlabCodeClimateReporter:pylint-report.json fdroid makebuildserver setup.py fdroidserver/*.py tests/*.py"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroid", "makebuildserver", "setup.py", "fdroidserver/*.py", "tests/*.py"),
		},
	),
}
View Source
var Safety = pipeline.Job{
	Name:         "safety",
	Script:       List("apt-get install fdroidserver python3-biplist python3-pip python3-pycountry", "$pip install --break-system-packages .", "$pip install --break-system-packages safety", "python3 -m safety --key \"$SAFETY_API_KEY\" --stage cicd scan"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"LANG": "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			If:      "$SAFETY_API_KEY",
			Changes: List(".gitlab-ci.yml", ".safety-policy.yml", "pyproject.toml", "setup.py"),
		},
	),
}
View Source
var Servergitmirrors = pipeline.Job{
	Name:         "servergitmirrors",
	Script:       List("apt-get install default-jdk-headless git openssh-client openssl python3-cffi python3-cryptography python3-matplotlib python3-nacl python3-pil python3-pip python3-pycparser python3-setuptools python3-venv rsync wget", "apt-get install apksigner", "python3 -m venv --system-site-packages env", ". env/bin/activate", "export PYTHONPATH=`pwd`", "export SETUPTOOLS_USE_DISTUTILS=stdlib", "$pip install -e .", "mkdir /root/.ssh/", "./tests/key-tricks.py", "ssh-keyscan gitlab.com >> /root/.ssh/known_hosts", "test -d /tmp/fdroid/repo || mkdir -p /tmp/fdroid/repo", "cp tests/config.yml tests/keystore.jks /tmp/fdroid/", "cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/", "cd /tmp/fdroid", "touch fdroid-icon.png", "printf \"\\nservergitmirrors\\x3a 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\\n\" >> config.yml", "$PYTHONPATH/fdroid update --verbose --create-metadata", "$PYTHONPATH/fdroid deploy --verbose", "export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^\"]+' repo/index-v1.json`", "echo $DLURL", "wget $DLURL/index-v1.jar", "diff repo/index-v1.jar index-v1.jar"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			If: "$CI_COMMIT_BRANCH == \"master\" && $CI_PROJECT_PATH == \"fdroid/fdroidserver\"",
		},
	),
}
View Source
var Shellcheck = pipeline.Job{
	Name:         "shellcheck",
	Stage:        "lint",
	Script:       List("apt-get install shellcheck", "shellcheck --exclude SC2046,SC2090 --severity=warning --color hooks/install-hooks.sh hooks/pre-commit tests/run-tests"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "hooks/install-hooks.sh", "hooks/pre-commit", "tests/run-tests"),
		},
	),
}
View Source
var TestDeployToS3WithRclone = pipeline.Job{
	Name:         "test_deploy_to_s3_with_rclone",
	Script:       List("python3 -m unittest -k test_update_remote_storage_with_rclone --verbose"),
	BeforeScript: List("apt-get update", "apt-get install -y androguard apksigner curl docker.io git python3-venv rclone", "docker info", "python3 -m venv --system-site-packages test-venv", ". test-venv/bin/activate", "pip install testcontainers[minio]", "pip install ."),
	Image:        pipeline.Image{Name: "debian:trixie-slim"},
	Services: List(
		pipeline.Service{Name: "docker:dind"},
	),
	Variables: Json{
		"DOCKER_HOST":        "tcp://docker:2375",
		"DOCKER_DRIVER":      "overlay2",
		"DOCKER_TLS_CERTDIR": "",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", "fdroidserver/deploy.py", "tests/test_deploy.py", "tests/test_integration.py"),
		},
	),
	Tags: List("saas-linux-small-amd64"),
}
View Source
var UbuntuJammyPip = pipeline.Job{
	Name:         "ubuntu_jammy_pip",
	Script:       List("apt-get install git default-jdk-headless python3-pip python3-venv rsync", "python3 -m venv sdist-env", ". sdist-env/bin/activate", "./setup.py sdist", "deactivate", "tar tzf dist/fdroidserver-*.tar.gz", "export ANDROID_HOME=/opt/android-sdk", "$pip install sdkmanager", "sdkmanager 'build-tools;35.0.0'", "$pip install biplist pycountry", "$pip install dist/fdroidserver-*.tar.gz", "tar xzf dist/fdroidserver-*.tar.gz", "cd fdroidserver-*", "export PATH=$PATH:$ANDROID_HOME/build-tools/35.0.0", "fdroid=`which fdroid` ./tests/run-tests", "LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind'"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "ubuntu:jammy"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
}
View Source
var UbuntuLtsPpa = pipeline.Job{
	Name:         "ubuntu_lts_ppa",
	Script:       List("export ANDROID_HOME=/usr/lib/android-sdk", "apt-get install gnupg", "while ! apt-key adv --keyserver keyserver.ubuntu.com --recv-key 9AAC253193B65D4DF1D0A13EEC4632C79C5E0151; do sleep 15; done", "export RELEASE=$(sed -n 's,^Suites\\x3a \\([a-z]*\\).*,\\1,p' /etc/apt/sources.list.d/*.sources | head -1)", "echo \"deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main\" >> /etc/apt/sources.list", "apt-get update", "apt-get dist-upgrade", "apt-get install --install-recommends dexdump fdroidserver git python3-biplist python3-pycountry python3-setuptools sdkmanager", "git config --global init.defaultBranch thisisnotmasterormain", "cd tests", "./run-tests"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "ubuntu:latest"},
	Variables: Json{
		"DEBIAN_FRONTEND": "noninteractive",
		"LANG":            "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			If: "$CI_COMMIT_BRANCH == \"master\" && $CI_PROJECT_PATH == \"fdroid/fdroidserver\"",
		},
	),
}
View Source
var Windows = pipeline.Job{
	Name:        "Windows",
	Script:      List("Import-Module \"$env:ChocolateyInstall\\helpers\\chocolateyProfile.psm1\"", "choco install --no-progress -y git --force --params \"/GitAndUnixToolsOnPath\"", "choco install --no-progress -y python3 --version=3.10", "choco install --no-progress -y jdk8", "choco install --no-progress -y rsync", "refreshenv", "python -m pip install --upgrade babel pip setuptools", "python -m pip install -e .", "$files = @(Get-ChildItem tests\\test_*.py)", "foreach ($f in $files) { write-output $f; python -m unittest $f; if( $LASTEXITCODE -eq 0 ) { write-output \"SUCCESS $f\"; } else { write-output \"ERROR $f failed\"; } }", "python -m unittest -k checkupdates exception import_subcommand test_lint test_metadata test_rewritemeta test_vcs tests.test_init tests.test_main"),
	AfterScript: List("Copy-Item C:\\ProgramData\\chocolatey\\logs\\chocolatey.log"),
	Rules: List(
		pipeline.Rule{
			If: "$CI_COMMIT_BRANCH == \"windows\"",
		},
	),
	Artifacts: pipeline.Artifacts{
		Paths: List("*.log"),
		When:  "always",
	},
	Tags: List("windows"),
}
View Source
var Yamllint = pipeline.Job{
	Name:         "yamllint",
	Stage:        "lint",
	Script:       List("apt-get install yamllint", "yamllint .gitlab-ci.yml .safety-policy.yml .yamllint */*.yaml */*.yml tests/*.yml tests/*/*.yml tests/*/*/.*.yml"),
	BeforeScript: List("echo Etc/UTC > /etc/timezone", "echo 'APT::Install-Recommends \"0\";' 'APT::Install-Suggests \"0\";' 'APT::Get::Assume-Yes \"true\";' 'Acquire::Retries \"20\";' 'Dpkg::Use-Pty \"0\";' 'quiet \"1\";' >> /etc/apt/apt.conf.d/99gitlab", "grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; }", "echo 'Acquire::https::Verify-Peer \"false\";' > /etc/apt/apt.conf.d/99nocacertificates", "apt-get update", "apt-get install ca-certificates", "rm /etc/apt/apt.conf.d/99nocacertificates", "apt-get dist-upgrade"),
	Image:        pipeline.Image{Name: "debian:bookworm-slim"},
	Variables: Json{
		"LANG": "C.UTF-8",
	},
	Rules: List(
		pipeline.Rule{
			Changes: List(".gitlab-ci.yml", ".safety-policy.yml", ".yamllint", "*/*.yaml", "*/*.yml", "tests/*.yml", "tests/*/*.yml", "tests/*/*/.*.yml"),
		},
	),
}

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL