DEV Community

Hao Yang
Hao Yang

Posted on

CI/CD for Kotlin and CloudFunctions

My Workflow

This is a workflow that covers Kotlin Building, Test Coverage Badge Generation and Cloud Functions Deployment.

At the begging of the year I wanted to create a project to try out serverless computation and cloud-native, using Kotlin with the Cloud Functions form GCP seems like a good start point to me, so I created a small crawler to crawl some apartment buying registration information and send out an email notification. (In my city the building companies publish buying registration information once they decide to start selling, and you need to register first if you want to buy one).

So my next problem was to create a CI/CD pipeline, which I decided to try out Github Actions, and I was happy to found out there are already some great actions that could help me to generate a fancy test coverage badge and deploy my code to Cloud Functions easily. By leveraging cicirello/jacoco-badge-generator@v2 and google-github-actions/deploy-cloud-functions@v0.1.2, my pipeline was built quickly.

And the final result looks like this:

Submission Category:

Wacky Wildcards

Yaml File or Link to Code

name: CI/CD on: push: branches: [ master ] paths: - src/** # Allows you to run this workflow manually from the Actions tab workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 8 uses: actions/setup-java@v2 with: java-version: '8' distribution: 'adopt' - name: Build with Gradle run: ./gradlew build - name: Generate JaCoCo Badge uses: cicirello/jacoco-badge-generator@v2 with: jacoco-csv-file: build/reports/jacoco/test/jacocoTestReport.csv generate-branches-badge: true - name: Log coverage percentage run: | echo "coverage = ${{ steps.jacoco.outputs.coverage }}" echo "branch coverage = ${{ steps.jacoco.outputs.branches }}" - name: Commit and push the badge (if it changed) uses: EndBug/add-and-commit@v7 with: default_author: github_actions message: 'doc: update badge' add: '*.svg' - name: Upload JaCoCo coverage report uses: actions/upload-artifact@v2 with: name: jacoco-report path: build/reports/jacoco/test/html deploy: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Cloud Functions Deploy uses: google-github-actions/deploy-cloud-functions@v0.1.2 with: credentials: ${{ secrets.GCP_SA_KEY }} name: apartment-registration-alert region: asia-northeast1 env_vars: AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }},AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} entry_point: Application runtime: java11 service_account_email: ${{ secrets.SERVICE_ACCOUNT_EMAIL }} max_instances: 1 event_trigger_type: google.pubsub.topic.publish event_trigger_resource: projects/apartment-registration-alert/topics/schedule-trigger 
Enter fullscreen mode Exit fullscreen mode

GitHub logo hyrepo / apartment-registration-notification

A serverless, cloud-native crawler that uses AWS and GCP free tier to crawl apartment purchasing information and sending email notifications.

License Continuous Delivery Coverage Branches

This application crawls apartments information hourly, if there are new apartments in particular areas open for purchase, then an email notification will be triggered.

The logic is pretty simple, but the main purpose of this application is to try out:

  • Running an application in the cloud for totally free
  • Serverless computation
  • Cloud-native

Architecture

Architecture

Cost

All cloud components are covered in the free tier as bellow, this application cost $0.

Component Type Free Tier Platform
Cloud Functions Serverless Platform(FaaS) 200M calls / month GCP
Cloud Scheduler Scheduler 3 jobs / month GCP
Cloud Pub/Sub Message Service 10GB / month GCP
Cloud Firestore NoSQL DB 1GB storage, 50000 reads & 20000 writes / day GCP
SNS Notification Service 1000 Email AWS



Top comments (0)