Skip to content

Commit

Permalink
ci: improve caching (#2329)
Browse files Browse the repository at this point in the history
  • Loading branch information
shumkov authored Nov 18, 2024
1 parent a78c7b0 commit ff2a831
Show file tree
Hide file tree
Showing 29 changed files with 238 additions and 345 deletions.
96 changes: 72 additions & 24 deletions .github/actions/docker/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,6 @@ inputs:
description: User name to use when pushing images to Docker Hub
dockerhub_token:
description: Docker Hub token to use
cache_mounts:
description: Load cache mounts cache
default: |
cargo_registry_index
cargo_registry_cache
cargo_git
cargo_profile:
description: Cargo build profile, i.e release or dev
default: dev
Expand All @@ -43,6 +37,9 @@ inputs:
aws_secret_access_key:
description: AWS secret access key
required: true
cache_to_name:
description: 'Save cache to name manifest (should be used only on default branch)'
default: 'false'
outputs:
digest:
value: ${{ steps.docker_build.outputs.digest }}
Expand All @@ -65,17 +62,10 @@ runs:
install: true
driver-opts: env.BUILDKIT_STEP_LOG_MAX_SIZE=10485760
cleanup: false
config-inline: |
buildkitd-config-inline: |
[worker.oci]
gc = false
- name: Load Docker mount cache
uses: dcginfra/buildkit-cache-dance/inject@s5cmd
if: ${{ inputs.cache_mounts != '' }}
with:
bucket: ${{ inputs.bucket }}
mounts: ${{ inputs.cache_mounts }}

- name: Set Docker tags and labels from image tag
id: docker_meta
uses: docker/metadata-action@v5
Expand All @@ -90,16 +80,83 @@ runs:
id: layer_cache_settings
with:
name: ${{ inputs.image_name }}
region: ${{ inputs.region }}
bucket: ${{ inputs.bucket }}
cache_to_name: ${{ inputs.cache_to_name }}

- name: Set HOME variable to github context
shell: bash
run: echo "HOME=$HOME" >> $GITHUB_ENV

- name: Cargo cache for Docker
uses: actions/cache@v4
id: cargo-cache
with:
path: |
${{ env.HOME }}/cargo-cache-registry-index
${{ env.HOME }}/cargo-cache-registry-cache
${{ env.HOME }}/cargo-cache-git-db
key: ${{ runner.os }}-cargo-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Inject cargo cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3.1.2
with:
cache-map: |
{
"${{ env.HOME }}/cargo-cache-registry-index": {
"target": "/root/.cargo/registry/index",
"id": "cargo_registry_index"
},
"${{ env.HOME }}/cargo-cache-registry-cache": {
"target": "/root/.cargo/registry/cache",
"id": "cargo_registry_cache"
},
"${{ env.HOME }}/cargo-cache-git-db": {
"target": "/root/.cargo/git/db",
"id": "cargo_git"
}
}
skip-extraction: ${{ steps.cargo-cache.outputs.cache-hit }}

- name: Yarn unplugged cache for Docker
uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ env.HOME }}/yarn-unplugged-cache
key: ${{ inputs.platform }}-yarn-unplugged-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ inputs.platform }}-yarn-unplugged-
- name: Set arch
id: arch
uses: actions/github-script@v6
with:
result-encoding: 'string'
script: return '${{ inputs.platform }}'.replace('linux/', '');

- name: Inject cargo cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3.1.2
with:
cache-map: |
{
"${{ env.HOME }}/yarn-unplugged-cache": {
"target": "/tmp/unplugged",
"id": "unplugged_${{ steps.arch.outputs.result }}"
}
}
skip-extraction: ${{ steps.yarn-cache.outputs.cache-hit }}

- name: Build and push Docker image ${{ inputs.image }}
id: docker_build
uses: docker/build-push-action@v5
uses: docker/build-push-action@v6
with:
context: .
builder: ${{ steps.buildx.outputs.name }}
target: ${{ inputs.target }}
labels: ${{ steps.docker_meta.outputs.labels }}
push: ${{ inputs.push_tags }}
tags: ${{ inputs.push_tags == 'true' && steps.docker_meta.outputs.tags || '' }}
platforms: ${{ inputs.platform }}
build-args: |
Expand All @@ -110,15 +167,6 @@ runs:
SCCACHE_S3_KEY_PREFIX=${{ runner.os }}/sccache
AWS_ACCESS_KEY_ID=${{ inputs.aws_access_key_id }}
AWS_SECRET_ACCESS_KEY=${{ inputs.aws_secret_access_key }}
AWS_REGION=${{ inputs.region }}
cache-from: ${{ steps.layer_cache_settings.outputs.cache_from }}
cache-to: ${{ steps.layer_cache_settings.outputs.cache_to }}
outputs: type=image,name=${{ inputs.image_org }}/${{ inputs.image_name }},push-by-digest=${{ inputs.push_tags != 'true' }},name-canonical=true,push=true

