Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update README.md with more samples #5

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
128 changes: 122 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,23 +163,139 @@ in different subdirectories. The input supports glob patterns.

If some problem that prevents success caching happens then the action issues the warning in the log and continues the execution of the pipeline.

**Caching in monorepos**
### Caching in monorepos

```yaml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.17'
check-latest: true
cache-dependency-path: |
subdir/go.sum
tools/go.sum
# cache-dependency-path: "**/*.sum"
cache-dependency-path: subdir/go.sum
- run: go run hello.go
```

### Caching in multirepos
`cache-dependency-path` input assepts glob patterns and multi-line values:

```yaml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.17'
cache-dependency-path: **/go.sum
- run: go run hello.go
```

```yaml
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
with:
go-version: '1.17'
cache-dependency-path: |
subdir1/go.sum
subdir2/go.mod
- run: go run hello.go
```

### Multi-target builds
The 'cache-dependency-path' input doesn't limit itself to dependency lock files only. It can also be used with additional files that contain details about the build settings. By using this method, caches for builds created for various operating systems, architectures, etc. can be separated.

```yaml
env:
GOOS: ...
GOARCH: ...

steps:
- run: echo "$GOOS $GOARCH" > /tmp/env

- uses: actions/setup-go@v4
with:
go-version: '1.17'
cache-dependency-path: |
go.sum
/tmp/env
- run: go run hello.go
```

### Invalidate cache when source code changes
Besides the dependencise the action caches the build outputs
([GOCACHE](https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching) directory) but by default this
cache is not update in order to avoid unpredictable and frequent cache invaldation. Nevertheless
including the source code files into `cache-dependency-path` input.
Comment on lines +224 to +227

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Besides the dependencise the action caches the build outputs
([GOCACHE](https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching) directory) but by default this
cache is not update in order to avoid unpredictable and frequent cache invaldation. Nevertheless
including the source code files into `cache-dependency-path` input.
Along with dependencies, the action also caches the build outputs from the compiler, specifically the [GOCACHE](https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching) directory. By default, this part of the cache is only updated when the 'go.sum' file is modified. However, by entering source code file paths in the 'cache-dependency-path' input, you can override the default behavior and force the cache to be updated whenever a source file is changed.


```yaml
- uses: actions/setup-go@v4
with:
go-version: '1.17'
cache-dependency-path: go.sum **/*.go
- run: go run hello.go
```

### Caching with actions/cache
The caching capabilities of setup-go are limited to the simplest and most popular use cases. If fine-grained tuning of caching is required, it's recommended to disable the built-in caching and use [actions/cache](https://github.com/actions/cache).

The example workflow below utilizes the `actions/cache` action and adds flexibility, for instance, it:
- allows to configure cache path
- allows to have different caches for rare changed dependencies and more often changed intermediate build files
- uses the `restore-key` input to restore the previous cache even if the current key cache has changed
- has different caches for the compiler's build outputs for different architectures
- has custom cache keys for parallel builds

```yaml
build:
env:
GOOS: ...
GOARCH: ...

steps:
- uses: actions/setup-go@v4
with:
go-version: "1.17"
cache: false

- name: Get Go cached paths
run: |
echo "cache=$(go env GOCACHE)" >> $GITHUB_ENV
echo "modcache=$(go env GOMODCACHE)" >> $GITHUB_ENV

- name: Set up dependencies cache
uses: actions/cache@v3
with:
path: |
${{ env.cache }}
key: setup-go-deps-${{ runner.os }}-go-${{ hashFiles('go.sum go.mod') }}

- name:
run: echo "$GOOS $GOARCH"> /tmp/env

- name: Set up intermediate built files cache
uses: actions/cache@v3
with:
path: |
${{ env.modcache }}
key: setup-go-build-${{ env.GOOS }}-${{ env.GOARCH }}-${{ runner.os }}-go-${{ hashFiles('**/*.go /tmp/env') }}
restore-keys: |
setup-go-build-${{ env.GOOS }}-${{ env.GOARCH }}

```

### Restore-only caches
If there are several builds on the same repo it might make sense to create a cache in one build and use it in the
others. The action [actions/cache/restore](https://github.com/marketplace/actions/cache-restore)
should be used in this case.

### Generate different caches
This advanced use case assumes manual definition of cache key and requires the use of
[actions/cache](https://github.com/actions/cache/blob/main/examples.md#go---modules)

### Parallel builds
To avoid race conditions during the parallel builds they should either
[generate their own caches](#generate-different-caches), or create the cache
for only one build and [restore](#restore-only-caches) that cache in the other builds.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for only one build and [restore](#restore-only-caches) that cache in the other builds.
for only one build and [restore](#restore-only-caches) that cache is in other builds.


## Getting go version from the go.mod file

The `go-version-file` input accepts a path to a `go.mod` file or a `go.work` file that contains the version of Go to be
Expand Down