站長最近需要用到 Discord dispatch 因此使用 Docker 跑 Ubuntu 18.04 寫了以下的腳本
Ubuntu 18.04 與 Discord dispatch Dockerfile
FROM ubuntu:18.04 RUN apt-get install -y wget \ && rm -rf /var/lib/apt/lists/* \ && wget -O /bin/dispatch https://dl-dispatch.discordapp.net/download/linux \ && chmod +x /bin/dispatch
主要是下載 Discord dispatch 並且把它設定成可以直接呼叫的指令,不過使用後遇到以下錯誤
dispatch 指令錯誤
dispatch v1.0.0-rc3-d42fde1 thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:347:21 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
這時候在參數加上 RUST_BACKTRACE=1
看了一下噴出來的訊息
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:347:21 stack backtrace: 0: backtrace::backtrace::libunwind::trace at ./cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/libunwind.rs:88 1: backtrace::backtrace::trace_unsynchronized at ./cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/mod.rs:66 2: std::sys_common::backtrace::_print at src/libstd/sys_common/backtrace.rs:47 3: std::sys_common::backtrace::print at src/libstd/sys_common/backtrace.rs:36 4: std::panicking::default_hook::{{closure}} at src/libstd/panicking.rs:198 5: std::panicking::default_hook at src/libstd/panicking.rs:212 6: std::panicking::rust_panic_with_hook at src/libstd/panicking.rs:475 7: std::panicking::continue_panic_fmt at src/libstd/panicking.rs:382 8: rust_begin_unwind at src/libstd/panicking.rs:309 9: core::panicking::panic_fmt at src/libcore/panicking.rs:85 10: core::panicking::panic at src/libcore/panicking.rs:49 11: openssl::ssl::connector::ctx 12: openssl::ssl::connector::SslConnectorBuilder::new 13: native_tls::TlsConnector::builder 14: reqwest::async_impl::client::ClientBuilder::new 15: reqwest::client::ClientBuilder::new 16: dispatch::credentials::make_client 17: dispatch::credentials::create 18: dispatch_cli::cmd::login::exec 19: dispatch_cli::cmd::exec 20: dispatch::main 21: std::rt::lang_start::{{closure}} 22: std::rt::lang_start_internal::{{closure}} at src/libstd/rt.rs:49 23: std::panicking::try::do_call at src/libstd/panicking.rs:294 24: __rust_maybe_catch_panic at src/libpanic_unwind/lib.rs:85 25: std::panicking::try at src/libstd/panicking.rs:273 26: std::panic::catch_unwind at src/libstd/panic.rs:388 27: std::rt::lang_start_internal at src/libstd/rt.rs:48 28: main 29: __libc_start_main 30: _start note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
爬了一下文翻到了 issue 與 issue,簡單來說問題出在目前系統的 OpenSSL 版本是 1.1.1,沒辦法使用需要降版到 1.1.0,這時候我就去看了一下系統的 OpenSSL 版本
openssl version -a OpenSSL 1.1.1 11 Sep 2018 built on: Tue Nov 12 16:58:35 2019 UTC
看起來真的只能降版了,所以我就把原本的 Dockerfile 做一點更新讓它可以使用 1.1.0
編譯 OpenSSL 1.1.0
apt install -y build-essential checkinstall zlib1g-dev curl #安裝必要套件 curl https://www.openssl.org/source/openssl-1.1.0l.tar.gz -o openssl-1.1.0l.tar.gz #下載 openssl sha256sum openssl-1.1.0l.tar.gz | grep 74a2f756c64fd7386a29184dc0344f4831192d61dc2481a93a4c5dd727f41148 #檢查 checksum tar -xf openssl-1.1.0l.tar.gz #解壓縮 openssl ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib && \ make && \ make test && \ make install #編譯與跑測試 echo "/usr/local/ssl/lib" > openssl-${VERSION}.conf && \ ldconfig -v #設定索引路徑
以上對於 Dockerfile 的步驟做一點解釋
結論
此篇主要簡單介紹 OpenSSL 編譯與找出 Discord dispatch 的問題,如果只是需要使用 Discord dispatch 的朋友可以直接使用我的 docker hub 下載回去使用就可以了喔!
docker run -ti clarencetw/discord-dispatch:latest
將 dispatch 設定檔放入對應位置,記得修改 application_id
與 token
root:~# mkdir /root/.dispatch root:~# echo "{\"BotCredentials\":{\"application_id\":\"111111111111111111\",\"token\":\"111111111111111111\"}}" > /root/.dispatch/credentials.json
測試 dispatch login
root:~# dispatch login dispatch v1.0.0-rc3-d42fde1 [2020-00-00][00:00:00][INFO] Already logged in
如果有問題歡迎在下面留言!
參考資料
- https://discordapp.com/developers/docs/dispatch/branches-and-builds
- https://hub.docker.com/r/clarencetw/discord-dispatch
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!