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

feat: docker buildx bake action #19

Open
wants to merge 38 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
4d302f1
feat: attempt at abstracting buildx config in bake file
wdconinc Jul 10, 2024
5567dd9
fix: no --tag for bake command
wdconinc Jul 10, 2024
d771866
fix: null default, print only for now
wdconinc Jul 11, 2024
8c031d9
feat: activate build with push to registry
wdconinc Jul 11, 2024
eba19bb
fix: typo
wdconinc Jul 11, 2024
19742bc
feat: better matrix var handling
wdconinc Jul 11, 2024
7101934
fix: full regex_replace of disallowed chars
wdconinc Jul 11, 2024
5098672
fix: dockerfile relative to context
wdconinc Jul 11, 2024
02d448f
feat: dev.hcl
wdconinc Jul 11, 2024
d484846
fix: apk add envsubst
wdconinc Jul 11, 2024
33fea88
fix: correct use of variables
wdconinc Jul 11, 2024
2ee1269
fix: base provenance false, respect EXPORT_TAG unset
wdconinc Jul 11, 2024
c696e01
feat: bake --print before bake --push
wdconinc Jul 11, 2024
2ca47ea
feat: use bake-action in .github/workflows
wdconinc Jul 11, 2024
0835fca
fix: store regex in variable printable
wdconinc Jul 11, 2024
8c08baf
fix: no matrix target, just expand registries in tags
wdconinc Jul 11, 2024
edd8c2f
fix: no matrix target, just expand registries in tags (in dev)
wdconinc Jul 11, 2024
1611deb
fix: correct path to containers/jug/dev.hcl
wdconinc Jul 11, 2024
01fd597
fix: treat empty DH_PUSH as undefined
wdconinc Jul 11, 2024
1d45f17
feat: move provenance to bake file
wdconinc Jul 11, 2024
a822667
fix: correct path to containers/jug/dev.hcl
wdconinc Jul 11, 2024
85e7cbe
fix: mv {BASE,BUILD}_IMAGE into endpoint hcl
wdconinc Jul 11, 2024
7ed1fcb
fix: INTERNAL_TAG default to "testing"
wdconinc Jul 11, 2024
fae65bb
fix: docs
wdconinc Jul 11, 2024
73df1a1
fix: simplify syntax args from variable
wdconinc Jul 11, 2024
0b8c7be
fix: eic_dev:testing default settings
wdconinc Jul 11, 2024
0a1c72c
fix: allow undefined CI_REGISTRY and CI_PROJECT_PATH
wdconinc Jul 11, 2024
5f5ff5f
fix: update default spack and eic-spack versions
wdconinc Jul 11, 2024
67a5e13
fix: set default DOCKER_REGISTRY to CI_REGISTRY
wdconinc Jul 12, 2024
3080f95
fix: DOCKER_REGISTRY end with /
wdconinc Jul 12, 2024
2a26ad1
fix: dev.hcl args INTERNAL_TAG
wdconinc Jul 12, 2024
e20e061
fix: typo
wdconinc Jul 12, 2024
4c3f4f9
fix: default ENV=xl now
wdconinc Jul 12, 2024
59ffbb2
fix: pass ENV in args
wdconinc Jul 12, 2024
f4be22b
feat: use hcl lists for cherry-picks, allow undefined
wdconinc Jul 12, 2024
2ad97ec
fix: consistently use debian_base as output of debian/base.Dockerfile
wdconinc Jul 12, 2024
bde3e89
fix: properly form DOCKER_REGISTRY when CI_REGISTRY defined/undefined
wdconinc Jul 12, 2024
96f109a
feat: support docker/metadata-action for tags on GitHub
wdconinc Jul 12, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 12 additions & 113 deletions .github/workflows/build-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,20 +93,14 @@ jobs:
registry: ${{ env.GH_REGISTRY }}
username: ${{ secrets.GHCR_REGISTRY_USER }}
password: ${{ secrets.GHCR_REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
- name: Buildx Bake
uses: docker/bake-action@v5
with:
file: containers/debian/base.Dockerfile
context: containers/debian
platforms: ${{ matrix.PLATFORM }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
BASE_IMAGE=${{ matrix.BASE_IMAGE }}
BUILD_IMAGE=${{ matrix.BUILD_IMAGE }}
cache-from: type=gha,scope=${{ github.workflow }}
cache-to: type=gha,mode=max,scope=${{ github.workflow }}
provenance: false
files: |
containers/debian/base.hcl
${{ steps.meta.outputs.bake-file }}

dev:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -194,106 +188,11 @@ jobs:
registry: ${{ env.GH_REGISTRY }}
username: ${{ secrets.GHCR_REGISTRY_USER }}
password: ${{ secrets.GHCR_REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
- name: Buildx Bake
uses: docker/bake-action@v5
with:
file: containers/jug/dev.Dockerfile
context: containers/jug
build-contexts: |
spack-environment=spack-environment
secret-files: |
mirrors=mirrors.yaml
platforms: ${{ matrix.PLATFORM }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
DOCKER_REGISTRY=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/
BUILDER_IMAGE=${{ matrix.BUILDER_IMAGE }}
RUNTIME_IMAGE=${{ matrix.RUNTIME_IMAGE }}
BUILD_IMAGE=eic_${{ matrix.BUILD_IMAGE }}
INTERNAL_TAG=${{ env.INTERNAL_TAG }}
SPACK_ORGREPO=${{ steps.spack.outputs.orgrepo }}
SPACK_VERSION=${{ steps.spack.outputs.version }}
SPACK_CHERRYPICKS=${{ steps.spack.outputs.cherrypicks }}
SPACK_CHERRYPICKS_FILES=${{ steps.spack.outputs.cherrypicks_files }}
KEY4HEPSPACK_ORGREPO=${{ steps.eic-spack.outputs.orgrepo }}
KEY4HEPSPACK_VERSION=${{ steps.eic-spack.outputs.version }}
EICSPACK_ORGREPO=${{ steps.eic-spack.outputs.orgrepo }}
EICSPACK_VERSION=${{ steps.eic-spack.outputs.version }}
KEY4HEPSPACK_ORGREPO=${{ steps.key4hep-spack.outputs.orgrepo }}
KEY4HEPSPACK_VERSION=${{ steps.key4hep-spack.outputs.version }}
S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}
S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}
jobs=${{ env.JOBS }}
cache-from: type=gha,scope=${{ github.workflow }}
cache-to: type=gha,mode=max,scope=${{ github.workflow }}

xl:
runs-on: ubuntu-latest
needs: dev
strategy:
matrix:
include:
- BASE_IMAGE: dev
BUILD_IMAGE: xl
PLATFORM: linux/amd64
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/[email protected]
with:
android: true
dotnet: true
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: linux/amd64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
name=${{ env.DH_REGISTRY }}/${{ env.DH_REGISTRY_USER }}/eic_${{ matrix.BUILD_IMAGE }},enable=${{ env.DH_PUSH != 0 }}
name=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/eic_${{ matrix.BUILD_IMAGE }},enable=${{ env.GH_PUSH != 0 }}
tags: |
${{ env.INTERNAL_TAG }}
type=schedule,pattern={{date 'YYYY-MM-DD'}}
type=ref,prefix=unstable-pr-,event=pr
type=match,pattern=^v(\d+\.\d+\.\d+-.*)$,group=1
- name: Login to Docker Hub
uses: docker/login-action@v3
if: ${{ env.DH_PUSH == '1' }}
with:
registry: ${{ env.DH_REGISTRY }}
username: ${{ env.DH_REGISTRY_USER }}
password: ${{ secrets.DH_EICWEB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
if: ${{ env.GH_PUSH == '1' }}
with:
registry: ${{ env.GH_REGISTRY }}
username: ${{ secrets.GHCR_REGISTRY_USER }}
password: ${{ secrets.GHCR_REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
file: containers/jug/xl.Dockerfile
context: containers/jug
build-contexts: |
detectors=.
platforms: ${{ matrix.PLATFORM }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
DOCKER_REGISTRY=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/
BASE_IMAGE=eic_${{ matrix.BASE_IMAGE }}
BUILD_IMAGE=eic_${{ matrix.BUILD_IMAGE }}
INTERNAL_TAG=${{ env.INTERNAL_TAG }}
jobs=${{ env.JOBS }}
cache-from: type=gha,scope=${{ github.workflow }}
cache-to: type=gha,mode=max,scope=${{ github.workflow }}
provenance: false
files: |
containers/jug/dev.hcl
${{ steps.meta.outputs.bake-file }}
129 changes: 25 additions & 104 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -269,21 +269,16 @@ base:
needs:
- version
script:
- docker buildx bake ${BUILD_OPTIONS}
--print
--file containers/variables.hcl
--file containers/debian/base.hcl
- while !
docker buildx build --push ${BUILD_OPTIONS}
--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${INTERNAL_TAG}
${EXPORT_TAG:+
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${EXPORT_TAG}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}}
}
--file containers/debian/base.Dockerfile
--platform ${PLATFORM}
--build-arg BASE_IMAGE=${BASE_IMAGE}
--build-arg BUILD_IMAGE=${BUILD_IMAGE}
--provenance false
containers/debian
2>&1 | tee build.log
docker buildx bake ${BUILD_OPTIONS}
--push
--file containers/variables.hcl
--file containers/debian/base.hcl
2>&1 | tee build.log
; do
if grep "unknown blob" build.log ; then
BUILD_OPTIONS="--no-cache ${BUILD_OPTIONS}" ;
Expand Down Expand Up @@ -345,100 +340,26 @@ eic:
if [ "$CI_COMMIT_BRANCH" == "master" ]; then
PUSH_NIGHTLY_WITH_DATE="1"
fi
- if [ "${BUILD_TYPE}" == "nightly" ] ; then IF_BUILD_NIGHTLY= ; fi
- if [ "${BUILD_TYPE}" == "default" ] ; then IF_BUILD_DEFAULT= ; fi
- apk add envsubst git
- apk add envsubst
- source spack.sh ;
source key4hep-spack.sh ;
source eic-spack.sh ;
export SPACK_VERSION ;
cat mirrors.yaml.in | envsubst > mirrors.yaml
- docker buildx bake ${BUILD_OPTIONS}
--print
--file spack.hcl
--file eic-spack.hcl
--file key4hep-spack.hcl
--file containers/variables.hcl
--file containers/jug/dev.hcl
- while !
docker buildx build --push ${BUILD_OPTIONS}
--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}${ENV}:${INTERNAL_TAG}-${BUILD_TYPE}
--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE/eic/jug}${ENV}:${INTERNAL_TAG}-${BUILD_TYPE}
${EXPORT_TAG:+
${IF_BUILD_DEFAULT+
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}${ENV}:${EXPORT_TAG}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${EXPORT_TAG}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${EXPORT_TAG}}
}
${IF_BUILD_DEFAULT-
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}${ENV}:${EXPORT_TAG}-${BUILD_TYPE}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${EXPORT_TAG}-${BUILD_TYPE}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${EXPORT_TAG}-${BUILD_TYPE}}
}
}
${IF_BUILD_NIGHTLY+
${NIGHTLY:+
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}${ENV}:${NIGHTLY_TAG}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${NIGHTLY_TAG}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${NIGHTLY_TAG}}
${PUSH_NIGHTLY_WITH_DATE:+
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${NIGHTLY_TAG}-$(date +%Y-%m-%d)}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}${ENV}:${NIGHTLY_TAG}-$(date +%Y-%m-%d)}
}
}
}
${EXPORT_TAG:+
${IF_BUILD_DEFAULT+
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE/eic/jug}${ENV}:${EXPORT_TAG}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${EXPORT_TAG}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${EXPORT_TAG}}
}
${IF_BUILD_DEFAULT-
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE/eic/jug}${ENV}:${EXPORT_TAG}-${BUILD_TYPE}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${EXPORT_TAG}-${BUILD_TYPE}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${EXPORT_TAG}-${BUILD_TYPE}}
}
}
${IF_BUILD_NIGHTLY+
${NIGHTLY:+
${CI_PUSH:+--tag ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE/eic/jug}${ENV}:${NIGHTLY_TAG}}
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${NIGHTLY_TAG}}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${NIGHTLY_TAG}}
}
${PUSH_NIGHTLY_WITH_DATE:+
${DH_PUSH:+--tag ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${NIGHTLY_TAG}-$(date +%Y-%m-%d)}
${GH_PUSH:+--tag ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE/eic/jug}${ENV}:${NIGHTLY_TAG}-$(date +%Y-%m-%d)}
}
}
--file containers/jug/dev.Dockerfile
--platform ${PLATFORM}
--build-arg DOCKER_REGISTRY=${CI_REGISTRY}/${CI_PROJECT_PATH}/
--build-arg BUILDER_IMAGE=${BUILDER_IMAGE}
--build-arg RUNTIME_IMAGE=${RUNTIME_IMAGE}
--build-arg INTERNAL_TAG=${INTERNAL_TAG}
--build-arg SPACK_ORGREPO=${SPACK_ORGREPO}
--build-arg SPACK_VERSION=${SPACK_VERSION}
--build-arg SPACK_CHERRYPICKS="${SPACK_CHERRYPICKS}"
--build-arg SPACK_CHERRYPICKS_FILES="${SPACK_CHERRYPICKS_FILES}"
--build-arg KEY4HEPSPACK_ORGREPO=${KEY4HEPSPACK_ORGREPO}
--build-arg KEY4HEPSPACK_VERSION=${KEY4HEPSPACK_VERSION}
--build-arg EICSPACK_ORGREPO=${EICSPACK_ORGREPO}
--build-arg EICSPACK_VERSION=${EICSPACK_VERSION}
--build-arg S3_ACCESS_KEY=${S3_ACCESS_KEY}
--build-arg S3_SECRET_KEY=${S3_SECRET_KEY}
--build-arg JUG_VERSION=${EXPORT_TAG}-${BUILD_TYPE}-$(git rev-parse HEAD)
${IF_BUILD_DEFAULT+
${EDM4EIC_VERSION:+--build-arg EDM4EIC_VERSION=${EDM4EIC_VERSION}}
${EICRECON_VERSION:+--build-arg EICRECON_VERSION=${EICRECON_VERSION}}
${EPIC_VERSION:+--build-arg EPIC_VERSION=${EPIC_VERSION}}
${JUGGLER_VERSION:+--build-arg JUGGLER_VERSION=${JUGGLER_VERSION}}
}
${IF_BUILD_NIGHTLY+
--build-arg EDM4EIC_VERSION=main
--build-arg EICRECON_VERSION=main
--build-arg EPIC_VERSION=main
--build-arg JUGGLER_VERSION=main
}
--build-arg ENV=${ENV}
--build-arg jobs=${JOBS}
--build-context spack-environment=spack-environment
--secret id=mirrors,src=mirrors.yaml
--provenance false
containers/jug
2>&1 | tee build.log
docker buildx bake ${BUILD_OPTIONS}
--push
--file spack.hcl
--file eic-spack.hcl
--file key4hep-spack.hcl
--file containers/variables.hcl
--file containers/jug/dev.hcl
2>&1 | tee build.log
; do
if grep "unknown blob" build.log ; then
BUILD_OPTIONS="--no-cache ${BUILD_OPTIONS}" ;
Expand Down
2 changes: 1 addition & 1 deletion containers/debian/base.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#syntax=docker/dockerfile:1.4
ARG BASE_IMAGE="amd64/debian:stable-slim"
ARG BUILD_IMAGE="debian_stable_base"
ARG BUILD_IMAGE="debian_base"

