Rustのdockerbuildでopenssl関係でエラーが出て4時間無駄にした話

ハマった、、4時間ぐらい無駄にしたのでメモ

rustのアプリケーションをDockerビルドしていたら、cargo buildで「error: failed to run custom build command for openssl v0.9.24」とエラーが表示されてビルドできなかった、

tl;dr

slack-hookクレートの依存ライブラリに古いreqwestが含まれるせいだった

[dependencies]
scraper = "0.11.0"
reqwest = "0.9.22"
# slack-hook = "0.7"   
url = "2.1.1"

もろもろ

rust:1.38のDockerイメージを使って cargo buildした場合こんなエラーが出た

   Compiling libflate v0.1.27
   Compiling flate2 v1.0.12
   Compiling url v1.7.2
   Compiling url v2.1.1
error: failed to run custom build command for `openssl v0.9.24`

Caused by:
  process didn't exit successfully: `/target/release/build/openssl-c2f879b18e9e24ad/build-script-build` (exit code: 101)
--- stderr
thread 'main' panicked at 'Unable to detect OpenSSL version', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.9.24/build.rs:16:14
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

warning: build failed, waiting for other jobs to finish...
error: build failed

hyperの依存関係にopensslが含まれているが、見当たらないということらしく、解決策をいろいろ漁るも全く効果なし

依存関係ちゃんとみたいから cargo-tree入れて依存関係をみてみる

$ cargo install cargo-tree
$ cargo tree
├── reqwest v0.10.3
│   ├── hyper-tls v0.4.1
│   │   ├── bytes v0.5.4 (*)
│   │   ├── hyper v0.13.2 (*)
│   │   ├── native-tls v0.2.3
│   │   │   ├── log v0.4.8 (*)
│   │   │   ├── openssl v0.10.28
│   │   │   │   ├── bitflags v1.2.1
│   │   │   │   ├── cfg-if v0.1.10 (*)
│   │   │   │   ├── foreign-types v0.3.2 (*)
│   │   │   │   ├── lazy_static v1.4.0 (*)
│   │   │   │   ├── libc v0.2.67 (*)
│   │   │   │   └── openssl-sys v0.9.54 (*)
│   │   │   ├── openssl-probe v0.1.2
│   │   │   └── openssl-sys v0.9.54 (*)
├── slack-hook v0.7.0
│   ├(省略)
│   ├── reqwest v0.7.3
(省略)

slack-hookクレートもrewestに依存してるやん!!しかもバージョンがv0.7.3と古い!!!

slack-hookクレートはslackのwebhookを簡単にしてくれるライブラリなので入れたのだが、、今回はこれを使うことで逆に時間を無駄にしてしまった。。。slack-hookクレートは使わないことにして、webhookを叩く処理はおとなしく自前で書いた

fn send_slack() {
    let url = std::env::var("SLACK_WEBHOOK_URL").expect("CAN'T GET `SLACK_WEBHOOK_URL` ENV");

    let mut map = HashMap::new();
    map.insert("text", format!("HOGEHOGE"));

    let mut response = reqwest::Client::new()
        .post(&url)
        .json(&map)
        .send();
}
tech  Rust 

See also