Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Publish RC container images #7556

Merged
merged 52 commits into from
Aug 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
4b86705
WIP
chevdor Jul 26, 2023
0e11440
Add missing checkout
chevdor Jul 26, 2023
6360aae
Add debuggin
chevdor Jul 26, 2023
ee06e5a
Fix VAR name
chevdor Jul 26, 2023
248d5b3
Bug fix
chevdor Jul 26, 2023
1065842
Rework jobs
chevdor Jul 27, 2023
03ba038
Revert "Rework jobs"
chevdor Jul 27, 2023
9ac9615
Add cache
chevdor Jul 27, 2023
2188167
Add temp default for testing
chevdor Jul 27, 2023
6ffdf27
Add missing checkout
chevdor Jul 27, 2023
ef777d0
Fix patch
chevdor Jul 27, 2023
1c2176a
Comment out the GPG check for now
chevdor Jul 28, 2023
b80f7f7
Rename polkadot_injected_release into a more appropriate polkadot_inj…
chevdor Jul 28, 2023
e66d4fd
Refactoring / renaming
chevdor Jul 28, 2023
6a546da
Introduce a generic image for binary injection
chevdor Aug 2, 2023
850dd21
Flag files to be deleted and changes to be done
chevdor Aug 2, 2023
d563357
WIP
chevdor Aug 2, 2023
892b36b
Fix multi binaries images
chevdor Aug 7, 2023
9546cfb
Add test build scripts
chevdor Aug 7, 2023
eeb13d2
Remove old file, add polkadot build-injected script
chevdor Aug 7, 2023
d295497
Fix doc
chevdor Aug 7, 2023
4b644dd
Fix tagging
chevdor Aug 8, 2023
9ca3a6a
Add build of the injected container
chevdor Aug 8, 2023
649133b
Fix for docker
chevdor Aug 8, 2023
8bfb0c2
Remove the need for TTY
chevdor Aug 8, 2023
8f6218f
Handling container publishing
chevdor Aug 8, 2023
7d3d386
Fix owner and registry
chevdor Aug 8, 2023
d9e166e
Fix vars
chevdor Aug 8, 2023
00758a6
Fix repo
chevdor Aug 8, 2023
4950fbf
Fix var naming
chevdor Aug 9, 2023
cdea409
Fix case when there is no tag
chevdor Aug 9, 2023
14ca5e1
Fix case with no tag
chevdor Aug 9, 2023
c26c28b
Handle error
chevdor Aug 9, 2023
ed5a075
Fix spacings
chevdor Aug 9, 2023
5795d6d
Fix tags
chevdor Aug 9, 2023
c6c8675
Remove unnecessary grep that may fail
chevdor Aug 9, 2023
6dfdb90
Add final check
chevdor Aug 9, 2023
b5ece41
Clean up and introduce GPG check
chevdor Aug 9, 2023
1534ff8
Add doc
chevdor Aug 9, 2023
b63c691
Add doc
chevdor Aug 10, 2023
e674630
Update doc/docker.md
chevdor Aug 10, 2023
cacb8fa
type
chevdor Aug 10, 2023
dd08468
Fix used VAR
chevdor Aug 10, 2023
1243527
Improve doc
chevdor Aug 10, 2023
5167e9e
ci: Update .build-push-image jobs to use the new build-injected.sh
Aug 10, 2023
c4852aa
ci: fix path to build-injected.sh script
Aug 10, 2023
cb805c1
Rename the release artifacts folder to prevent confusion due to a sim…
chevdor Aug 10, 2023
79ffc7a
ci: check out polkadot repo in .build-push-image
Aug 10, 2023
6e03f03
feat(build-injected.sh): make PROJECT_ROOT configurable
Aug 10, 2023
66e6618
ci: build injected images with buildah
Aug 10, 2023
b039d6e
ci: pass full image names to zombienet
Aug 10, 2023
34426d9
Add missing ignore
chevdor Aug 11, 2023
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
2 changes: 1 addition & 1 deletion .github/workflows/check-licenses.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout sources
uses: actions/checkout@v3.3.0
uses: actions/checkout@v3
- uses: actions/setup-node@v3.7.0
with:
node-version: '18.x'
Expand Down
132 changes: 132 additions & 0 deletions .github/workflows/release-40_publish-rc-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
name: Release - Publish RC Container image
# see https://github.com/paritytech/release-engineering/issues/97#issuecomment-1651372277

on:
workflow_dispatch:
inputs:
release_id:
description: |
Release ID.
You can find it using the command:
curl -s \
-H "Authorization: Bearer ${GITHUB_TOKEN}" https://api.github.com/repos/$OWNER/$REPO/releases | \
jq '.[] | { name: .name, id: .id }'
required: true
type: string
registry:
description: "Container registry"
required: true
type: string
default: docker.io
owner:
description: Owner of the container image repo
required: true
type: string
default: parity