# Minimal container based on Debian base systems for up-to-date packages.
FROM ${BASE_IMAGE}
Expand Down
30 changes: 30 additions & 0 deletions containers/debian/base.hcl
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Variables which are required to be defined
variable "BUILD_IMAGE" { default = "debian_base" }

# Variables whose defaults can be overridden on build
variable "BASE_IMAGE" { default = null }

# docker/metadata-action overrides the following target with tags
# but we implement it for use outside docker/metadata-action
target "docker-metadata-action" {
tags = compact(flatten([
join("/", compact([ CI_REGISTRY, CI_PROJECT_PATH, "${BUILD_IMAGE}:${INTERNAL_TAG}"]) ),
EXPORT_TAG != null && EXPORT_TAG != "" ? [
for registry in registries: "${registry}/${BUILD_IMAGE}:${EXPORT_TAG}"
] : [ null ]
]))
}

target "default" {
inherits = ["docker-metadata-action"]
attest = [
"type=provenance,disabled=true"
]
context = "containers/debian"
dockerfile = "base.Dockerfile"
platforms = [ "linux/amd64" ]
args = {
BASE_IMAGE = BASE_IMAGE
BUILD_IMAGE = BUILD_IMAGE
}
}
10 changes: 5 additions & 5 deletions containers/jug/dev.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#syntax=docker/dockerfile:1.4
ARG DOCKER_REGISTRY="eicweb/"
ARG BUILDER_IMAGE="debian_stable_base"
ARG RUNTIME_IMAGE="debian_stable_base"
ARG BUILDER_IMAGE="debian_base"
ARG RUNTIME_IMAGE="debian_base"
ARG INTERNAL_TAG="testing"

