# Skaffold CI/CD
## Skaffold
### Why Skaffold
- To collect and specify how artifacts(docker images) are built and deployed, in a **single**, **uniformed** and **descriptive** file (skaffold.yaml.)
- To build/deploy openfaas function images with docker build/kubectl instead of faas-cli build/deploy.
### Install
Download and install the latest stable version of skaffold:
```console
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-darwin-amd64 && chmod +x skaffold && sudo mv
skaffold /usr/local/bin
```
### Configuration
To develop with skaffold, we need to configure skaffold well to suit our needs, including:
- Docker login:
```console
docker login --username developer --password pentium cr-dev.pentium.network
```
- Default-repo setting:
```console
skaffold config set default-repo cr-dev.pentium.network
```
### Basic Skaffold.yaml
```yaml
apiVersion: skaffold/v1beta11
kind: Config
build:
artifacts:
- image: gateone # image name, excluding the 'host' of the url, cauz we will prepend with 'default-repo.'
context: gateone # path to the directory where we start to add our resources.
docker: # any docker config goes here
dockerfile: dockerfile # path to the Dockerfile, starting from the previous 'context'
noCache: false # used to pass in --no-cache to docker build to prevent caching.
deploy:
kustomize:
path: github.com/pnetwork/pnbase//default/pentium.gateone/?ref=s/225/mike_gateone # path to the kustomization.yaml that we use to deploy the artifacts
```
For more configurable options please refer to the [skaffold.yaml](https://skaffold.dev/docs/references/yaml/) documentaiton.
## Makefile
### Make pre-build
- To define a stage where to **collect** and **generate resources** so skaffold can build the image.
- For repos that don't need any 'pre-process' before `docker build`, this step is not necessary.
### Examplary Makefile
- Platform openfaas function:
```cmake
.PHONY: pre-build
pre-build:
cd v2/api && npm install && npm run faas-build
# install modules and run 'faas-build' script defined in package.json
```
- Core openfaas function:
```cmake
.PHONY: pre-build
pre-build:
mkdir -p template && \
ofsm template -l python3-flask template && \
faas-cli build --name=domainmanagement --lang=python3-flask --image=domainmanagement --handler=. --shrinkwrap
# pull faas template and generate assets required to build the image
```
## Development Pipelines
### Generate Prerequisites
```console
make pre-build
```
### Build Assets
```console
skaffold build -q > build.out # build artifacts and store the outputs to build.out
```
### Deploy Built Assets
```console
skaffold deploy -a build.out # deploy built artifacts (with underlying kustomize and kubectl)
```
### Delete Assets
```console
skaffold delete # delete the deployed artifacts
```
## Reference
https://skaffold.dev/