env:
RELEASE_ID: ${{ inputs.release_id }}
ENGINE: docker
REGISTRY: ${{ inputs.registry }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKER_OWNER: ${{ inputs.owner || github.repository_owner }}
REPO: ${{ github.repository }}
ARTIFACT_FOLDER: release-artifacts

jobs:
fetch-artifacts:
runs-on: ubuntu-latest

steps:
- name: Checkout sources
uses: actions/checkout@v3

- name: Fetch all artifacts
run: |
. ./scripts/ci/common/lib.sh
fetch_release_artifacts

- name: Cache the artifacts
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1
with:
key: artifacts-${{ github.sha }}
path: |
${ARTIFACT_FOLDER}/**/*

build-container:
runs-on: ubuntu-latest
needs: fetch-artifacts

strategy:
matrix:
binary: ["polkadot", "staking-miner"]

steps:
- name: Checkout sources
uses: actions/checkout@v3

- name: Get artifacts from cache
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1
with:
key: artifacts-${{ github.sha }}
path: |
${ARTIFACT_FOLDER}/**/*

- name: Check sha256 ${{ matrix.binary }}
working-directory: ${ARTIFACT_FOLDER}
run: |
. ../scripts/ci/common/lib.sh

echo "Checking binary ${{ matrix.binary }}"
check_sha256 ${{ matrix.binary }} && echo "OK" || echo "ERR"

- name: Check GPG ${{ matrix.binary }}
working-directory: ${ARTIFACT_FOLDER}
run: |
. ../scripts/ci/common/lib.sh
import_gpg_keys
check_gpg ${{ matrix.binary }}

- name: Fetch commit and tag
id: fetch_refs
run: |
release=release-${{ inputs.release_id }} && \
echo "release=${release}" >> $GITHUB_OUTPUT

commit=$(git rev-parse --short HEAD) && \
echo "commit=${commit}" >> $GITHUB_OUTPUT

tag=$(git name-rev --tags --name-only $(git rev-parse HEAD)) && \
[ "${tag}" != "undefined" ] && echo "tag=${tag}" >> $GITHUB_OUTPUT || \
echo "No tag, doing without"

- name: Build Injected Container image for ${{ matrix.binary }}
env:
BIN_FOLDER: ${ARTIFACT_FOLDER}
BINARY: ${{ matrix.binary }}
TAGS: ${{join(steps.fetch_refs.outputs.*, ',')}}
run: |
echo "Building container for ${{ matrix.binary }}"
./scripts/ci/dockerfiles/build-injected.sh

- name: Login to Dockerhub
uses: docker/login-action@v2
with:
username: ${{ inputs.owner }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Push Container image for ${{ matrix.binary }}
id: docker_push
env:
BINARY: ${{ matrix.binary }}
run: |
$ENGINE images | grep ${BINARY}
$ENGINE push --all-tags ${REGISTRY}/${DOCKER_OWNER}/${BINARY}

- name: Check version for the published image for ${{ matrix.binary }}
env:
BINARY: ${{ matrix.binary }}
RELEASE_TAG: ${{ steps.fetch_refs.outputs.release }}
run: |
echo "Checking tag ${RELEASE_TAG} for image ${REGISTRY}/${DOCKER_OWNER}/${BINARY}"
$ENGINE run -i ${REGISTRY}/${DOCKER_OWNER}/${BINARY}:${RELEASE_TAG} --version
2 changes: 1 addition & 1 deletion .github/workflows/release-50_publish-docker-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
uses: docker/build-push-action@v4
with:
push: true
file: scripts/ci/dockerfiles/polkadot_injected_release.Dockerfile
file: scripts/ci/dockerfiles/polkadot/polkadot_injected_debian.Dockerfile
tags: |
parity/polkadot:latest
parity/polkadot:${{ github.event.release.tag_name }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-51_publish-docker-manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
uses: docker/build-push-action@v4
with:
push: true
file: scripts/ci/dockerfiles/polkadot_injected_release.Dockerfile
file: scripts/ci/dockerfiles/polkadot/polkadot_injected_debian.Dockerfile
tags: |
parity/polkadot:latest
parity/polkadot:${{ github.event.inputs.version }}
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@ polkadot.*
!polkadot.service
.DS_Store
.env

artifacts
release-artifacts
release.json
36 changes: 22 additions & 14 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,31 +159,39 @@ default:
- if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1

.build-push-image:
variables:
CI_IMAGE: "${BUILDAH_IMAGE}"

REGISTRY: "docker.io"
DOCKER_OWNER: "paritypr"
DOCKER_USER: "${PARITYPR_USER}"
DOCKER_PASS: "${PARITYPR_PASS}"
IMAGE: "${REGISTRY}/${DOCKER_OWNER}/${IMAGE_NAME}"

ENGINE: "${BUILDAH_COMMAND}"
BUILDAH_FORMAT: "docker"
SKIP_IMAGE_VALIDATION: 1

PROJECT_ROOT: "."
BIN_FOLDER: "./artifacts"
VCS_REF: "${CI_COMMIT_SHA}"

before_script:
- !reference [.common-before-script, before_script]
- test -s ./artifacts/VERSION || exit 1
- test -s ./artifacts/EXTRATAG || exit 1
- VERSION="$(cat ./artifacts/VERSION)"
- export VERSION="$(cat ./artifacts/VERSION)"
- EXTRATAG="$(cat ./artifacts/EXTRATAG)"
- echo "Polkadot version = ${VERSION} (EXTRATAG = ${EXTRATAG})"
script:
- test "$DOCKER_USER" -a "$DOCKER_PASS" ||
( echo "no docker credentials provided"; exit 1 )
- cd ./artifacts
- $BUILDAH_COMMAND build
--format=docker
--build-arg VCS_REF="${CI_COMMIT_SHA}"
--build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
--build-arg IMAGE_NAME="${IMAGE_NAME}"
--tag "$IMAGE_NAME:$VERSION"
--tag "$IMAGE_NAME:$EXTRATAG"
--file ${DOCKERFILE} .
# The job will success only on the protected branch
- TAGS="${VERSION},${EXTRATAG}" scripts/ci/dockerfiles/build-injected.sh
- echo "$DOCKER_PASS" |
buildah login --username "$DOCKER_USER" --password-stdin docker.io
buildah login --username "$DOCKER_USER" --password-stdin "${REGISTRY}"
- $BUILDAH_COMMAND info
- $BUILDAH_COMMAND push --format=v2s2 "$IMAGE_NAME:$VERSION"
- $BUILDAH_COMMAND push --format=v2s2 "$IMAGE_NAME:$EXTRATAG"
- $BUILDAH_COMMAND push --format=v2s2 "$IMAGE:$VERSION"
- $BUILDAH_COMMAND push --format=v2s2 "$IMAGE:$EXTRATAG"
after_script:
- buildah logout --all

Expand Down
86 changes: 54 additions & 32 deletions doc/docker.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,58 @@
# Using Docker
# Using Containers

The following commands should work no matter if you use Docker or Podman. In general, Podman is recommended. All commands are "engine neutral" so you can use the container engine of your choice while still being able to copy/paste the commands below.

Let's start defining Podman as our engine:
```
ENGINE=podman
```

If you prefer to stick with Docker, use:
```
ENGINE=docker
```

## The easiest way

The easiest/faster option to run Polkadot in Docker is to use the latest release images. These are small images that use the latest official release of the Polkadot binary, pulled from our package repository.
The easiest/faster option to run Polkadot in Docker is to use the latest release images. These are small images that use the latest official release of the Polkadot binary, pulled from our Debian package.

**_Following examples are running on westend chain and without SSL. They can be used to quick start and learn how Polkadot needs to be configured. Please find out how to secure your node, if you want to operate it on the internet. Do not expose RPC and WS ports, if they are not correctly configured._**
**_The following examples are running on westend chain and without SSL. They can be used to quick start and learn how Polkadot needs to be configured. Please find out how to secure your node, if you want to operate it on the internet. Do not expose RPC and WS ports, if they are not correctly configured._**

Let's first check the version we have. The first time you run this command, the Polkadot docker image will be downloaded. This takes a bit of time and bandwidth, be patient:

```bash
docker run --rm -it parity/polkadot:latest --version
$ENGINE run --rm -it parity/polkadot:latest --version
```

You can also pass any argument/flag that Polkadot supports:

```bash
docker run --rm -it parity/polkadot:latest --chain westend --name "PolkaDocker"
$ENGINE run --rm -it parity/polkadot:latest --chain westend --name "PolkaDocker"
```

## Examples

Once you are done experimenting and picking the best node name :) you can start Polkadot as daemon, exposes the Polkadot ports and mount a volume that will keep your blockchain data locally. Make sure that you set the ownership of your local directory to the Polkadot user that is used by the container. Set user id 1000 and group id 1000, by running `chown 1000.1000 /my/local/folder -R` if you use a bind mount.

To start a Polkadot node on default rpc port 9933 and default p2p port 30333 use the following command. If you want to connect to rpc port 9933, then must add Polkadot startup parameter: `--rpc-external`.
Once you are done experimenting and picking the best node name :) you can start Polkadot as daemon, exposes the Polkadot ports and mount a volume that will keep your blockchain data locally. Make sure that you set the ownership of your local directory to the Polkadot user that is used by the container.

```bash
docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/polkadot parity/polkadot:latest --chain westend --rpc-external --rpc-cors all
```
Set user id 1000 and group id 1000, by running `chown 1000.1000 /my/local/folder -R` if you use a bind mount.

Additionally if you want to have custom node name you can add the `--name "YourName"` at the end
To start a Polkadot node on default rpc port 9933 and default p2p port 30333 use the following command. If you want to connect to rpc port 9933, then must add Polkadot startup parameter: `--rpc-external`.

```bash
docker run -d -p 30333:30333 -p 9933:9933 -v /my/local/folder:/polkadot parity/polkadot:latest --chain westend --rpc-external --rpc-cors all --name "PolkaDocker"
$ENGINE run -d -p 30333:30333 -p 9933:9933 \
-v /my/local/folder:/polkadot \
parity/polkadot:latest \
--chain westend --rpc-external --rpc-cors all \
--name "PolkaDocker
```

If you also want to expose the webservice port 9944 use the following command:

```bash
docker run -d -p 30333:30333 -p 9933:9933 -p 9944:9944 -v /my/local/folder:/polkadot parity/polkadot:latest --chain westend --ws-external --rpc-external --rpc-cors all --name "PolkaDocker"
$ENGINE run -d -p 30333:30333 -p 9933:9933 -p 9944:9944 \
-v /my/local/folder:/polkadot \
parity/polkadot:latest \
--chain westend --ws-external --rpc-external --rpc-cors all --name "PolkaDocker"
```

## Using Docker compose
Expand All @@ -55,17 +70,19 @@ services:
- 30333:30333 # p2p port
- 9933:9933 # rpc port
- 9944:9944 # ws port
- 9615:9615 # Prometheus port
volumes:
- /my/local/folder:/polkadot
command: [
"--name", "PolkaDocker",
"--ws-external",
"--rpc-external",
"--prometheus-external",
"--rpc-cors", "all"
]
```

With following docker-compose.yml you can set up a node and use polkadot-js-apps as the front end on port 80. After starting the node use a browser and enter your Docker host IP in the URL field: _<http://[YOUR_DOCKER_HOST_IP>_
With following `docker-compose.yml` you can set up a node and use polkadot-js-apps as the front end on port 80. After starting the node use a browser and enter your Docker host IP in the URL field: _<http://[YOUR_DOCKER_HOST_IP]>_

```bash
version: '2'
Expand All @@ -78,10 +95,12 @@ services:
- 30333:30333 # p2p port
- 9933:9933 # rpc port
- 9944:9944 # ws port
- 9615:9615 # Prometheus port
command: [
"--name", "PolkaDocker",
"--ws-external",
"--rpc-external",
"--prometheus-external",
"--rpc-cors", "all"
]

Expand All @@ -100,36 +119,39 @@ Chain syncing will utilize all available memory and CPU power your server has to

If running on a low resource VPS, use `--memory` and `--cpus` to limit the resources used. E.g. To allow a maximum of 512MB memory and 50% of 1 CPU, use `--cpus=".5" --memory="512m"`. Read more about limiting a container's resources [here](https://docs.docker.com/config/containers/resource_constraints).

Start a shell session with the daemon:

```bash
docker exec -it $(docker ps -q) bash;
```
## Build your own image

Check the current version:
There are 3 options to build a polkadot container image:
- using the builder image
- using the injected "Debian" image
- using the generic injected image

```bash
polkadot --version
```
### Builder image

## Build your own image
To get up and running with the smallest footprint on your system, you may use an existing Polkadot Container image.

To get up and running with the smallest footprint on your system, you may use the Polkadot Docker image.
You can build it yourself (it takes a while...) in the shell session of the daemon:
You may also build a polkadot container image yourself (it takes a while...) using the container specs `scripts/ci/dockerfiles/polkadot/polkadot_builder.Dockerfile`.

```bash
cd scripts/ci/dockerfiles/polkadot
./build.sh
```
### Debian injected

The Debian injected image is how the official polkadot container image is produced. It relies on the Debian package that is published upon each release. The Debian injected image is usually available a few minutes after a new release is published.
It has the benefit of relying on the GPG signatures embedded in the Debian package.

### Generic injected

For simple testing purposes, the easiest option for polkadot and also random binaries, is to use the `binary_injected.Dockerfile` container spec. This option is less secure since the injected binary is not checked at all but it has the benefit to be simple. This option requires to already have a valid `polkadot` binary, compiled for Linux.

This binary is then simply copied inside the `parity/base-bin` image.

## Reporting issues

If you run into issues with Polkadot when using docker, please run the following command
(replace the tag with the appropriate one if you do not use latest):

```bash
docker run --rm -it parity/polkadot:latest --version
$ENGINE run --rm -it parity/polkadot:latest --version
```

This will show you the Polkadot version as well as the git commit ref that was used to build your container.
Just paste that in the issue you create.
You can now paste the version information in a [new issue](https://github.com/paritytech/polkadot/issues/new/choose).
Loading