Files
shadowsocks-rust/.circleci/config.yml
2025-10-22 00:38:21 +00:00

240 lines
10 KiB
YAML

version: 2.1
orbs:
windows: circleci/windows@5.1.1
jobs:
build-linux:
docker:
- image: circleci/rust:stretch
environment:
OPENSSL_STATIC: "1"
OPENSSL_LIB_DIR: "/usr/lib/x86_64-linux-gnu/"
OPENSSL_INCLUDE_DIR: "/usr/include/x86_64-linux-gnu/"
RUSTFLAGS: "-Ctarget-feature=+aes,+ssse3"
steps:
- checkout
- run:
name: "APT Install Dependencies"
command: |
sudo apt-get update
sudo apt-get install -y build-essential
- run:
name: "Generate Cargo.lock"
command: |
rustc --version >rust-version
test -e Cargo.lock || cargo generate-lockfile
- restore_cache:
key: cargo-cache-{{ arch }}-{{ checksum "rust-version" }}-{{ checksum "Cargo.lock" }}
- run:
name: "Build Release"
command: BUILD_EXTRA_FEATURES="openssl-vendored local-redir" ./build-host-release
no_output_timeout: 1h
- save_cache:
paths:
- /usr/local/cargo/registry
- ./target
key: cargo-cache-{{ arch }}-{{ checksum "rust-version" }}-{{ checksum "Cargo.lock" }}
build-windows:
executor: windows/default
environment:
OPENSSL_STATIC: "1"
OPENSSL_DIR: "C:\\OpenSSL"
RUSTFLAGS: "-Ctarget-feature=+aes,+ssse3"
CARGO_NET_GIT_FETCH_WITH_CLI: "true"
steps:
- checkout
- run:
name: "Install Rust"
command: |
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri "https://win.rustup.rs/" -OutFile "C:\rustup-init.exe"
& C:\rustup-init.exe -y --default-toolchain "stable-x86_64-pc-windows-msvc" --no-modify-path --profile minimal
$env:Path += ";C:\Users\circleci\.cargo\bin"
rustc -Vv
cargo --version
rustc --version | Out-File -FilePath "rust-version"
if (!(Test-Path "Cargo.lock" -PathType Leaf)) {
cargo generate-lockfile
}
- run:
name: "Install OpenSSL"
command: |
$env:Path += ";C:\Users\circleci\.cargo\bin"
$TargetTriple = (rustc -Vv | Select-String -Pattern "host: (.*)" | foreach {$_.Matches.Value}).split()[-1]
if ($TargetTriple.StartsWith("x86_64-")) {
$OpenSSLBits = "64"
} else {
$OpenSSLBits = "32"
}
$OpenSSLVersion = "1_1_0L"
$OpenSSLFileName = "Win${OpenSSLBits}OpenSSL-${OpenSSLVersion}.exe"
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri "http://slproweb.com/download/${OpenSSLFileName}" -OutFile "${OpenSSLFileName}"
Write-Host "* Done downloading ${OpenSSLFileName}"
dir
Start-Process "${OpenSSLFileName}" -ArgumentList "/SILENT /VERYSILENT /SP- /SUPPRESSMSGBOXES /DIR=C:\OpenSSL" -Wait
Write-Host "* Done installing ${OpenSSLFileName}"
- restore_cache:
key: cargo-cache-{{ arch }}-{{ checksum "rust-version" }}-{{ checksum "Cargo.lock" }}
# - run: ./build-host-release
- run:
name: "Package Release"
command: |
$ProgressPreference = "SilentlyContinue"
$env:Path += ";C:\Users\circleci\.cargo\bin;."
$PackageReleasePath = "${PWD}\build\release"
Pushd target\release
$Version = (sslocal -V).split()[-1]
$TargetTriple = (rustc -Vv | Select-String -Pattern "host: (.*)" | foreach {$_.Matches.Value}).split()[-1]
$PackageName = "shadowsocks-v${Version}.${TargetTriple}.zip"
$PackagePath = "${PackageReleasePath}\${PackageName}"
Write-Host "${Version}"
Write-Host "${TargetTriple}"
Write-Host "${PackagePath}"
New-Item "${PackageReleasePath}" -ItemType Directory -ErrorAction SilentlyContinue
$CompressParam = @{
LiteralPath = "sslocal.exe", "ssserver.exe", "ssurl.exe", "ssmanager.exe"
DestinationPath = "${PackagePath}"
}
Compress-Archive @CompressParam
Popd
$PackageChecksumPath = "${PackagePath}.sha256"
$PackageHash = (Get-FileHash -Path "${PackagePath}" -Algorithm SHA256).Hash
"${PackageHash} ${PackageName}" | Out-File -FilePath "${PackageChecksumPath}"
- save_cache:
paths:
- C:\Users\circleci\.cargo\registry
- target
key: cargo-cache-{{ arch }}-{{ checksum "rust-version" }}-{{ checksum "Cargo.lock" }}
- store_artifacts:
path: build\\release
destination: releases
- persist_to_workspace:
root: build
paths:
- release
build-docker:
machine:
image: ubuntu-1604:201903-01
docker_layer_caching: true
steps:
- checkout
- run:
name: "APT Install Dependencies"
command: |
sudo apt-get update
sudo apt-get install curl
- run:
name: "Build docker images"
command: |
cd build
docker build -t shadowsocks-rust:x86_64-pc-windows-gnu -f Dockerfile.x86_64-pc-windows-gnu .
docker build -t shadowsocks-rust:x86_64-unknown-linux-musl -f Dockerfile.x86_64-unknown-linux-musl .
docker build -t shadowsocks-rust:x86_64-unknown-linux-gnu -f Dockerfile.x86_64-unknown-linux-gnu .
docker build -t shadowsocks-rust:arm-unknown-linux-gnueabihf -f Dockerfile.arm-unknown-linux-gnueabihf .
docker build -t shadowsocks-rust:arm-unknown-linux-musleabi -f Dockerfile.arm-unknown-linux-musleabi .
docker build -t shadowsocks-rust:aarch64-unknown-linux-gnu -f Dockerfile.aarch64-unknown-linux-gnu .
- run:
name: "Install Rust"
command: |
curl "https://sh.rustup.rs" -o "rust-init.sh"
chmod +x "rust-init.sh"
./rust-init.sh -y --default-toolchain stable --no-modify-path --profile minimal
export PATH="$HOME/.cargo/bin:$PATH"
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> $BASH_ENV
rustup --version
cargo --version
rustc --version
- restore_cache:
key: cargo-cache-{{ arch }}
- run: cargo install cross
- run:
name: "Build Releases"
command: |
cd build
./build-release
no_output_timeout: 2h
- save_cache:
paths:
- /usr/local/cargo/registry
- ./target
key: cargo-cache-{{ arch }}
- store_artifacts:
path: ./build/release
destination: releases
- persist_to_workspace:
root: build
paths:
- release
publish-github-releases:
docker:
- image: circleci/golang:1.17
steps:
- attach_workspace:
at: /tmp/workspace
- run:
name: "Publish Release on GitHub"
command: |
ls -alh /tmp/workspace/release
if [[ ! -z "${CIRCLE_TAG}" ]]; then
go get github.com/tcnksm/ghr
EXTRA_FLAGS="-replace"
if [[ "${CIRCLE_TAG}" == *"-alpha."* ]]; then
EXTRA_FLAGS="${EXTRA_FLAGS} -prerelease"
fi
ghr -t "${GITHUB_TOKEN}" \
-u "${CIRCLE_PROJECT_USERNAME}" -r "${CIRCLE_PROJECT_REPONAME}" \
-c "${CIRCLE_SHA1}" \
${EXTRA_FLAGS} \
"${CIRCLE_TAG}" /tmp/workspace/release
else
echo "Current build is not tagged."
fi
workflows:
version: 2
build-releases:
jobs:
- build-linux:
filters:
tags:
only: /^v\d+\.\d+\.\d+(-alpha\.\d+)?$/
- build-windows:
filters:
tags:
only: /^v\d+\.\d+\.\d+(-alpha\.\d+)?$/
- build-docker:
filters:
branches:
ignore: /.*/
tags:
only: /^v\d+\.\d+\.\d+(-alpha\.\d+)?$/
- publish-github-releases:
requires:
- build-windows
- build-docker
filters:
branches:
ignore: /.*/
tags:
only: /^v\d+\.\d+\.\d+(-alpha\.\d+)?$/