Skip to content

Commit

Permalink
Merge pull request #9 from dimikot/grok/dimikot/publish-for-all-platf…
Browse files Browse the repository at this point in the history
…orms-to-main-fcde

Publish for all platforms
  • Loading branch information
dimikot authored Mar 2, 2024
2 parents 2546714 + cb523b5 commit 9927191
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 17 deletions.
32 changes: 26 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,17 @@ jobs:
docker compose up self-hosted-runner
env:
GH_REPOSITORY: ${{ github.repository }}
GH_LABELS: ci-storage-test
GH_LABELS: ${{ format('ci-storage-test-{0}-{1}', github.run_id, github.run_attempt) }}
GH_TOKEN: ${{ secrets.CI_PAT }}

# Test the job with "ci-storage-test" tag which is initially queued, but then
# is picked up by the self-hosted-runner container booted in the previous job.
# In the end, the test job sends SIGINT to the container entrypoint.sh PID, so
# the container (based on Dockerfile image) shuts down gracefully.
spawn-job-test:
runs-on: ["self-hosted", "ci-storage-test"]
runs-on:
- self-hosted
- ${{ format('ci-storage-test-{0}-{1}', github.run_id, github.run_attempt) }}
steps:
- uses: actions/checkout@v4
- name: Run test job inside the self-hosted runner
Expand All @@ -78,52 +80,70 @@ jobs:
- name: Kill self-hosted runner container
run: kill -SIGINT $(cat ~user/entrypoint.pid)

# Publishes host image to Docker Hub.
# Publishes "host" image to Docker Hub.
push-host:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
needs:
- ci-storage-tool-test
- build-and-boot-containers
- spawn-job-test
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/metadata-action@v5
id: meta
with:
images: dimikot/ci-storage-host
- uses: docker/login-action@v3
if: github.event_name != 'pull_request'
with:
username: dimikot
password: ${{ secrets.DOCKERHUB_PAT }}
- uses: docker/build-push-action@v5
with:
context: docker/host
platforms: linux/amd64,linux/arm64,linux/arm64/v8
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- uses: peter-evans/dockerhub-description@v3
with:
username: dimikot
password: ${{ secrets.DOCKERHUB_PAT }}
readme-filepath: docker/host/README.md
repository: dimikot/ci-storage-host

# Publishes self-hosted-runner image to Docker Hub.
# Publishes "self-hosted-runner" image to Docker Hub.
push-self-hosted-runner:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
needs:
- ci-storage-tool-test
- build-and-boot-containers
- spawn-job-test
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/metadata-action@v5
id: meta
with:
images: dimikot/ci-storage-self-hosted-runner
- uses: docker/login-action@v3
if: github.event_name != 'pull_request'
with:
username: dimikot
password: ${{ secrets.DOCKERHUB_PAT }}
- uses: docker/build-push-action@v5
with:
context: docker/self-hosted-runner
platforms: linux/amd64,linux/arm64,linux/arm64/v8
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- uses: peter-evans/dockerhub-description@v3
with:
username: dimikot
password: ${{ secrets.DOCKERHUB_PAT }}
readme-filepath: docker/self-hosted-runner/README.md
repository: dimikot/ci-storage-self-hosted-runner
2 changes: 2 additions & 0 deletions docker/host/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@ Build an image from this Dockerfile to launch a simple SSH server with rsync.

One "host" container may serve multiple GitHub repositories. Each of them will
have own directory in /home/user/ci-storage (managed by ci-storage tool).

See also https://github.com/dimikot/ci-storage
2 changes: 1 addition & 1 deletion docker/host/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#
set -u -e

if [[ "${CI_STORAGE_HOST_PUBLIC_KEY:=''}" == "" ]]; then
if [[ "${CI_STORAGE_HOST_PUBLIC_KEY:=}" == "" ]]; then
echo "CI_STORAGE_HOST_PUBLIC_KEY must be set to a valid SSH public key."
exit 1
fi
Expand Down
2 changes: 2 additions & 0 deletions docker/self-hosted-runner/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@ self-hosted runners as you want. An example scenario:
The container in this Dockerfile is serves only one particular GitHub repository
(controlled by GH_REPOSITORY environment variable at boot time). To serve
different repositories, boot different containers.

See also https://github.com/dimikot/ci-storage
22 changes: 12 additions & 10 deletions docker/self-hosted-runner/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,23 @@
#
set -u -e

if [[ "${GH_REPOSITORY:=''}" != */* ]]; then
if [[ "${GH_REPOSITORY:=}" != */* ]]; then
echo "GH_REPOSITORY must be set, and the format should be {owner}/{repo}.";
exit 1;
fi
if [[ "${GH_LABELS:=''}" == "" ]]; then
if [[ "${GH_LABELS:=}" == "" ]]; then
echo "GH_LABELS must be set.";
exit 1;
fi
if [[ "${GH_TOKEN:=''}" == "" ]]; then
if [[ "${GH_TOKEN:=}" == "" ]]; then
echo "GH_TOKEN must be set.";
exit 1;
fi
if [[ "${CI_STORAGE_HOST:=''}" != "" && ! "$CI_STORAGE_HOST" =~ ^([-.[:alnum:]]+@)?[-.[:alnum:]]+$ ]]; then
if [[ "${CI_STORAGE_HOST:=}" != "" && ! "$CI_STORAGE_HOST" =~ ^([-.[:alnum:]]+@)?[-.[:alnum:]]+$ ]]; then
echo "If CI_STORAGE_HOST is passed, it must be in form of {hostname} or {user}@{hostname}.";
exit 1;
fi
if [[ "${CI_STORAGE_HOST_PRIVATE_KEY:=''}" != "" && "$CI_STORAGE_HOST_PRIVATE_KEY" != *OPENSSH\ PRIVATE\ KEY* ]]; then
if [[ "${CI_STORAGE_HOST_PRIVATE_KEY:=}" != "" && "$CI_STORAGE_HOST_PRIVATE_KEY" != *OPENSSH\ PRIVATE\ KEY* ]]; then
echo "If CI_STORAGE_HOST_PRIVATE_KEY is passed, it must be an SSH private key.";
exit 1;
fi
Expand All @@ -60,11 +60,13 @@ if [[ "$CI_STORAGE_HOST" != "" ]]; then
ssh-keyscan -H "$CI_STORAGE_HOST" >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/known_hosts
mkdir -p "$local_dir"
ci-storage load \
--storage-host="$CI_STORAGE_HOST" \
--storage-dir="~/ci-storage/$GH_REPOSITORY" \
--slot-id="?" \
--local-dir="$local_dir"
if [[ "$CI_STORAGE_HOST_PRIVATE_KEY" != "" ]]; then
ci-storage load \
--storage-host="$CI_STORAGE_HOST" \
--storage-dir="~/ci-storage/$GH_REPOSITORY" \
--slot-id="?" \
--local-dir="$local_dir"
fi
fi

token=$(gh api -X POST --jq .token "repos/$GH_REPOSITORY/actions/runners/registration-token")
Expand Down

0 comments on commit 9927191

Please sign in to comment.