Packaging source code

Creating a Source Package

Before you create a package, you need to create an environment with an associated builder image:

$ fission env create --name pythonsrc --image ghcr.io/fission/python-env \ --builder ghcr.io/fission/python-builder \ --mincpu 40 --maxcpu 80 \ --minmemory 64 --maxmemory 128 \ --poolsize 2 environment 'pythonsrc' created

Let’s take a simple python function which has a dependency on the pyyaml module. We can specify the dependencies in requirements.txt and a simple command to build from source. The tree structure of directory and contents of the file would look like:

sourcepkg/ ├── __init__.py ├── build.sh ├── requirements.txt └── user.py

And the file contents:

  • user.py
import sys import yaml document = """ a: 1 b: c: 3 d: 4 """ def main(): return yaml.dump(yaml.load(document))
  • requirements.txt
pyyaml
  • build.sh
#!/bin/sh pip3 install -r ${SRC_PKG}/requirements.txt -t ${SRC_PKG} && cp -r ${SRC_PKG} ${DEPLOY_PKG}

Make sure the build.sh file is executable:

$ chmod +x build.sh

Now create an archive before creating the package:

$zip -jr demo-src-pkg.zip sourcepkg/ adding: __init__.py (stored 0%) adding: build.sh (deflated 24%) adding: requirements.txt (stored 0%) adding: user.py (deflated 25%)

Using the source archive created in previous step, you can create a package in Fission:

$ fission package create --sourcearchive demo-src-pkg.zip --env pythonsrc --buildcmd "./build.sh" Package 'demo-src-pkg-zip-8lwt' created

Since we are working with a source package, we provided the build command. Once you create the package, the build process will start and you can see the build logs with the fission package info command:

$ fission pkg info --name demo-src-pkg-zip-8lwt Name: demo-src-pkg-zip-8lwt Environment: pythonsrc Status: succeeded Build Logs: Collecting pyyaml (from -r /packages/demo-src-pkg-zip-8lwt-v57qil/requirements.txt (line 1)) Using cached PyYAML-3.12.tar.gz Installing collected packages: pyyaml Running setup.py install for pyyaml: started Running setup.py install for pyyaml: finished with status 'done' Successfully installed pyyaml-3.12

Using the package above you can create the function. Since package already is associated with a source package, environment and build command, these will be ignored when creating a function.

The only additional thing you’ll need to provide is the Function’s entrypoint:

$ fission fn create --name srcpy --pkg demo-src-pkg-zip-8lwt --entrypoint "user.main" function 'srcpy' created # Run the function: $ fission fn test --name srcpy a: 1 b: {c: 3, d: 4}

Creating a Deployment Package

Before you create a package you need to create an environment with the builder image:

$ fission env create --name pythondeploy --image ghcr.io/fission/python-env \ --builder ghcr.io/fission/python-builder \ --mincpu 40 --maxcpu 80 \ --minmemory 64 --maxmemory 128 \ --poolsize 2 environment 'pythondeploy' created

We will use a simple Python example which outputs “Hello World!” in a directory to create a deployment archive:

$ cat testDir/hello.py def main(): return "Hello, world!" $ zip -jr demo-deploy-pkg.zip testDir/

Using the archive and environments created previously, you can create a package:

$ fission package create --deployarchive demo-deploy-pkg.zip --env pythondeploy Package 'demo-deploy-pkg-zip-whzl' created

Since it is a deployment archive, there is no need to build it, so the build logs for the package will be empty:

$ fission package info --name demo-deploy-pkg-zip-whzl Name: demo-deploy-pkg-zip-xlaw Environment: pythondeploy2 Status: succeeded Build Logs:

Finally you can create a function with the package and test the function:

$ fission fn create --name deploypy --pkg demo-deploy-pkg-zip-whzl --entrypoint "hello.main" $ fission fn test --name deploypy Hello, world!

While these examples illustrate how to use packages, you don’t have to use them every time you need to build your source code. A better way is to use Specifications.