mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-23 06:09:59 +00:00
CI: build build-tools image (#6082)
## Currently our build docker file is located in the build repo it makes sense to have it as a part of our neon repo ## Summary of changes We had the docker file that we use to build our binary and other tools resided in the build repo It made sense to bring the docker file to its repo where it has been used So that the contributors can also view it and amend if required It will reduce the maintenance. Docker file changes and code changes can be accommodated in same PR Also, building the image and pushing it to ECR is abstracted in a reusable workflow. Ideal is to use that for any other jobs too ## Checklist before requesting a review - [x] Moved the docker file used to build the binary from the build repo to the neon repo - [x] adding gh workflow to build and push the image - [x] adding gh workflow to tag the pushed image - [x] update readMe file --------- Co-authored-by: Abhijeet Patil <abhijeet@neon.tech> Co-authored-by: Alexander Bayandin <alexander@neon.tech>
This commit is contained in:
57
.github/workflows/build_and_push_docker_image.yml
vendored
Normal file
57
.github/workflows/build_and_push_docker_image.yml
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
name: Build and Push Docker Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
dockerfile-path:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
image-name:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
tag:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
kaniko:
|
||||||
|
runs-on: [ self-hosted, dev, x64 ]
|
||||||
|
container: gcr.io/kaniko-project/executor:v1.7.0-debug
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Configure ECR login
|
||||||
|
run: echo "{\"credsStore\":\"ecr-login\"}" > /kaniko/.docker/config.json
|
||||||
|
|
||||||
|
- name: Kaniko build
|
||||||
|
run: /kaniko/executor --reproducible --snapshotMode=redo --skip-unused-stages --dockerfile ${{ inputs.dockerfile-path }} --cache=true --cache-repo 369495373322.dkr.ecr.eu-central-1.amazonaws.com/cache --destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/${{ inputs.image-name }}:${{ inputs.tag }}-amd64
|
||||||
|
|
||||||
|
kaniko-arm:
|
||||||
|
runs-on: [ self-hosted, dev, arm64 ]
|
||||||
|
container: gcr.io/kaniko-project/executor:v1.7.0-debug
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Configure ECR login
|
||||||
|
run: echo "{\"credsStore\":\"ecr-login\"}" > /kaniko/.docker/config.json
|
||||||
|
|
||||||
|
- name: Kaniko build
|
||||||
|
run: /kaniko/executor --reproducible --snapshotMode=redo --skip-unused-stages --dockerfile ${{ inputs.dockerfile-path }} --cache=true --cache-repo 369495373322.dkr.ecr.eu-central-1.amazonaws.com/cache --destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/${{ inputs.image-name }}:${{ inputs.tag }}-arm64
|
||||||
|
|
||||||
|
manifest:
|
||||||
|
name: 'manifest'
|
||||||
|
runs-on: [ self-hosted, dev, x64 ]
|
||||||
|
needs:
|
||||||
|
- kaniko
|
||||||
|
- kaniko-arm
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Create manifest
|
||||||
|
run: docker manifest create 369495373322.dkr.ecr.eu-central-1.amazonaws.com/${{ inputs.image-name }}:${{ inputs.tag }} --amend 369495373322.dkr.ecr.eu-central-1.amazonaws.com/${{ inputs.image-name }}:${{ inputs.tag }}-amd64 --amend 369495373322.dkr.ecr.eu-central-1.amazonaws.com/${{ inputs.image-name }}:${{ inputs.tag }}-arm64
|
||||||
|
|
||||||
|
- name: Push manifest
|
||||||
|
run: docker manifest push 369495373322.dkr.ecr.eu-central-1.amazonaws.com/${{ inputs.image-name }}:${{ inputs.tag }}
|
||||||
82
.github/workflows/build_and_test.yml
vendored
82
.github/workflows/build_and_test.yml
vendored
@@ -44,13 +44,13 @@ jobs:
|
|||||||
|
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
|
|
||||||
tag:
|
tag:
|
||||||
needs: [ check-permissions ]
|
needs: [ check-permissions ]
|
||||||
runs-on: [ self-hosted, gen3, small ]
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
container: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/base:pinned
|
container: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/base:pinned
|
||||||
outputs:
|
outputs:
|
||||||
build-tag: ${{steps.build-tag.outputs.tag}}
|
build-tag: ${{steps.build-tag.outputs.tag}}
|
||||||
|
build-tools-tag: ${{steps.buildtools-tag.outputs.image_tag}}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -74,11 +74,50 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
id: build-tag
|
id: build-tag
|
||||||
|
|
||||||
check-codestyle-python:
|
- name: Get buildtools tag
|
||||||
|
run: |
|
||||||
|
if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then
|
||||||
|
IMAGE_TAG=$GITHUB_RUN_ID
|
||||||
|
else
|
||||||
|
IMAGE_TAG=pinned
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "image_tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT
|
||||||
|
shell: bash
|
||||||
|
id: buildtools-tag
|
||||||
|
|
||||||
|
check-if-build-tools-dockerfile-changed:
|
||||||
needs: [ check-permissions ]
|
needs: [ check-permissions ]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
docker_file_changed: ${{ steps.dockerfile.outputs.docker_file_changed }}
|
||||||
|
steps:
|
||||||
|
- name: Check if Dockerfile.buildtools has changed
|
||||||
|
id: dockerfile
|
||||||
|
run: |
|
||||||
|
updated_files=$(gh pr --repo neondatabase/neon diff ${{ github.event.pull_request.number }} --name-only)
|
||||||
|
if [[ $updated_files == *"Dockerfile.buildtools"* ]]; then
|
||||||
|
echo "docker_file_changed=true" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
build-buildtools-image:
|
||||||
|
needs: [ check-permissions, check-if-build-tools-dockerfile-changed, tag]
|
||||||
|
uses: ./.github/workflows/build_and_push_docker_image.yml
|
||||||
|
if: needs.check-if-build-tools-dockerfile-changed.outputs.docker_file_changed == 'true'
|
||||||
|
with:
|
||||||
|
dockerfile-path: Dockerfile.buildtools
|
||||||
|
image-name: build-tools
|
||||||
|
tag: ${{ needs.tag.outputs.build-tools-tag}}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
check-codestyle-python:
|
||||||
|
if: always() && contains(fromJSON('["success", "skipped"]'), needs.build-buildtools-image.result)
|
||||||
|
needs: [ check-permissions, build-buildtools-image , tag ]
|
||||||
runs-on: [ self-hosted, gen3, small ]
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
options: --init
|
options: --init
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -108,10 +147,11 @@ jobs:
|
|||||||
run: poetry run mypy .
|
run: poetry run mypy .
|
||||||
|
|
||||||
check-codestyle-rust:
|
check-codestyle-rust:
|
||||||
needs: [ check-permissions ]
|
if: always() && contains(fromJSON('["success", "skipped"]'), needs.build-buildtools-image.result)
|
||||||
|
needs: [ check-permissions, build-buildtools-image, tag ]
|
||||||
runs-on: [ self-hosted, gen3, large ]
|
runs-on: [ self-hosted, gen3, large ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
options: --init
|
options: --init
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -175,10 +215,11 @@ jobs:
|
|||||||
run: cargo deny check --hide-inclusion-graph
|
run: cargo deny check --hide-inclusion-graph
|
||||||
|
|
||||||
build-neon:
|
build-neon:
|
||||||
needs: [ check-permissions, tag ]
|
if: always() && contains(fromJSON('["success", "skipped"]'), needs.build-buildtools-image.result)
|
||||||
|
needs: [ check-permissions, tag, build-buildtools-image ]
|
||||||
runs-on: [ self-hosted, gen3, large ]
|
runs-on: [ self-hosted, gen3, large ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
options: --init
|
options: --init
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -411,7 +452,7 @@ jobs:
|
|||||||
needs: [ check-permissions, build-neon, tag ]
|
needs: [ check-permissions, build-neon, tag ]
|
||||||
runs-on: [ self-hosted, gen3, large ]
|
runs-on: [ self-hosted, gen3, large ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
# Default shared memory is 64mb
|
# Default shared memory is 64mb
|
||||||
options: --init --shm-size=512mb
|
options: --init --shm-size=512mb
|
||||||
strategy:
|
strategy:
|
||||||
@@ -447,10 +488,10 @@ jobs:
|
|||||||
uses: ./.github/actions/save-coverage-data
|
uses: ./.github/actions/save-coverage-data
|
||||||
|
|
||||||
benchmarks:
|
benchmarks:
|
||||||
needs: [ check-permissions, build-neon ]
|
needs: [ check-permissions, build-neon, tag]
|
||||||
runs-on: [ self-hosted, gen3, small ]
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
# Default shared memory is 64mb
|
# Default shared memory is 64mb
|
||||||
options: --init --shm-size=512mb
|
options: --init --shm-size=512mb
|
||||||
if: github.ref_name == 'main' || contains(github.event.pull_request.labels.*.name, 'run-benchmarks')
|
if: github.ref_name == 'main' || contains(github.event.pull_request.labels.*.name, 'run-benchmarks')
|
||||||
@@ -479,12 +520,12 @@ jobs:
|
|||||||
# while coverage is currently collected for the debug ones
|
# while coverage is currently collected for the debug ones
|
||||||
|
|
||||||
create-test-report:
|
create-test-report:
|
||||||
needs: [ check-permissions, regress-tests, coverage-report, benchmarks ]
|
needs: [ check-permissions, regress-tests, coverage-report, benchmarks, tag ]
|
||||||
if: ${{ !cancelled() && contains(fromJSON('["skipped", "success"]'), needs.check-permissions.result) }}
|
if: ${{ !cancelled() && contains(fromJSON('["skipped", "success"]'), needs.check-permissions.result) }}
|
||||||
|
|
||||||
runs-on: [ self-hosted, gen3, small ]
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
options: --init
|
options: --init
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -526,11 +567,10 @@ jobs:
|
|||||||
})
|
})
|
||||||
|
|
||||||
coverage-report:
|
coverage-report:
|
||||||
needs: [ check-permissions, regress-tests ]
|
needs: [ check-permissions, regress-tests, tag ]
|
||||||
|
|
||||||
runs-on: [ self-hosted, gen3, small ]
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
container:
|
container:
|
||||||
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools:${{ needs.tag.outputs.build-tools-tag }}
|
||||||
options: --init
|
options: --init
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -694,7 +734,8 @@ jobs:
|
|||||||
}"
|
}"
|
||||||
|
|
||||||
neon-image:
|
neon-image:
|
||||||
needs: [ check-permissions, tag ]
|
if: always() && contains(fromJSON('["success", "skipped"]'), needs.build-buildtools-image.result)
|
||||||
|
needs: [ check-permissions, build-buildtools-image, tag ]
|
||||||
runs-on: [ self-hosted, gen3, large ]
|
runs-on: [ self-hosted, gen3, large ]
|
||||||
container: gcr.io/kaniko-project/executor:v1.9.2-debug
|
container: gcr.io/kaniko-project/executor:v1.9.2-debug
|
||||||
defaults:
|
defaults:
|
||||||
@@ -733,6 +774,7 @@ jobs:
|
|||||||
--context .
|
--context .
|
||||||
--build-arg GIT_VERSION=${{ github.event.pull_request.head.sha || github.sha }}
|
--build-arg GIT_VERSION=${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
--build-arg BUILD_TAG=${{ needs.tag.outputs.build-tag }}
|
--build-arg BUILD_TAG=${{ needs.tag.outputs.build-tag }}
|
||||||
|
--build-arg TAG=${{ needs.tag.outputs.build-tools-tag }}
|
||||||
--build-arg REPOSITORY=369495373322.dkr.ecr.eu-central-1.amazonaws.com
|
--build-arg REPOSITORY=369495373322.dkr.ecr.eu-central-1.amazonaws.com
|
||||||
--destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/neon:${{needs.tag.outputs.build-tag}}
|
--destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/neon:${{needs.tag.outputs.build-tag}}
|
||||||
--destination neondatabase/neon:${{needs.tag.outputs.build-tag}}
|
--destination neondatabase/neon:${{needs.tag.outputs.build-tag}}
|
||||||
@@ -742,8 +784,9 @@ jobs:
|
|||||||
run: rm -rf ~/.ecr
|
run: rm -rf ~/.ecr
|
||||||
|
|
||||||
compute-tools-image:
|
compute-tools-image:
|
||||||
|
if: always() && contains(fromJSON('["success", "skipped"]'), needs.build-buildtools-image.result)
|
||||||
runs-on: [ self-hosted, gen3, large ]
|
runs-on: [ self-hosted, gen3, large ]
|
||||||
needs: [ check-permissions, tag ]
|
needs: [ check-permissions, build-buildtools-image, tag ]
|
||||||
container: gcr.io/kaniko-project/executor:v1.9.2-debug
|
container: gcr.io/kaniko-project/executor:v1.9.2-debug
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -778,6 +821,7 @@ jobs:
|
|||||||
--context .
|
--context .
|
||||||
--build-arg GIT_VERSION=${{ github.event.pull_request.head.sha || github.sha }}
|
--build-arg GIT_VERSION=${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
--build-arg BUILD_TAG=${{needs.tag.outputs.build-tag}}
|
--build-arg BUILD_TAG=${{needs.tag.outputs.build-tag}}
|
||||||
|
--build-arg TAG=${{needs.tag.outputs.build-tools-tag}}
|
||||||
--build-arg REPOSITORY=369495373322.dkr.ecr.eu-central-1.amazonaws.com
|
--build-arg REPOSITORY=369495373322.dkr.ecr.eu-central-1.amazonaws.com
|
||||||
--dockerfile Dockerfile.compute-tools
|
--dockerfile Dockerfile.compute-tools
|
||||||
--destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-tools:${{needs.tag.outputs.build-tag}}
|
--destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-tools:${{needs.tag.outputs.build-tag}}
|
||||||
@@ -788,7 +832,8 @@ jobs:
|
|||||||
run: rm -rf ~/.ecr
|
run: rm -rf ~/.ecr
|
||||||
|
|
||||||
compute-node-image:
|
compute-node-image:
|
||||||
needs: [ check-permissions, tag ]
|
if: always() && contains(fromJSON('["success", "skipped"]'), needs.build-buildtools-image.result)
|
||||||
|
needs: [ check-permissions, build-buildtools-image, tag ]
|
||||||
runs-on: [ self-hosted, gen3, large ]
|
runs-on: [ self-hosted, gen3, large ]
|
||||||
container:
|
container:
|
||||||
image: gcr.io/kaniko-project/executor:v1.9.2-debug
|
image: gcr.io/kaniko-project/executor:v1.9.2-debug
|
||||||
@@ -836,6 +881,7 @@ jobs:
|
|||||||
--build-arg GIT_VERSION=${{ github.event.pull_request.head.sha || github.sha }}
|
--build-arg GIT_VERSION=${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
--build-arg PG_VERSION=${{ matrix.version }}
|
--build-arg PG_VERSION=${{ matrix.version }}
|
||||||
--build-arg BUILD_TAG=${{needs.tag.outputs.build-tag}}
|
--build-arg BUILD_TAG=${{needs.tag.outputs.build-tag}}
|
||||||
|
--build-arg TAG=${{needs.tag.outputs.build-tools-tag}}
|
||||||
--build-arg REPOSITORY=369495373322.dkr.ecr.eu-central-1.amazonaws.com
|
--build-arg REPOSITORY=369495373322.dkr.ecr.eu-central-1.amazonaws.com
|
||||||
--dockerfile Dockerfile.compute-node
|
--dockerfile Dockerfile.compute-node
|
||||||
--destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}}
|
--destination 369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}}
|
||||||
|
|||||||
130
.github/workflows/update_build_tools_image.yml
vendored
Normal file
130
.github/workflows/update_build_tools_image.yml
vendored
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
name: 'Update build tools image tag'
|
||||||
|
|
||||||
|
# This workflow it used to update tag of build tools in ECR.
|
||||||
|
# The most common use case is adding/moving `pinned` tag to `${GITHUB_RUN_IT}` image.
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
from-tag:
|
||||||
|
description: 'Source tag'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
to-tag:
|
||||||
|
description: 'Destination tag'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
default: 'pinned'
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash -euo pipefail {0}
|
||||||
|
|
||||||
|
env:
|
||||||
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_DEV }}
|
||||||
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_KEY_DEV }}
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tag-image:
|
||||||
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
|
container: golang:1.19-bullseye
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools
|
||||||
|
FROM_TAG: ${{ inputs.from-tag }}
|
||||||
|
TO_TAG: ${{ inputs.to-tag }}
|
||||||
|
outputs:
|
||||||
|
next-digest-buildtools: ${{ steps.next-digest.outputs.next-digest-buildtools }}
|
||||||
|
prev-digest-buildtools: ${{ steps.prev-digest.outputs.prev-digest-buildtools }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install Crane & ECR helper
|
||||||
|
run: |
|
||||||
|
go install github.com/google/go-containerregistry/cmd/crane@a54d64203cffcbf94146e04069aae4a97f228ee2 # v0.16.1
|
||||||
|
go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login@adf1bafd791ae7d4ff098108b1e91f36a4da5404 # v0.7.1
|
||||||
|
|
||||||
|
- name: Configure ECR login
|
||||||
|
run: |
|
||||||
|
mkdir /github/home/.docker/
|
||||||
|
echo "{\"credsStore\":\"ecr-login\"}" > /github/home/.docker/config.json
|
||||||
|
|
||||||
|
- name: Get source image digest
|
||||||
|
id: next-digest
|
||||||
|
run: |
|
||||||
|
NEXT_DIGEST=$(crane digest ${IMAGE}:${FROM_TAG} || true)
|
||||||
|
if [ -z "${NEXT_DIGEST}" ]; then
|
||||||
|
echo >&2 "Image ${IMAGE}:${FROM_TAG} does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Current ${IMAGE}@${FROM_TAG} image is ${IMAGE}@${NEXT_DIGEST}"
|
||||||
|
echo "next-digest-buildtools=$NEXT_DIGEST" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Get destination image digest (if already exists)
|
||||||
|
id: prev-digest
|
||||||
|
run: |
|
||||||
|
PREV_DIGEST=$(crane digest ${IMAGE}:${TO_TAG} || true)
|
||||||
|
if [ -z "${PREV_DIGEST}" ]; then
|
||||||
|
echo >&2 "Image ${IMAGE}:${TO_TAG} does not exist (it's ok)"
|
||||||
|
else
|
||||||
|
echo >&2 "Current ${IMAGE}@${TO_TAG} image is ${IMAGE}@${PREV_DIGEST}"
|
||||||
|
|
||||||
|
echo "prev-digest-buildtools=$PREV_DIGEST" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Tag image
|
||||||
|
run: |
|
||||||
|
crane tag "${IMAGE}:${FROM_TAG}" "${TO_TAG}"
|
||||||
|
|
||||||
|
rollback-tag-image:
|
||||||
|
needs: tag-image
|
||||||
|
if: ${{ !success() }}
|
||||||
|
|
||||||
|
runs-on: [ self-hosted, gen3, small ]
|
||||||
|
container: golang:1.19-bullseye
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMAGE: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/build-tools
|
||||||
|
FROM_TAG: ${{ inputs.from-tag }}
|
||||||
|
TO_TAG: ${{ inputs.to-tag }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install Crane & ECR helper
|
||||||
|
run: |
|
||||||
|
go install github.com/google/go-containerregistry/cmd/crane@a54d64203cffcbf94146e04069aae4a97f228ee2 # v0.16.1
|
||||||
|
go install github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login@adf1bafd791ae7d4ff098108b1e91f36a4da5404 # v0.7.1
|
||||||
|
|
||||||
|
- name: Configure ECR login
|
||||||
|
run: |
|
||||||
|
mkdir /github/home/.docker/
|
||||||
|
echo "{\"credsStore\":\"ecr-login\"}" > /github/home/.docker/config.json
|
||||||
|
|
||||||
|
- name: Restore previous tag if needed
|
||||||
|
run: |
|
||||||
|
NEXT_DIGEST="${{ needs.tag-image.outputs.next-digest-buildtools }}"
|
||||||
|
PREV_DIGEST="${{ needs.tag-image.outputs.prev-digest-buildtools }}"
|
||||||
|
|
||||||
|
if [ -z "${NEXT_DIGEST}" ]; then
|
||||||
|
echo >&2 "Image ${IMAGE}:${FROM_TAG} does not exist, nothing to rollback"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${PREV_DIGEST}" ]; then
|
||||||
|
# I guess we should delete the tag here/untag the image, but crane does not support it
|
||||||
|
# - https://github.com/google/go-containerregistry/issues/999
|
||||||
|
|
||||||
|
echo >&2 "Image ${IMAGE}:${TO_TAG} did not exist, but it was created by the job, no need to rollback"
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
CURRENT_DIGEST=$(crane digest "${IMAGE}:${TO_TAG}")
|
||||||
|
if [ "${CURRENT_DIGEST}" == "${NEXT_DIGEST}" ]; then
|
||||||
|
crane tag "${IMAGE}@${PREV_DIGEST}" "${TO_TAG}"
|
||||||
|
|
||||||
|
echo >&2 "Successfully restored ${TO_TAG} tag from ${IMAGE}@${CURRENT_DIGEST} to ${IMAGE}@${PREV_DIGEST}"
|
||||||
|
else
|
||||||
|
echo >&2 "Image ${IMAGE}:${TO_TAG}@${CURRENT_DIGEST} is not required to be restored"
|
||||||
|
fi
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -6,6 +6,7 @@ __pycache__/
|
|||||||
test_output/
|
test_output/
|
||||||
.vscode
|
.vscode
|
||||||
.idea
|
.idea
|
||||||
|
neon.iml
|
||||||
/.neon
|
/.neon
|
||||||
/integration_tests/.neon
|
/integration_tests/.neon
|
||||||
|
|
||||||
|
|||||||
@@ -70,3 +70,17 @@ We're using the following approach to make it work:
|
|||||||
- The label gets removed automatically, so to run CI again with new changes, the label should be added again (after the review)
|
- The label gets removed automatically, so to run CI again with new changes, the label should be added again (after the review)
|
||||||
|
|
||||||
For details see [`approved-for-ci-run.yml`](.github/workflows/approved-for-ci-run.yml)
|
For details see [`approved-for-ci-run.yml`](.github/workflows/approved-for-ci-run.yml)
|
||||||
|
|
||||||
|
## How do I add the "pinned" tag to an buildtools image?
|
||||||
|
We use the `pinned` tag for `Dockerfile.buildtools` build images in our CI/CD setup, currently adding the `pinned` tag is a manual operation.
|
||||||
|
|
||||||
|
You can call it from GitHub UI: https://github.com/neondatabase/neon/actions/workflows/update_build_tools_image.yml,
|
||||||
|
or using GitHub CLI:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gh workflow -R neondatabase/neon run update_build_tools_image.yml \
|
||||||
|
-f from-tag=6254913013 \
|
||||||
|
-f to-tag=pinned \
|
||||||
|
|
||||||
|
# Default `-f to-tag` is `pinned`, so the parameter can be omitted.
|
||||||
|
```
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
### By default, the binaries inside the image have some mock parameters and can start, but are not intended to be used
|
### By default, the binaries inside the image have some mock parameters and can start, but are not intended to be used
|
||||||
### inside this image in the real deployments.
|
### inside this image in the real deployments.
|
||||||
ARG REPOSITORY=neondatabase
|
ARG REPOSITORY=neondatabase
|
||||||
ARG IMAGE=rust
|
ARG IMAGE=build-tools
|
||||||
ARG TAG=pinned
|
ARG TAG=pinned
|
||||||
|
|
||||||
# Build Postgres
|
# Build Postgres
|
||||||
|
|||||||
165
Dockerfile.buildtools
Normal file
165
Dockerfile.buildtools
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
FROM debian:bullseye-slim
|
||||||
|
|
||||||
|
# Add nonroot user
|
||||||
|
RUN useradd -ms /bin/bash nonroot -b /home
|
||||||
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
|
||||||
|
# System deps
|
||||||
|
RUN set -e \
|
||||||
|
&& apt update \
|
||||||
|
&& apt install -y \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
bison \
|
||||||
|
build-essential \
|
||||||
|
ca-certificates \
|
||||||
|
cmake \
|
||||||
|
curl \
|
||||||
|
flex \
|
||||||
|
git \
|
||||||
|
gnupg \
|
||||||
|
gzip \
|
||||||
|
jq \
|
||||||
|
libcurl4-openssl-dev \
|
||||||
|
libbz2-dev \
|
||||||
|
libffi-dev \
|
||||||
|
liblzma-dev \
|
||||||
|
libncurses5-dev \
|
||||||
|
libncursesw5-dev \
|
||||||
|
libpq-dev \
|
||||||
|
libreadline-dev \
|
||||||
|
libseccomp-dev \
|
||||||
|
libsqlite3-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libstdc++-10-dev \
|
||||||
|
libtool \
|
||||||
|
libxml2-dev \
|
||||||
|
libxmlsec1-dev \
|
||||||
|
libxxhash-dev \
|
||||||
|
lsof \
|
||||||
|
make \
|
||||||
|
netcat \
|
||||||
|
net-tools \
|
||||||
|
openssh-client \
|
||||||
|
parallel \
|
||||||
|
pkg-config \
|
||||||
|
unzip \
|
||||||
|
wget \
|
||||||
|
xz-utils \
|
||||||
|
zlib1g-dev \
|
||||||
|
zstd \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# protobuf-compiler (protoc)
|
||||||
|
ENV PROTOC_VERSION 22.2
|
||||||
|
RUN curl -fsSL "https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-$(uname -m | sed 's/aarch64/aarch_64/g').zip" -o "protoc.zip" \
|
||||||
|
&& unzip -q protoc.zip -d protoc \
|
||||||
|
&& mv protoc/bin/protoc /usr/local/bin/protoc \
|
||||||
|
&& mv protoc/include/google /usr/local/include/google \
|
||||||
|
&& rm -rf protoc.zip protoc
|
||||||
|
|
||||||
|
# LLVM
|
||||||
|
ENV LLVM_VERSION=17
|
||||||
|
RUN curl -fsSL 'https://apt.llvm.org/llvm-snapshot.gpg.key' | apt-key add - \
|
||||||
|
&& echo "deb http://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-${LLVM_VERSION} main" > /etc/apt/sources.list.d/llvm.stable.list \
|
||||||
|
&& apt update \
|
||||||
|
&& apt install -y clang-${LLVM_VERSION} llvm-${LLVM_VERSION} \
|
||||||
|
&& bash -c 'for f in /usr/bin/clang*-${LLVM_VERSION} /usr/bin/llvm*-${LLVM_VERSION}; do ln -s "${f}" "${f%-${LLVM_VERSION}}"; done' \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# PostgreSQL 14
|
||||||
|
RUN curl -fsSL 'https://www.postgresql.org/media/keys/ACCC4CF8.asc' | apt-key add - \
|
||||||
|
&& echo 'deb http://apt.postgresql.org/pub/repos/apt bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
|
||||||
|
&& apt update \
|
||||||
|
&& apt install -y postgresql-client-14 \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# AWS CLI
|
||||||
|
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip" -o "awscliv2.zip" \
|
||||||
|
&& unzip -q awscliv2.zip \
|
||||||
|
&& ./aws/install \
|
||||||
|
&& rm awscliv2.zip
|
||||||
|
|
||||||
|
# Mold: A Modern Linker
|
||||||
|
ENV MOLD_VERSION v2.1.0
|
||||||
|
RUN set -e \
|
||||||
|
&& git clone https://github.com/rui314/mold.git \
|
||||||
|
&& mkdir mold/build \
|
||||||
|
&& cd mold/build \
|
||||||
|
&& git checkout ${MOLD_VERSION} \
|
||||||
|
&& cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ .. \
|
||||||
|
&& cmake --build . -j $(nproc) \
|
||||||
|
&& cmake --install . \
|
||||||
|
&& cd .. \
|
||||||
|
&& rm -rf mold
|
||||||
|
|
||||||
|
# LCOV
|
||||||
|
# Build lcov from a fork:
|
||||||
|
# It includes several bug fixes on top on v2.0 release (https://github.com/linux-test-project/lcov/compare/v2.0...master)
|
||||||
|
# And patches from us:
|
||||||
|
# - Generates json file with code coverage summary (https://github.com/neondatabase/lcov/commit/426e7e7a22f669da54278e9b55e6d8caabd00af0.tar.gz)
|
||||||
|
RUN for package in Capture::Tiny DateTime Devel::Cover Digest::MD5 File::Spec JSON::XS Memory::Process Time::HiRes JSON; do yes | perl -MCPAN -e "CPAN::Shell->notest('install', '$package')"; done \
|
||||||
|
&& wget https://github.com/neondatabase/lcov/archive/426e7e7a22f669da54278e9b55e6d8caabd00af0.tar.gz -O lcov.tar.gz \
|
||||||
|
&& echo "61a22a62e20908b8b9e27d890bd0ea31f567a7b9668065589266371dcbca0992 lcov.tar.gz" | sha256sum --check \
|
||||||
|
&& mkdir -p lcov && tar -xzf lcov.tar.gz -C lcov --strip-components=1 \
|
||||||
|
&& cd lcov \
|
||||||
|
&& make install \
|
||||||
|
&& rm -rf ../lcov.tar.gz
|
||||||
|
|
||||||
|
# Switch to nonroot user
|
||||||
|
USER nonroot:nonroot
|
||||||
|
WORKDIR /home/nonroot
|
||||||
|
|
||||||
|
# Python
|
||||||
|
ENV PYTHON_VERSION=3.9.2 \
|
||||||
|
PYENV_ROOT=/home/nonroot/.pyenv \
|
||||||
|
PATH=/home/nonroot/.pyenv/shims:/home/nonroot/.pyenv/bin:/home/nonroot/.poetry/bin:$PATH
|
||||||
|
RUN set -e \
|
||||||
|
&& cd $HOME \
|
||||||
|
&& curl -sSO https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer \
|
||||||
|
&& chmod +x pyenv-installer \
|
||||||
|
&& ./pyenv-installer \
|
||||||
|
&& export PYENV_ROOT=/home/nonroot/.pyenv \
|
||||||
|
&& export PATH="$PYENV_ROOT/bin:$PATH" \
|
||||||
|
&& export PATH="$PYENV_ROOT/shims:$PATH" \
|
||||||
|
&& pyenv install ${PYTHON_VERSION} \
|
||||||
|
&& pyenv global ${PYTHON_VERSION} \
|
||||||
|
&& python --version \
|
||||||
|
&& pip install --upgrade pip \
|
||||||
|
&& pip --version \
|
||||||
|
&& pip install pipenv wheel poetry
|
||||||
|
|
||||||
|
# Switch to nonroot user (again)
|
||||||
|
USER nonroot:nonroot
|
||||||
|
WORKDIR /home/nonroot
|
||||||
|
|
||||||
|
# Rust
|
||||||
|
# Please keep the version of llvm (installed above) in sync with rust llvm (`rustc --version --verbose | grep LLVM`)
|
||||||
|
ENV RUSTC_VERSION=1.74.0
|
||||||
|
ENV RUSTUP_HOME="/home/nonroot/.rustup"
|
||||||
|
ENV PATH="/home/nonroot/.cargo/bin:${PATH}"
|
||||||
|
RUN curl -sSO https://static.rust-lang.org/rustup/dist/$(uname -m)-unknown-linux-gnu/rustup-init && whoami && \
|
||||||
|
chmod +x rustup-init && \
|
||||||
|
./rustup-init -y --default-toolchain ${RUSTC_VERSION} && \
|
||||||
|
rm rustup-init && \
|
||||||
|
export PATH="$HOME/.cargo/bin:$PATH" && \
|
||||||
|
. "$HOME/.cargo/env" && \
|
||||||
|
cargo --version && rustup --version && \
|
||||||
|
rustup component add llvm-tools-preview rustfmt clippy && \
|
||||||
|
cargo install --git https://github.com/paritytech/cachepot && \
|
||||||
|
cargo install rustfilt && \
|
||||||
|
cargo install cargo-hakari && \
|
||||||
|
cargo install cargo-deny && \
|
||||||
|
cargo install cargo-hack && \
|
||||||
|
rm -rf /home/nonroot/.cargo/registry && \
|
||||||
|
rm -rf /home/nonroot/.cargo/git
|
||||||
|
ENV RUSTC_WRAPPER=cachepot
|
||||||
|
|
||||||
|
# Show versions
|
||||||
|
RUN whoami \
|
||||||
|
&& python --version \
|
||||||
|
&& pip --version \
|
||||||
|
&& cargo --version --verbose \
|
||||||
|
&& rustup --version --verbose \
|
||||||
|
&& rustc --version --verbose \
|
||||||
|
&& clang --version
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
ARG PG_VERSION
|
ARG PG_VERSION
|
||||||
ARG REPOSITORY=neondatabase
|
ARG REPOSITORY=neondatabase
|
||||||
ARG IMAGE=rust
|
ARG IMAGE=build-tools
|
||||||
ARG TAG=pinned
|
ARG TAG=pinned
|
||||||
ARG BUILD_TAG
|
ARG BUILD_TAG
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# First transient image to build compute_tools binaries
|
# First transient image to build compute_tools binaries
|
||||||
# NB: keep in sync with rust image version in .github/workflows/build_and_test.yml
|
# NB: keep in sync with rust image version in .github/workflows/build_and_test.yml
|
||||||
ARG REPOSITORY=neondatabase
|
ARG REPOSITORY=neondatabase
|
||||||
ARG IMAGE=rust
|
ARG IMAGE=build-tools
|
||||||
ARG TAG=pinned
|
ARG TAG=pinned
|
||||||
ARG BUILD_TAG
|
ARG BUILD_TAG
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user