CI/CD with GitHub Actions
Overview
The current setup is leveraging GitHub Actions and Kyma to create a CI/CD pipeline for building, releasing and deploying Docker image with XSK packaged with your application content.
Prerequisites
Create Service Account in Kyma for the CI/CD pipeline, as described bellow:
- Navigate to your Kyma cluster.
- Select your namespace (e.g.
default). - Go to
Configuration→Service Accounts. - Click the
Create Service Accountbutton. - Enter the service account name (e.g.
xsk).
Create Cluster Role in Kyma for the CI/CD pipeline, as described bellow:
- Navigate to your Kyma cluster.
- Go to
Configuration→Cluster Roles. - Click the
Create Cluster Rolebutton. - Enter the cluster role name (e.g.
xsk). - Add the following
API Groups:- (core)
- apps
- servicecatalog.k8s.io
- networking.istio.io
- servicecatalog.kyma-project.io
- gateway.kyma-project.io
- Select
*in theResourcesdropdown, to match all resources. - Select
*in theVerbsdropdown, to match all verbs. - Click the
Createbutton.
Create Cluster Role Binding of the Cluster Role to the Service Account:
- Navigate to your Kyma cluster.
- Go to
Cluster Role Bindings→Cluster Roles. - Enter the cluster role binding name (e.g.
xsk-default, note that the name is not namespace specific and should be unique for the whole cluster). - Select the
Cluster Role(e.g.xsk). - Switch the
KindtoServiceAccount. - Select the desired namespace (e.g.
default). - Select the service account (e.g.
xsk).
Copy the Service Account token as later will be needed for the KYMA_TOKEN secret:
- Navigate to your Kyma cluster.
- Go to
Configuration→Service Accounts. - Select the
Service Account(e.g.xsk). - Select the secret for more details (e.g.
xsk-token-wf6jk). - Click the
Decodebutton to decode the secret. - Copy the
tokenvalue (e.g.eyJhbGciOiJS...).
Copy the Service Account certificate as later will be needed for the KYMA_CERTIFICATE secret:
- Navigate to your Kyma cluster.
- Go to
Configuration→Service Accounts. - Select the
Service Account(e.g.xsk). - Select the secret for more details (e.g.
xsk-token-wf6jk). - Click the
Expand Allbutton to see all content. - Copy the
ca.crtvalue (e.g.LS0tLS1CRUdJ...).
Setup
- Navigate to your GitHub repository.
- Create
.github/workflows/<pipeline-name>.yamlfile with the following content:
Info
The following GitHub Action builds XSK based Docker image for your application and push it to your Docker registry.
Note: Replace the <your-organization>/<your-repository> placeholder with a default organization and repository where the Docker image will be pushed (can be changed when triggering the GitHub Action).
Application Repositorymust be in lower case.- If you set this environment
publishPackageInRepositorytotruewill addLABELto your image and will publish your new image in your Github repository packages and if isfalsewill publish to your Github organization.
name: Build Application Image
on:
workflow_dispatch:
inputs:
xskRepository:
description: XSK Repository
required: true
type: choice
options:
- 'dirigiblelabs/xsk-kyma'
- 'dirigiblelabs/xsk-kyma-runtime-distro'
- 'dirigiblelabs/xsk-cf'
- 'dirigiblelabs/xsk'
xskVersion:
description: XSK Version
required: true
default: 'latest'
applicationRepository:
description: Application Repository
required: true
default: '<your-organization>/<your-repository>'
applicationReleaseVersion:
description: Application Release Version
required: true
jobs:
build:
runs-on: ubuntu-latest
env:
publishPackageInRepository: false
steps:
- name: Release Input Parameters
run: |
echo "Release Type: ${{ github.event.inputs.releaseType }}"
echo "Application Repository: ${{ github.event.inputs.applicationRepository }}"
echo "Application Release Version: ${{ github.event.inputs.applicationReleaseVersion }}"
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Build Dockerfile
run: |
$publishPackageInRepository == 'true' &&
LABEL='LABEL org.opencontainers.image.source https://github.com/${{ github.event.inputs.applicationRepository }}' ||
LABEL=''
PUBLIC='/usr/local/tomcat/target/dirigible/repository/root/registry/public'
DOCKERFILE_CONTENT=$(cat << EOF
FROM scratch as build
COPY . "$PUBLIC/"
FROM ${{ github.event.inputs.xskRepository }}:${{ github.event.inputs.xskVersion }}
COPY --from=build --chown=nonroot:nonroot "$PUBLIC/" "$PUBLIC/"
$LABEL
EOF
)
echo "$DOCKERFILE_CONTENT" >> Dockerfile
echo "$DOCKERFILE_CONTENT"
- name: Docker Login
run: docker login ${{secrets.DOCKER_REGISTRY}} -u ${{secrets.DOCKER_USERNAME}} -p ${{secrets.DOCKER_PASSWORD}}
- name: Build Application Image
run: |
docker build . -t ${{secrets.DOCKER_REGISTRY}}/${{ github.event.inputs.applicationRepository }}:${{ github.event.inputs.applicationReleaseVersion }}
docker tag ${{secrets.DOCKER_REGISTRY}}/${{ github.event.inputs.applicationRepository }}:${{ github.event.inputs.applicationReleaseVersion }} ${{secrets.DOCKER_REGISTRY}}/${{ github.event.inputs.applicationRepository }}:latest
docker push ${{secrets.DOCKER_REGISTRY}}/${{ github.event.inputs.applicationRepository }}:${{ github.event.inputs.applicationReleaseVersion }}
docker push ${{secrets.DOCKER_REGISTRY}}/${{ github.event.inputs.applicationRepository }}:latest
Info
The following GitHub Action deploys your XSK based Docker image to your Kyma cluster via Helm.
Note: Replace the <your-organization>/<your-repository> placeholder with a default organization and repository where the Docker image will be pushed (can be changed when triggering the GitHub Action).
name: Deploy Application Image
on:
workflow_dispatch:
inputs:
applicationRepository:
description: Application Repository
required: true
default: '<your-organization>/<your-repository>'
applicationReleaseVersion:
description: Application Release Version
required: true
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Setup Kube Config File
env:
KYMA_CERTIFICATE: ${{ secrets.KYMA_CERTIFICATE }}
KYMA_SERVER: ${{ secrets.KYMA_SERVER }}
KYMA_TOKEN: ${{ secrets.KYMA_TOKEN }}
run: |
mkdir $HOME/.kube
echo "
apiVersion: v1
kind: Config
current-context: xsk
clusters:
- name: xsk
cluster:
certificate-authority-data: $KYMA_CERTIFICATE
server: $KYMA_SERVER
contexts:
- name: xsk
context:
cluster: xsk
user: xsk
users:
- name: xsk
user:
token: $KYMA_TOKEN" > $HOME/.kube/config
- name: Export Kyma Host
run: |
export KYMA_API_SERVER=${{ secrets.KYMA_SERVER }}
echo "KYMA_HOST=${KYMA_API_SERVER:12}" >> $GITHUB_ENV
- name: Helm Upgrade Application Instance
run: |
chmod go-r $HOME/.kube/config
helm repo add xsk https://www.xsk.io
helm repo update
helm upgrade --install xsk xsk/xsk \
--set kyma.enabled=true \
--set kyma.host=$KYMA_HOST \
--set hana.enabled=true \
--set hana.url='jdbc:sap://${{ secrets.HANA_URL }}/?encrypt=true&validateCertificate=false`' \
--set hana.username=${{ secrets.HANA_USERNAME }} \
--set hana.password='${{ secrets.HANA_PASSWORD }}' \
--set persistentVolumeClaim.enabled=false \
--set deployment.strategyType=RollingUpdate \
--set application.privateDockerRegistry=true \
--set application.dockerServer=${{secrets.DOCKER_REGISTRY}} \
--set application.dockerUsername=${{secrets.DOCKER_USERNAME}} \
--set application.dockerPassword=${{secrets.DOCKER_PASSWORD}} \
--set application.dockerEmail=${{secrets.DOCKER_EMAIL}} \
--set application.image=${{secrets.DOCKER_REGISTRY}}/${{ github.event.inputs.applicationRepository }}:${{ github.event.inputs.applicationReleaseVersion }}
GitHub Secrets
The following GitHub Secrets are required in order to successfully run the previously created GitHub Actions. To create GitHub secret:
- Navigate to your GitHub repository.
- Open the
Settingstab. - Go to
Secrets→Actions. - Click the
New Repository Secretbutton.
| Name | Description | Required for |
|---|---|---|
DOCKER_REGISTRY |
The Docker Registry (e.g. docker.io, ghcr.io, etc.) |
Build |
DOCKER_USERNAME |
The Docker Username (<your-docker-username>) |
Build |
DOCKER_PASSWORD |
The Docker Password (<your-docker-password>) |
Build |
DOCKER_EMAIL |
The Docker Email (<your-docker-email>) |
Deploy |
HANA_URL |
The HANA Cloud URL (e.g. 7512c2q1-...:443) |
Deploy |
HANA_USERNAME |
The HANA Cloud Username (<your-hana-cloud-username>) |
Deploy |
HANA_PASSWORD |
The HANA Cloud Password (<your-hana-cloud-password>) |
Deploy |
KYMA_CERTIFICATE |
The Kyma Certificate (e.g. LS0tLS1CRUdJTiBDRVJUS...) |
Deploy |
KYMA_SERVER |
The Kyma Server (e.g. https://api.c-a7b1c6...ondemand.com) |
Deploy |
KYMA_TOKEN |
The Kyma Token (e.g. eyJhbGciOiJSUzI1NiIsImtpZCI6In...) |
Deploy |