ci.yml 4.67 KB
name: continuous-integration

on:
  push:
    branches:
    - master
    - v[1-9].*
    tags:
    - v[1-9].*
  pull_request:
    branches:
    - master
    - v[1-9].*

env:
  BUILDTIME_BASE: "golang:1.16.5-alpine3.14"
  RUNTIME_BASE: "alpine:3.14"
  GO_VERSION: "~1.16.5"

jobs:
  # Runs Golangci-lint on the source code
  ci-go-lint:
    name: ci-go-lint
    runs-on: ubuntu-latest
    steps:
    - name: Set up Go 1.x
      uses: actions/setup-go@v2
      with:
        go-version: ${{ env.GO_VERSION }}
      id: go

    - name: Check out code into the Go module directory
      uses: actions/checkout@v2

    - name: Lint kube-router code
      run: |
        make lint

  # Executes Unit Tests
  ci-unit-tests:
    name: ci-unit-tests
    runs-on: ubuntu-latest
    steps:
    - name: Set up Go 1.x
      uses: actions/setup-go@v2
      with:
        go-version: ${{ env.GO_VERSION }}
      id: go

    - name: Check out code into the Go module directory
      uses: actions/checkout@v2

    - name: Run unit tests for kube-router
      run: |
        make test
      env:
        DOCKER_BUILD_IMAGE: ${{ env.BUILDTIME_BASE }}

  # Builds Kube-Router binary
  ci-build-kube-router:
    name: ci-build-kube-router
    runs-on: ubuntu-latest
    steps:
    - name: Set up Go 1.x
      uses: actions/setup-go@v2
      with:
        go-version: ${{ env.GO_VERSION }}
      id: go

    - name: Check out code into the Go module directory
      uses: actions/checkout@v2

    - name: Build kube-router
      run: |
        make kube-router

  # Builds Container on Push Event, not run if there's a Tag Event
  ci-build-container:
    runs-on: ubuntu-latest
    if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }}
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up QEMU
      uses: docker/setup-qemu-action@v1

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Extract branch from github ref - New Push
      if: ${{ startsWith(github.ref, 'refs/tags/v') != true && github.event_name != 'pull_request' }}
      shell: bash
      run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
      id: extract_branch

    - name: Extract tag from github ref - New Release
      if: ${{ startsWith(github.ref, 'refs/tags/v') }}
      shell: bash
      run: echo "##[set-output name=tag;]$(echo ${GITHUB_REF#refs/tags/})"
      id: extract_tag

    - name: Build and push - New Push
      uses: docker/build-push-action@v2
      if: ${{ startsWith(github.ref, 'refs/tags/v') != true && github.event_name != 'pull_request' }}
      with:
        context: .
        platforms: |
          linux/amd64
          linux/arm64
          linux/arm/v7
        push: true
        build-args: |
          BUILDTIME_BASE=${{ env.BUILDTIME_BASE }}
          RUNTIME_BASE=${{ env.RUNTIME_BASE }}
        tags: cloudnativelabs/kube-router-git:${{ steps.extract_branch.outputs.branch }}

    - name: Build and push - New PR
      uses: docker/build-push-action@v2
      if: github.event_name == 'pull_request'
      with:
        context: .
        # Don't build multi arch images for PR as they take more than 30 min to build
        platforms: linux/amd64
        push: true
        build-args: |
          BUILDTIME_BASE=${{ env.BUILDTIME_BASE }}
          RUNTIME_BASE=${{ env.RUNTIME_BASE }}
        tags: cloudnativelabs/kube-router-git:PR-${{ github.event.pull_request.number }}

    - name: Build and push - New Tag
      uses: docker/build-push-action@v2
      if: ${{ startsWith(github.ref, 'refs/tags/v') }}
      with:
        context: .
        platforms: |
          linux/amd64
          linux/arm64
          linux/arm/v7
        push: true
        build-args: |
          BUILDTIME_BASE=${{ env.BUILDTIME_BASE }}
          RUNTIME_BASE=${{ env.RUNTIME_BASE }}
        tags: |
          cloudnativelabs/kube-router:${{ steps.extract_tag.outputs.tag }}
          cloudnativelabs/kube-router:latest

  # Runs Go Releaser on Tag Event
  ci-goreleaser-tag:
    runs-on: ubuntu-latest
    if: ${{ startsWith(github.ref, 'refs/tags/v') }}
    steps:
    - name: Set up Go 1.x
      uses: actions/setup-go@v2
      with:
        go-version: ${{ env.GO_VERSION }}
      id: go

    - name: Check out code into the Go module directory
      uses: actions/checkout@v2

    - name: Run GoReleaser
      uses: goreleaser/goreleaser-action@v2
      with:
        version: latest
        args: release --rm-dist
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}