3 min read | by Jordi Prats
In a Workflow we'll need to be able to share data between the different steps. To do so we can use the artifacts
section in the WorkflowTemplate. This allows us to pass data between steps in a Workflow.
To show how to do this, we are going to use one step to clone a git repository with a private key, and then pass the cloned repository to a second step that will build and push the container image to a registry.
First we'll have to create the secret containing the SSH key that we are going to use to authenticate:
kubectl create secret generic github-creds --from-file=sshkey=$HOME/.ssh/id_rsa --from-file=known_hosts=$HOME/.ssh/known_hosts
We are going to use this secret to be able to clone the repository. Once cloned, we are going to use the generated artifact to build and push the container image.
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: build-and-push-image-multistep
spec:
entrypoint: main
volumes:
- name: kaniko-secret
secret:
secretName: dockerhub-registry
items:
- key: .dockerconfigjson
path: config.json
- name: github-ssh-keys
secret:
secretName: github-creds
items:
- key: sshkey
path: id_rsa
- key: known_hosts
path: known_hosts
arguments:
parameters:
- name: git-repo-url
- name: branch
value: main
- name: dockerfile
value: Dockerfile
- name: image-destination
templates:
- name: main
steps:
- - name: clone-repo
template: clone-step
- - name: kaniko-build
template: kaniko-build
arguments:
artifacts:
- name: repo
from: "{{steps.clone-repo.outputs.artifacts.repo}}"
- name: clone-step
inputs:
parameters:
- name: git-repo-url
value: "{{workflow.parameters.git-repo-url}}"
- name: branch
value: "{{workflow.parameters.branch}}"
outputs:
artifacts:
- name: repo
path: /workspace/repo
container:
image: alpine/git
command: [sh, -c]
args:
- |
set -x
mkdir -p ~/.ssh && \
cp /mnt/ssh/id_rsa ~/.ssh/id_rsa && \
cp /mnt/ssh/known_hosts ~/.ssh/known_hosts && \
chmod 600 ~/.ssh/id_rsa && \
git clone --branch {{inputs.parameters.branch}} {{inputs.parameters.git-repo-url}} /workspace/repo
volumeMounts:
- name: github-ssh-keys
mountPath: /mnt/ssh
- name: kaniko-build
inputs:
parameters:
- name: image-destination
value: "{{workflow.parameters.image-destination}}"
- name: dockerfile
value: "{{workflow.parameters.dockerfile}}"
artifacts:
- name: repo
path: /workspace/repo
container:
image: gcr.io/kaniko-project/executor:latest
args:
- --dockerfile={{inputs.parameters.dockerfile}}
- --context=/workspace/repo
- --destination={{inputs.parameters.image-destination}}
volumeMounts:
- name: kaniko-secret
mountPath: "/kaniko/.docker"
We can now create a Workflow that uses this template as follows:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: multistep-build-and-push-image-
spec:
workflowTemplateRef:
name: build-and-push-image-multistep
arguments:
parameters:
- name: git-repo-url
value: "git@github.com:jordiprats/flask-pet2cattle.git"
- name: branch
value: "master"
- name: image-destination
value: "jordiprats/ampa:kaniko"
And apply it as usual:
$ kubectl apply -f kaniko-template-multistep.yaml
workflowtemplate.argoproj.io/build-and-push-image-multistep created
$ kubectl create -f kaniko-template-multistep-instance.yaml ; kubectl get workflow -w
workflow.argoproj.io/multistep-build-and-push-image-rx9xd created
NAME STATUS AGE MESSAGE
multistep-build-and-push-image-rx9xd Running 1s
multistep-build-and-push-image-rx9xd Running 11s
multistep-build-and-push-image-rx9xd Running 20s
multistep-build-and-push-image-rx9xd Succeeded 56s
If we use the UI, we'll be able to see how the artifact is passed along (and even download it):
Posted on 29/10/2024