-
Notifications
You must be signed in to change notification settings - Fork 2
210 lines (182 loc) · 7.68 KB
/
ci.yml
File metadata and controls
210 lines (182 loc) · 7.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
name: Build and Release
on:
push:
branches:
- main
tags:
- "v*"
jobs:
build:
name: Build and Release Rust Binary
runs-on: ${{ matrix.os }}
permissions:
contents: write
packages: write
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
include:
- os: macos-latest
target_x86: x86_64-apple-darwin
target_arm: aarch64-apple-darwin
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 5
- name: Install system dependencies on Ubuntu
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y clang libclang-dev llvm-dev
- name: Verify Ubuntu dependencies
if: matrix.os == 'ubuntu-latest'
run: |
echo "Clang version:"
clang --version
echo "libclang location:"
find /usr -name "libclang.so*" 2>/dev/null | head -3
echo "LLVM config:"
llvm-config --version 2>/dev/null || echo "llvm-config not in PATH"
- name: Install dependencies on macOS
if: matrix.os == 'macos-latest'
run: |
which brew || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install required dependencies for rdkafka with system librdkafka
brew install openssl librdkafka pkg-config zstd lz4 zlib
# Set environment variables for OpenSSL and librdkafka
export OPENSSL_DIR=$(brew --prefix openssl@3)
export PKG_CONFIG_PATH="$OPENSSL_DIR/lib/pkgconfig:$(brew --prefix librdkafka)/lib/pkgconfig:$(brew --prefix zstd)/lib/pkgconfig:$(brew --prefix lz4)/lib/pkgconfig"
# Set environment variables to use system librdkafka
export LDFLAGS="-L$(brew --prefix librdkafka)/lib -L$(brew --prefix zstd)/lib -L$(brew --prefix lz4)/lib -L$OPENSSL_DIR/lib"
export CPPFLAGS="-I$(brew --prefix librdkafka)/include -I$(brew --prefix zstd)/include -I$(brew --prefix lz4)/include -I$OPENSSL_DIR/include"
# Add to GitHub environment
echo "OPENSSL_DIR=$OPENSSL_DIR" >> $GITHUB_ENV
echo "PKG_CONFIG_PATH=$PKG_CONFIG_PATH" >> $GITHUB_ENV
echo "LDFLAGS=$LDFLAGS" >> $GITHUB_ENV
echo "CPPFLAGS=$CPPFLAGS" >> $GITHUB_ENV
- name: Verify macOS dependencies
if: matrix.os == 'macos-latest'
run: |
echo "OpenSSL location:"
brew --prefix openssl@3
echo "librdkafka location:"
brew --prefix librdkafka
echo "PKG_CONFIG_PATH:"
echo $PKG_CONFIG_PATH
echo "LDFLAGS:"
echo $LDFLAGS
echo "CPPFLAGS:"
echo $CPPFLAGS
echo "pkg-config test for librdkafka:"
pkg-config --exists rdkafka && echo "rdkafka found" || echo "rdkafka not found"
echo "pkg-config version for librdkafka:"
pkg-config --modversion rdkafka || echo "rdkafka version not found"
echo "Brew packages installed:"
brew list openssl librdkafka pkg-config zstd lz4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target || matrix.target_x86 }}
- name: Add macOS universal binary targets
if: matrix.os == 'macos-latest'
run: |
rustup target add x86_64-apple-darwin aarch64-apple-darwin
- name: Add Linux and Windows targets
if: matrix.os != 'macos-latest'
run: rustup target add ${{ matrix.target }}
- name: Build with Cargo
env:
OPENSSL_DIR: ${{ env.OPENSSL_DIR }}
PKG_CONFIG_PATH: ${{ env.PKG_CONFIG_PATH }}
LDFLAGS: ${{ env.LDFLAGS }}
CPPFLAGS: ${{ env.CPPFLAGS }}
run: |
if [[ "${{ matrix.os }}" == "macos-latest" ]]; then
# Set additional environment variables for macOS build
export MACOSX_DEPLOYMENT_TARGET=10.15
export CC=clang
export CXX=clang++
# Debug: Print environment variables
echo "OPENSSL_DIR: $OPENSSL_DIR"
echo "PKG_CONFIG_PATH: $PKG_CONFIG_PATH"
echo "LDFLAGS: $LDFLAGS"
echo "CPPFLAGS: $CPPFLAGS"
# Build for x86_64 only for now to test the fix
echo "Building for x86_64 macOS target..."
cargo build --release --target ${{ matrix.target_x86 }}
# Copy the x86_64 binary as our macOS binary
cp ./target/${{ matrix.target_x86 }}/release/kfcli ./target/release/macos_binary
else
cargo build --release --target ${{ matrix.target }}
fi
shell: bash
- name: Set prerelease flag
id: prerelease_check
run: |
if [[ "${GITHUB_REF#refs/tags/}" == *"alpha"* || "${GITHUB_REF#refs/tags/}" == *"beta"* ]]; then
echo "prerelease=true" >> $GITHUB_ENV
else
echo "prerelease=false" >> $GITHUB_ENV
fi
- name: Check if release exists
id: check_release
run: |
if gh release view "${GITHUB_REF_NAME}" &>/dev/null; then
echo "release_exists=true" >> $GITHUB_ENV
else
echo "release_exists=false" >> $GITHUB_ENV
fi
env:
GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
- name: Create a GitHub Release
if: env.release_exists == 'false'
id: create_release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
body: |
This release includes the latest Rust binary for version ${{ github.ref_name }}.
draft: false
prerelease: ${{ env.prerelease }}
env:
GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
- name: Check if macOS binary exists
if: matrix.os == 'macos-latest'
run: ls -la ./target/release/macos_binary
- name: Upload macOS Binary Release Asset
if: matrix.os == 'macos-latest'
run: |
cp ./target/release/macos_binary ./kfcli-macos
gh release upload ${{ github.ref_name }} ./kfcli-macos --clobber
env:
GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
- name: Upload Linux Release Asset
if: matrix.os == 'ubuntu-latest'
run: |
cp ./target/${{ matrix.target }}/release/kfcli ./kfcli-linux
gh release upload ${{ github.ref_name }} ./kfcli-linux --clobber
env:
GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
- name: Calculate SHA256 for macOS release asset
if: matrix.os == 'macos-latest'
id: calculate_sha
run: |
SHA256=$(shasum -a 256 ./target/release/macos_binary | awk '{print $1}')
echo "sha256=$SHA256" >> $GITHUB_ENV
- name: Trigger Homebrew Formula Update via cURL
if: matrix.os == 'macos-latest'
run: |
URL="https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/kfcli-macos"
JSON_PAYLOAD=$(jq -n --arg url "$URL" '{"event_type": "update-kcli-formula", "client_payload": {"tag": "${{ github.ref_name }}", "download_url": $url, "sha": "${{ env.sha256 }}"}}')
echo "Payload: $JSON_PAYLOAD"
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.PAT_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/keaz/homebrew-homebrew/dispatches \
-d "$JSON_PAYLOAD"