Skip to content

CE 8.0 Milestone 03. #1

CE 8.0 Milestone 03.

CE 8.0 Milestone 03. #1

name: Build Redis CE MacOS Binary Distributions
on:
push:
branches: [ main ]
paths:
- '.github/workflows/build-binary-dists.yml'
- 'configs/**'
- 'scripts/**'
pull_request_target:
branches: [ main ]
types: [ labeled ]
paths:
- '.github/workflows/build-binary-dists.yml'
- 'configs/**'
- 'scripts/**'
env:
REDIS_VERSION: "8.0-m03"
permissions:
id-token: write
contents: read
jobs:
build:
if: ${{ (github.event.label.name == 'build-binary-dists') || (github.event_name == 'push' && github.ref == 'refs/heads/main') }}
name: Build Redis CE MacOS Binary Distributions
strategy:
matrix:
os_version: # See: https://github.com/actions/runner-images/blob/main/README.md#available-images
- macos-13 # macOS 13 x86_64
- macos-13-xlarge # macOS 13 arm64
runs-on: ${{ matrix.os_version }}
steps:
- uses: actions/checkout@v4
- name: Install build dependencies
run: |
export HOMEBREW_NO_AUTO_UPDATE=1
brew update
brew install coreutils
brew install make
brew install openssl
brew install llvm@18
brew install cmake
brew install gnu-sed
brew install make
brew install automake
brew install libtool
RUST_INSTALLER=rust-1.80.1-$(if [ "$(uname -m)" = "arm64" ]; then echo "aarch64"; else echo "x86_64"; fi)-apple-darwin
echo "Downloading and installing Rust standalone installer: ${RUST_INSTALLER}"
wget --quiet -O ${RUST_INSTALLER}.tar.xz https://static.rust-lang.org/dist/${RUST_INSTALLER}.tar.xz
tar -xf ${RUST_INSTALLER}.tar.xz
(cd ${RUST_INSTALLER} && sudo ./install.sh)
rm -rf ${RUST_INSTALLER}
- name: Build Redis CE
id: build
run: |
export HOMEBREW_PREFIX="$(brew --prefix)"
export BUILD_WITH_MODULES=yes
export BUILD_TLS=yes
export DISABLE_WERRORS=yes
PATH="$HOMEBREW_PREFIX/opt/libtool/libexec/gnubin:$HOMEBREW_PREFIX/opt/llvm@18/bin:$HOMEBREW_PREFIX/opt/make/libexec/gnubin:$HOMEBREW_PREFIX/opt/gnu-sed/libexec/gnubin:$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH" # Override macOS defaults.
export LDFLAGS="-L$HOMEBREW_PREFIX/opt/llvm@18/lib"
export CPPFLAGS="-I$HOMEBREW_PREFIX/opt/llvm@18/include"
curl -L "https://github.com/redis/redis/archive/refs/tags/${{ vars.BINARY_VERSION_TO_BUILD }}.tar.gz" -o redis.tar.gz
tar xzf redis.tar.gz
mkdir -p build_dir/etc
make -C redis-${{ vars.BINARY_VERSION_TO_BUILD }} -j "$(nproc)" all OS=macos
make -C redis-${{ vars.BINARY_VERSION_TO_BUILD }} install PREFIX=$(pwd)/build_dir OS=macos
cp ./configs/redis.conf build_dir/etc/redis.conf
(cd build_dir && zip -r ../redis-ce-${{ vars.BINARY_VERSION_TO_BUILD }}-$(uname -m).zip .)
echo "UNSIGNED_REDIS_BINARY=unsigned-redis-ce-${{ vars.BINARY_VERSION_TO_BUILD }}-$(uname -m).zip" >> $GITHUB_OUTPUT
- name: Upload Redis CE Binary Distribution
uses: actions/upload-artifact@v4
with:
path: ./${{ steps.build.outputs.UNSIGNED_REDIS_BINARY }}
name: ${{ steps.build.outputs.UNSIGNED_REDIS_BINARY }}
- name: Setup Keychain and Certificate
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
# Decode and save certificate
echo "${{ secrets.MACOS_CERTIFICATE }}" | base64 --decode > certificate.p12
# Create and configure keychain
security create-keychain -p "${{ secrets.MACOS_KEYCHAIN_PASSWORD }}" build.keychain
security unlock-keychain -p "${{ secrets.MACOS_KEYCHAIN_PASSWORD }}" build.keychain
security set-keychain-settings -t 3600 -l build.keychain
# Add to search list and set as default
security list-keychains -d user -s build.keychain login.keychain
security default-keychain -s build.keychain
# Import and trust certificate
security import certificate.p12 -k build.keychain -P "${{ secrets.MACOS_CERTIFICATE_PASSWORD }}" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "${{ secrets.MACOS_KEYCHAIN_PASSWORD }}" build.keychain
# Debug certificate presence
security find-identity -v -p codesigning build.keychain
- name: Sign Binaries
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
id: sign
run: |
# Get identity from specific keychain
CODESIGN_IDENTITY=$(security find-identity -v -p codesigning build.keychain | grep -o '[0-9A-F]\{40\}' | head -n 1)
echo "Using identity: ${CODESIGN_IDENTITY}"
# Check if entitlements file exists
if [ ! -f configs/entitlements.xml ]; then
echo "Entitlements file not found!"
exit 1
fi
# Sign binaries with explicit keychain
for i in $(ls build_dir/bin); do
/usr/bin/codesign --keychain build.keychain --options=runtime --timestamp -v --sign "${CODESIGN_IDENTITY}" --entitlements configs/entitlements.xml -f build_dir/bin/$i
done
# Sign libraries with explicit keychain
for i in $(ls build_dir/lib/redis/modules); do
/usr/bin/codesign --keychain build.keychain --options=runtime --timestamp -v --sign "${CODESIGN_IDENTITY}" --entitlements configs/entitlements.xml -f build_dir/lib/redis/modules/$i
done
# Create distribution archive
(cd build_dir && zip -r ../redis-ce-${{ vars.BINARY_VERSION_TO_BUILD }}-$(uname -m).zip .)
echo "REDIS_BINARY=redis-ce-${{ vars.BINARY_VERSION_TO_BUILD }}-$(uname -m).zip" >> $GITHUB_OUTPUT
- name: Notarize Redis CE Binary Distribution
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
sh scripts/notarize.sh ${{ steps.sign.outputs.REDIS_BINARY }} com.redis.redis ${{ secrets.MAC_NOTARIZE_USERNAME }} ${{ secrets.MAC_NOTARIZE_PASSWORD }} ${{ secrets.MAC_NOTARIZE_TEAM_ID }}
- uses: aws-actions/configure-aws-credentials@v4
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
with:
aws-region: ${{ secrets.S3_REGION }}
role-to-assume: ${{ secrets.S3_IAM_ARN }}
- name: Upload Redis CE Binary Distribution to S3
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
aws s3 cp ${{ steps.sign.outputs.REDIS_BINARY }} s3://${{ secrets.S3_BUCKET }}/homebrew/ --acl public-read