# TODO: This is doesn't work
# - name: Save Docker mount cache
# uses: dcginfra/buildkit-cache-dance/extract@s5cmd
# if: ${{ inputs.cache_mounts != '' }}
# with:
# bucket: ${{ inputs.bucket }}
# mounts: ${{ inputs.cache_mounts }}
8 changes: 3 additions & 5 deletions .github/actions/librocksdb/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,12 @@ inputs:
runs:
using: composite
steps:
# Cache librocksdb using s3 bucket
- name: Restore cached librocksdb from S3
- name: Cache librocksdb
uses: actions/cache@v4
id: librocksdb-cache
uses: strophy/actions-cache@opendal-update
with:
bucket: ${{ inputs.bucket }}
path: /opt/rocksdb
key: librocksdb/${{ inputs.version }}/${{ runner.os }}/${{ runner.arch }}
path: /opt/rocksdb

- if: ${{ steps.librocksdb-cache.outputs.cache-hit != 'true' || inputs.force == 'true' }}
shell: bash
Expand Down
23 changes: 6 additions & 17 deletions .github/actions/local-network/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,11 @@ runs:
- name: Setup Node.JS
uses: ./.github/actions/nodejs

- name: Restore JS build artifacts
uses: strophy/actions-cache@opendal-update
- name: Download JS build artifacts
uses: actions/download-artifact@v4
with:
bucket: multi-runner-cache-x1xibo9c
root: actions-cache
path: build-js-artifacts-${{ github.sha }}.tar
key: build-js-artifacts/${{ github.sha }}

- name: Unpack JS build artifacts archive
shell: bash
run: tar -xf build-js-artifacts-${{ github.sha }}.tar
name: js-build-${{ github.sha }}
path: packages

- name: Get dashmate fingerprint
id: dashmate-fingerprint
Expand All @@ -32,13 +26,10 @@ runs:
shell: bash
run: echo "HOME=$HOME" >> $GITHUB_ENV

# TODO: Use upload artifacts action instead
- name: Restore local network data
id: local-network-data
uses: strophy/actions-cache/restore@opendal-update
uses: actions/cache/restore@v4
with:
bucket: multi-runner-cache-x1xibo9c
root: local-network-data
path: |
${{ env.HOME }}/.dashmate
**/.env
Expand Down Expand Up @@ -72,10 +63,8 @@ runs:
if: steps.local-network-data.outputs.cache-hit != 'true'

- name: Save local network data
uses: strophy/actions-cache/save@opendal-update
uses: actions/cache/save@v4
with:
bucket: multi-runner-cache-x1xibo9c
root: local-network-data
path: |
${{ env.HOME }}/.dashmate
**/.env
Expand Down
6 changes: 2 additions & 4 deletions .github/actions/nodejs/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,9 @@ runs:
shell: bash
run: npm config set audit false

- name: Cache NPM build artifacts (S3 bucket cache)
uses: strophy/actions-cache@opendal-update
- name: Cache NPM build artifacts
uses: actions/cache@v4
with:
bucket: multi-runner-cache-x1xibo9c
root: actions-cache
path: |
.yarn/unplugged
key: ${{ runner.os }}/yarn/unplugged/${{ runner.arch }}/${{ hashFiles('yarn.lock') }}
Expand Down
18 changes: 4 additions & 14 deletions .github/actions/rust/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ inputs:
required: false
default: "true"