## ========================================================================================
Expand Down Expand Up @@ -32,7 +32,7 @@ EOF
## Setup spack
ENV SPACK_ROOT=/opt/spack
ARG SPACK_ORGREPO="spack/spack"
ARG SPACK_VERSION="releases/v0.20"
ARG SPACK_VERSION="v0.22.0"
ENV SPACK_PYTHON=/usr/bin/python3
ARG SPACK_CHERRYPICKS=""
ARG SPACK_CHERRYPICKS_FILES=""
Expand Down Expand Up @@ -108,7 +108,7 @@ EOF
## Setup eic-spack
ENV EICSPACK_ROOT=${SPACK_ROOT}/var/spack/repos/eic-spack
ARG EICSPACK_ORGREPO="eic/eic-spack"
ARG EICSPACK_VERSION="$SPACK_VERSION"
ARG EICSPACK_VERSION="develop"
ADD https://api.github.com/repos/${EICSPACK_ORGREPO}/commits/${EICSPACK_VERSION} /tmp/eic-spack.json
RUN <<EOF
set -e
Expand Down Expand Up @@ -138,7 +138,7 @@ FROM spack as builder

## 1. Setup our default environment (secret mount for write-enabled mirror)
COPY --from=spack-environment . /opt/spack-environment/
ARG ENV=dev
ARG ENV=xl
ENV SPACK_ENV=/opt/spack-environment/${ENV}
RUN --mount=type=cache,target=/ccache,id=${TARGETPLATFORM} \
--mount=type=cache,target=/var/cache/spack \
Expand Down
Loading
Loading