1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/DEVELOPMENT.md
2020-04-03 16:26:53 +02:00

7.8 KiB

Development

Table of contents:

  1. Getting started
  2. Build the project
  3. Generating step framework
  4. Logging
  5. Error handling
  6. Debugging
  7. Release

Getting started

  1. Ramp up your development environment
  2. Get familiar with Go language
  3. Create a GitHub account
  4. Setup GitHub access via SSH
  5. Create and checkout a repo fork
  6. Optional: Get Jenkins related environment
  7. Optional: Get familiar with Jenkins Pipelines as Code

Ramp up

First you need to set up an appropriate development environment:

Install Go, see GO Getting Started

Install an IDE with Go plugins, see for example Go in Visual Studio Code

Go basics

In order to get yourself started, there is a lot of useful information out there.

As a first step to take we highly recommend the Golang documentation especially, A Tour of Go

We have a strong focus on high quality software and contributions without adequate tests will not be accepted. There is an excellent resource which teaches Go using a test-driven approach: Learn Go with Tests

Checkout your fork

The project uses Go modules. Thus please make sure to NOT checkout the project into your GOPATH.

To check out this repository:

  1. Create your own fork of this repo
  2. Clone it to your machine, for example like:
mkdir -p ${HOME}/projects/jenkins-library
cd ${HOME}/projects
git clone git@github.com:${YOUR_GITHUB_USERNAME}/jenkins-library.git
cd jenkins-library
git remote add upstream git@github.com:sap/jenkins-library.git
git remote set-url --push upstream no_push

Jenkins environment

If you want to contribute also to the Jenkins-specific parts like

  • Jenkins library step
  • Jenkins pipeline integration

you need to do the following in addition:

Jenkins pipelines

The Jenkins related parts depend on

You should get familiar with these concepts for contributing to the Jenkins-specific parts.

Build the project

Build the executable suitable for the CI/CD Linux target environments

Use Docker:

docker build -t piper:latest .

You can extract the binary using Docker means to your local filesystem:

docker create --name piper piper:latest
docker cp piper:/piper .
docker rm piper

Generating step framework

The steps are generated based on the yaml files in resources/metadata/ with the following command go run pkg/generator/step-metadata.go.

The yaml format is kept pretty close to Tekton's task format. Where the Tekton format was not sufficient some extenstions have been made.

Examples are:

  • matadata - longDescription
  • spec - inputs - secrets
  • spec - containers
  • spec - sidecars

There are certain extensions:

  • aliases allow alternative parameter names also supporting deeper configuration structures. Example

  • resources allow to read for example from a shared commonPipelineEnvironment which contains information which has been provided by a previous step in the pipeline via an output. Example

  • secrets allow to specify references to Jenkins credentials which can be used in the groovy library. Example

  • outputs allow to write to dedicated outputs like

    • Influx metrics. Example
    • Sharing data via commonPipelineEnvironment which can be used by another step as input
  • conditions allow for example to specify in which case a certain container is used (depending on a configuration parameter). Example

Logging

Logging is done through sirupsen/logrus framework. It can conveniently be accessed through:

import (
    "github.com/SAP/jenkins-library/pkg/log"
)

func myStep ...
    ...
    log.Entry().Info("This is my info.")
    ...
}

If a fatal error occurs your code should act similar to:

    ...
    if err != nil {
        log.Entry().
            WithError(err).
            Fatal("failed to execute step ...")
    }

Calling Fatal results in an os.Exit(0) and before exiting some cleanup actions (e.g. writing output data, writing telemetry data if not deactivated by the user, ...) are performed.

Error handling

In order to better understand the root cause of errors that occur we wrap errors like

    f, err := os.Open(path)
    if err != nil {
        return errors.Wrapf(err, "open failed for %v", path)
    }
    defer f.Close()

We use github.com/pkg/errors for that.

Testing

Unit tests are done using basic golang means.

Additionally we encourage you to use github.com/stretchr/testify/assert in order to have slimmer assertions if you like.

Debugging

Debugging can be initiated with VS code fairly easily. Compile the binary with spcific compiler flags to turn off optimizations go build -gcflags "all=-N -l" -o piper.exe.

Modify the launch.json located in folder .vscode of your project root to point with program exatly to the binary that you just built with above command - must be an absolute path. In addition add any arguments required for the execution of the Piper step to args. What is separated with a blank on the command line must go into a separate string.

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "C:/CF@HCP/git/jenkins-library-public/piper.exe",
            "env": {},
            "args": ["checkmarxExecuteScan", "--password", "abcd", "--username", "1234", "--projectName", "testProject4711", "--serverUrl", "https://cx.server.com/"]
        }
    ]
}

Finally set your breakpoints and use the Launch button in the VS code UI to start debugging.

Release

Releases are performed using Project "Piper" Action. We release on schedule (once a week) and on demand. To perform a release, the respective action must be invoked for which a convenience script is available in contrib/perform-release.sh. It requires a personal access token for GitHub with repo scope. Example usage PIPER_RELEASE_TOKEN=THIS_IS_MY_TOKEN contrib/perform-release.sh.