# TODO: Cache deps here to save 1 minute
runs:
using: composite
steps:
Expand All @@ -32,10 +33,8 @@ runs:
echo "TOOLCHAIN_VERSION=$TOOLCHAIN_VERSION" >> $GITHUB_ENV
echo "::set-output name=version::$TOOLCHAIN_VERSION"
# TODO: Move to AMI and build every day
- uses: dtolnay/rust-toolchain@master
name: Install Rust toolchain
id: install_rust
with:
toolchain: ${{ steps.rust_toolchain.outputs.version }}
target: ${{ inputs.target }}
Expand All @@ -60,7 +59,6 @@ runs:
;;
esac
# TODO: Move to AMI and build every day
- name: Check if protoc is installed
id: check-protoc
shell: bash
Expand All @@ -84,27 +82,20 @@ runs:
echo "PROTOC=${HOME}/.local/bin/protoc" >> $GITHUB_ENV
export PATH="${PATH}:${HOME}/.local/bin"
- name: Run sccache-cache
- name: Install sccache-cache
uses: mozilla-actions/sccache-action@v0.0.6
with:
version: "v0.8.2" # Must be the same as in Dockerfile
if: inputs.cache == 'true'

- name: Hash ref_name
id: hashed-ref-name
shell: bash
run: echo "key=$(echo '${{ github.ref_name }}' | sha256sum | cut -d ' ' -f1)" >> $GITHUB_OUTPUT

- name: Set HOME variable to github context
shell: bash
run: echo "HOME=$HOME" >> $GITHUB_ENV

- name: Cache cargo registry (S3 bucket cache)
uses: strophy/actions-cache@opendal-update
- name: Cache cargo registry
uses: actions/cache@v4
if: inputs.cache == 'true'
with:
bucket: multi-runner-cache-x1xibo9c
root: actions-cache
path: |
${{ env.HOME }}/.cargo/registry/index
${{ env.HOME }}/.cargo/registry/cache
Expand All @@ -114,7 +105,6 @@ runs:
${{ runner.os }}/cargo/registry/${{ hashFiles('**/Cargo.lock') }}
${{ runner.os }}/cargo/registry/
# TODO: Move to AMI and build every day
- name: Install clang
id: deps-clang
shell: bash
Expand Down
45 changes: 32 additions & 13 deletions .github/actions/s3-layer-cache-settings/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,19 @@ inputs:
default: ${{ github.ref }}
region:
description: S3 region
default: eu-west-1
required: true
bucket:
description: S3 bucket name
default: multi-runner-cache-x1xibo9c
required: true
prefix:
description: S3 key prefix
default: 'cache-layers/'
mode:
description: Cache mode
default: max
cache_to_name:
description: 'Save cache to name manifest (should be used only on default branch)'
default: 'false'

outputs:
cache_to:
Expand All @@ -41,26 +44,42 @@ runs:
id: script
with:
script: |
const sanitizedHeadRef = '${{ inputs.head_ref }}'.replace(/[^a-zA-Z0-9]/g, '-');
const manifestNames = [
'${{ inputs.name }}_sha_${{ github.sha }}',
`${{ inputs.name }}_tag_${ sanitizedHeadRef }`,
'${{ inputs.name }}'
];
const settings = {
type: 's3',
region: '${{ inputs.region }}',
bucket: '${{ inputs.bucket }}',
prefix: '${{ inputs.prefix }}',
name: manifestNames.join(';'),
};
const settingsString = Object.entries(settings)
.filter(([,value]) => value !== '')
.map(([key, value]) => `${key}=${value}`)
.join(',');
core.setOutput('cache_from', settingsString);
core.setOutput('cache_to', `${settingsString},mode=${{ inputs.mode }}`);
const sanitizedHeadRef = '${{ inputs.head_ref }}'.replace(/[^a-zA-Z0-9]/g, '-');
const shaManifestName = '${{ inputs.name }}_sha_${{ github.sha }}';
const headRefManifestName = '${{ inputs.name }}_tag_${ sanitizedHeadRef }';
const cacheFromManifestNames = [
shaManifestName,
headRefManifestName,
'${{ inputs.name }}',
];
const cacheFrom = cacheFromManifestNames
.map((name) => `${settingsString},name=${name}`)
.join('\n');
core.setOutput('cache_from', cacheFrom);
const cacheToManifestNames = [
shaManifestName,
headRefManifestName,
];
if ('${{ inputs.cache_to_name }}' === 'true') {
cacheToManifestNames.push('${{ inputs.name }}');
}
core.setOutput('cache_to', `${settingsString},mode=${{ inputs.mode }},name=${cacheToManifestNames.join(';')}`);
23 changes: 0 additions & 23 deletions .github/workflows/cached.yml

This file was deleted.

Loading

0 comments on commit ff2a831

Please sign in to comment.