External Repos

You may want to include code from one or more external repositories that are outside of your current working directory project. This is supported through the external_github_repo field in the configuration file. After launch, the repositories will be pulled into the evaluation's tmp folder and placed on the SYS PATH so that modules can be easily utilized.

Multiple Repositories

The external_github_repo field can be either a string for a single repo, or a JSON array of repositories. For example:

"sysconfig": {
    "external_github_repo": "hkakitani/SincNet",
"sysconfig": {
    "external_github_repo": ["hkakitani/SincNet", "twosixlabs/armory-example"],

Specifying Branches

The external_github_repo field in the configuration file supports specifying specific branches to be pulled. Simply suffix the repository name with @branch. By default if no branch is specified then master branch will be pulled. For example:

"sysconfig": {
    "external_github_repo": "hkakitani/SincNet",
"sysconfig": {
    "external_github_repo": "twosixlabs/armory-example@specific-branch",

Accessing External Modules

As mentioned, when repositories are cloned into a scenario's temporary directory, the cloned repository will automatically be added to the sys path, as well as the parent directory of all cloned repositories. This enables the user to specify attacks, defense, scenarios from the external repo, directly in the evaluation config file. For example the following config snippet:

    "model": {
        "model_kwargs": {},
        "module": "example_models.keras.librispeech_spectrogram",
        "name": "get_art_model",
        "weights_file": "cnnspectrogram_librispeech_v1.h5",
        "wrapper_kwargs": {}
    "sysconfig": {
        "external_github_repo": "twosixlabs/armory-example@master",

Would load the keras model found within that armory-example external repository.

Custom Python Paths

While the above works for standard python module and script usage, there may be cases where a user needs to add a different directory to the python path to enable correct absolute imports within their repository. To do this, you will need to modify the model module, before any module-specific imports, in the following manner:

import os
import sys
module_path = globals()["__file__"]
relative_path_to_root_from_module = ".."  # this will depend on your use case
absolute_root_path = os.path.abspath(os.path.join(module_path, relative_path_to_root))
sys.path.insert(0, absolute_root_path)

Private Repos

The external repositories supports public and private GitHub repositories. If you would like to pull in a private repository, you'll need to set a user token as an environment variable before running armory run.

export ARMORY_GITHUB_TOKEN="5555e8b..."
armory run <path/to/config.json>

Information on creating tokens can be found here: https://github.com/settings/tokens