Author: Saravanan is Polyglot Programmer, Technology blogger, DevOps Evangelist and Cloud DevOps Architect. He is interested to talk about Go, NodeJS, C++, Ruby, Bash, Python and PowerShell
Table of Contents
- Introduction
- My Workflow
- Submission Category
- Yaml File and Link to Code
- GitHub Action Workflow Run Output
- Additional Info
- How to Add GitHub Actions workflow
- How to Integrate Slack with GitHub Actions Workflow
- Go Source Code Details
- Go REST API Unit testing
Introduction
- I've created a GitHub action that performs the Go continuous integration process on the Go source code repository
- Interested Go developers and DevOps Engineers can use this workflow to create the Continuous Integration for their GitHub repo
- Created this workflow for the submission of actionshackathon21
Workflow Details
Go Continuous Integration workflow
- The workflow we created will be doing the Continuous Integration process on this repository.
- Whenever there is a code check-in happens on main branch, then CI workflow will be triggered
-
Below are the details of this workflow
- Code checkout into the workspace
- Install Go and runs the Go linting process for doing code review
- Get the build dependencies
- Builds the code
- Runs the Unit test, if it is success it moves to next stage
- Docker image is created for the code and pushed into docker hub registry
- Finally workflow posts the status of each step to a slack channel
Here is the link to the GitHub actions workflow Yaml
Marketplace GitHub Actions used in this Workflow
I've leveraged existing actions available from GitHub Actions Marketplace
- actions/checkout@v2 - Action that is used to checkout code.
- *reviewdog/action-golangci-lint@v2 *- Go installation and linting action.
- mr-smithers-excellent/docker-build-push@v5 - Docker build and push action.
- *act10ns/slack@v1 *- Slack GitHub Action Integration action
Submission Category
DIY Deployments
Yaml File and Link to Code
- GitHub Actions Workflow Yaml
name: Go_CI_Workflow
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Check out code to Build
uses: actions/checkout@v2
- name: Install Go and Run Code Linting
id: Install-Go
uses: reviewdog/action-golangci-lint@v2
- name: Get dependencies to Build
id: Get-dependencies-to-Build
run: |
go get -v -t -d ./...
if [ -f Gopkg.toml ]; then
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
dep ensure
fi
- name: Build Code
id: Build-Code
run: |
go build -v .
- name: Unit Test
id: Unit-Test-Run
run: |
go test
- name: Build & push Docker image
id: Build-and-Push-Docker-Image
uses: mr-smithers-excellent/docker-build-push@v5
with:
image: gsdockit/goapiauth
tags: latest
registry: docker.io
dockerfile: Dockerfile
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Posting Action Workflow updates to Slack
uses: act10ns/slack@v1
with:
status: ${{ job.status }}
steps: ${{ toJson(steps) }}
channel: '#github-updates'
if: always()
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- The full source code can be accessible in this GitHub repo
GitHub Action Workflow Run Output
- Here is how it runs the workflow and it can be viewable from the Actions tab
Additional Info
Developer - Saravanan G (chefgs)
*Other details that might be helpful to users starting to write GitHub Actions
*
How to Add GitHub Actions workflow
- Our workflow gets created in .github/workflows as an .yaml file
Method 1:
- Step 1: We can find *Actions * tab on the repo
- Step 2: Click on the tab and choose New Workflow
- Step 3: Choose workflow from the pre-defined template
- Step 4: Edit the workflow yaml according to the required stages
or
Method 2:
- Create workflow for yourself from scratch using the documentation guide
Enjoy creating the GitHub Workflow
How to Integrate Slack with GitHub Actions Workflow
Here is the list of steps to integrate slack with github actions,
- Add **github **app to the slack channel
- Add incoming webhook app and pick webhook url and keep it
- Run the below command in slack channel to **subscribe **to repo updates. (while adding, it asks for auth with github and we choose repo)
/github subscribe user/repo
- Add incoming webhook URL as *secret * in the specific repo we want to get updates
- Add the below code at the end of Action workflow to get the job updates in slack
- name: Posting Action Workflow updates to Slack
uses: act10ns/slack@v1
with:
status: ${{ job.status }}
steps: ${{ toJson(steps) }}
channel: '#github-actions-updates'
if: always()
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- Each steps in workflow should have id: step-name to get the status of the step in Slack update
*Now let's see the details about the code and it's functionality...
*
Go Source Code Details
Code Objective
- We will be creating a REST API that listens on **localhost **port **1357 **and has the API versioning with a query string parameter.
- Sample URL format we are planning to create, http://localhost:1357/api/v1/PersonId/Id456
Function main
Add the below code function main()
Adding API Versioning and Basic authentication
// Define gin router
router := gin.Default()
// Create Sub Router for customized API version and basic auth
subRouterAuthenticated := router.Group("/api/v1/PersonId", gin.BasicAuth(gin.Accounts{
"basic_auth_user": "userpass",
}))
Passing Query String Parameters
subRouterAuthenticated.GET("/:IdValue", GetMethod)
REST API Listening on Port
listenPort := "1357"
// Listen and Server on the LocalHost:Port
router.Run(":"+listenPort)
Get Method
- Define a **GetMethod **function and add the following code
- It fetches and prints the Person IdValue from the query string parameter passed in the API URL
func GetMethod(c *gin.Context) {
fmt.Println("\n'GetMethod' called")
IdValue := c.Params.ByName("IdValue")
message := "GetMethod Called With Param: " + IdValue
c.JSON(http.StatusOK, message)
// Print the Request Payload in console
ReqPayload := make([]byte, 1024)
ReqPayload, err := c.GetRawData()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Request Payload Data: ", string(ReqPayload))
}
Go REST API Unit testing
- Go testing module can be used for creating unit testing code for Go source
- Go testing module code has been found in api_authtest.go
- Run the command go test to run the tests
Join us
Register for Kubernetes Community Days Chennai 2022 at kcdchennai.in