Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 21 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,24 @@ FROM docker.io/rust:bookworm
ARG NIGHTLY_VERSION_DATE
ENV NIGHTLY_VERSION=nightly-$NIGHTLY_VERSION_DATE

# Add the docker apt repo.
#
# See instructions in the docker docs:
# https://docs.docker.com/engine/install/ubuntu/#installation-methods
RUN apt install ca-certificates curl \
&& install -m 0755 -d /etc/apt/keyrings \
&& curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \
&& chmod a+r /etc/apt/keyrings/docker.asc \
&& echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list

# Note that we do not need docker engine as we mount a docker socket
# into the container
RUN apt update -yqq \
&& apt install -yqq --no-install-recommends \
build-essential cmake libssl-dev pkg-config git musl-tools jq xmlstarlet lcov protobuf-compiler libprotobuf-dev libprotoc-dev nats-server \
build-essential cmake libssl-dev pkg-config git musl-tools jq xmlstarlet lcov protobuf-compiler libprotobuf-dev libprotoc-dev \
docker-ce-cli docker-compose-plugin docker-buildx-plugin \
&& rustup toolchain add $NIGHTLY_VERSION --component rustfmt --component clippy --component llvm-tools-preview \
&& rustup toolchain add beta --component rustfmt --component clippy --component llvm-tools-preview \
&& rustup toolchain add stable --component rustfmt --component clippy --component llvm-tools-preview \
Expand All @@ -26,4 +41,9 @@ RUN apt update -yqq \
taplo-cli \
cargo-chef \
&& cargo cache -a

COPY cobertura_transform.xslt /opt/
COPY docker.json /etc/docker/daemon.json

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Famedly Rust Container

Container used for Rust CI jobs. Set up with all necessary packages
and configuration to build, test and publish our crates.

For full environment setup, some secrets need to be defined:

## Settings

| Variable | Example Value | Explanation |
|------------------------------|---------------------------------------------------|-------------|
| FRC_ADDITIONAL_PACKAGES | libxml2 dbus | Additional ubuntu packages to install before running the given command. |
| FRC_CRATES_REGISTRY | famedly | Additional registry to pull crates from. |
| FRC_CRATES_REGISTRY_INDEX | ssh://git@ssh.shipyard.rs/famedly/crate-index.git | The index URL of the registry; Can be omitted for `famedly`. |
| FRC_SSH_KEY | | The SSH key to use |
5 changes: 5 additions & 0 deletions docker.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"features": {
"buildkit": true
}
}
85 changes: 85 additions & 0 deletions entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/bin/sh

# Famedly Rust Container entrypoint.
#
# Configures the runtime to be used for various CI jobs.

echo "Preparing Rust build environment"


if [ -n "${FRC_SSH_KEY}" ]; then
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you clarify a bit why is this needed? Can we just mount ssh socket -v $SSH_AUTH_SOCK:/ssh.sock -e SSH_AUTH_SOCK=/ssh.sock?

Copy link
Contributor Author

@tlater-famedly tlater-famedly Apr 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was taken on from our existing scripts. I don't think GitHub sets up an ssh socket with a configured ssh key natively. The container is started before we start any jobs, so we can't set up a socket in the workflow before this is launched; if you know some way to do that with git workflows shout though!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

echo "Setting up SSH"

# Get an ssh agent running
USER="$(whoami)"
SSH_HOME="$(getent passwd "$USER" | cut -d: -f6)" # Is different from $HOME in docker containers, because github CI..
eval "$(ssh-agent)" # This exports the socket to `SSH_AUTH_SOCK`

# Import the SSH key from the secret.
#
# `echo` ensures there will be a newline at the end of the key.
echo "${FRC_SSH_KEY}" | ssh-add -vvv -

# Import host keys for GitHub and Gitlab
mkdir -p "$SSH_HOME/.ssh"
(
ssh-keyscan -H gitlab.com
ssh-keyscan -H github.com
) >> "$SSH_HOME/.ssh/known_hosts"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we move these to build stage? (into a RUN statement)

else
echo "SSH key not specified; SSH not available in this run"
fi


if [ -n "${FRC_ADDITIONAL_PACKAGES}" ]; then
echo "Installing additional packages: ${FRC_ADDITIONAL_PACKAGES}"
# shellcheck disable=SC2086
apt-get install -yqq --no-install-recommends ${FRC_ADDITIONAL_PACKAGES}
fi


echo "Configuring cargo"

CARGO_HOME="${HOME}/${CARGO_HOME}"
mkdir -p "${CARGO_HOME}"
cat << EOF > "${CARGO_HOME}/config.toml"
[term]
color = 'always'
[net]
git-fetch-with-cli = true
EOF
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we just COPY or ADD this to the container? does it need to happen at runtime?


# Don't write anything for crates-io, since it is baked-in and cargo
# special cases on it so configuring it works differently anyway.
if [ -n "${FRC_CRATES_REGISTRY}" ] && [ "${FRC_CRATES_REGISTRY}" != "crates-io" ]; then
case "${FRC_CRATES_REGISTRY}" in
"famedly")
FRC_CRATES_REGISTRY_INDEX="${FRC_CRATES_REGISTRY_INDEX:-ssh://git@ssh.shipyard.rs/famedly/crate-index.git}"
;;
"")
if [ -z "${FRC_CRATES_REGISTRY_INDEX}" ]; then
echo "Error: Crate registry index URL not known for ${FRC_CRATES_REGISTRY}. Configure it using \$FRC_CRATES_REGISTRY_INDEX." > /dev/stderr
exit 1
fi
;;
esac

cat << EOF >> "${CARGO_HOME}/config.toml"
[registries.${FRC_CRATES_REGISTRY}]
index = "${FRC_CRATES_REGISTRY_INDEX}"
EOF
fi


if [ -n "${GITHUB_ENV}" ]; then
echo "Exporting created environment variables"

(
echo "CARGO_HOME=${CARGO_HOME}"
echo "SSH_AUTH_SOCK=${SSH_AUTH_SOCK}"
) >> "$GITHUB_ENV"
fi
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how does this work? this script is run insede the container but GITHUB_ENV is host variable in ci



echo "Preparations finished"
"$@"