Thanks for your interest in this project, feel free to ask any questions you may have.
To build the project, make sure that you https://go.dev/ installed, GNU Make and goreleaser installed, then execute the command make build
, or use Docker with:
docker run --rm -v "$PWD":/usr/src/updatecli -w /usr/src/updatecli -e GOOS=windows -e GOARCH=386 golang:1.16 go build -v
They are multiple ways to contribute which don’t necessarily involve coding, like providing feedback, improving documentation and processes. Here I’ll just highlight some of them:
It’s significantly harder to build a solution that could be used by different people. It involves many different skills hard to master and it’s easy to get stuck in local optimum. So feel free to reach out to say what’s wrong and what could be improved.
The code is divided into two categories, core and plugins. The core is designed to be independent and to provide the skeleton for the application, while the plugins define how things are automated for a specific use-case. The easiest part is probably plugins as it allows you to contribute independently to the process you are looking to automate.
Plugins can be easily added by following this workflow:
Creating a new directory using your "packageName" under the directory pkg/plugins
that will contain your go package similar to:
pkg
├── plugins
│ └── packageName
│ ├── source_test.go
│ ├── source.go
│ ├── condition_test.go
│ ├── condition.go
│ ├── target_test.go
│ ├── target.go
│ ├── main_test.go
│ └── main.go
└── main_test.go
In the main.go
, you need to define the struct
that you’ll use to configure your workflow where the capitalized fields will be set when unmarshalling from your future configuration.yaml
type Capitalized_package_name struct {
Field1 string
Field2 string
Field3 string
Field4 string
}
Your 'packageName' must respect at least one of the following interface contract by defining appropriated functions.
Stage | Interface | Description |
---|---|---|
Source |
|
Defines how a version will be retrieved then passed the following stages |
Changelog |
|
Retrieve the changelog for a specific source. |
Condition |
|
Define a condition which has to pass in order to proceed |
Target |
|
Define how a target file will be updated |
Each stage which can be configured using a yaml/go template has to bind a resource kind and a package name, this is done in the "Unmarshal" function
import "github.com/updatecli/updatecli/pkg/plugins/packageName"
...
case "packageName":
p := packageName.PackageName{}
err := mapstructure.Decode(s.Spec, &p)
if err != nil {
return err
}
spec = &p
Now something like this should be working:
config.value
# updatecli diff --config config.value
sources:
default:
kind: packageName
spec:
field1: "value"
field3: "value"
targets:
idName:
name: "updatecli"
kind: "yaml"
spec:
file: "..."
key: "..."
transformers:
- addPrefix: "olblak/polls@256:"
If you spot phrasing issues or just a lack of documentation, feel free to open an issue and/or a pull request. website