diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b2ec0f154f9..0a42062d3c62 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,66 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/)
and this project adheres to [Semantic Versioning](https://semver.org/).
+## [v0.39.0] - 2023-07-31
+
+### Added
+* feat: add a behaviour test for InvalidInput by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2644
+* feat(services/persy): add a basic persy service impl by @PsiACE in https://github.com/apache/incubator-opendal/pull/2648
+* feat(services/vercel_artifacts): Impl `stat` by @suyanhanx in https://github.com/apache/incubator-opendal/pull/2649
+* feat(test): add fuzz test for range_reader by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2609
+* feat(core/http_util): Remove sensitive header like Set-Cookie by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2664
+* feat: Add RetryInterceptor support for RetryLayer by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2666
+* feat: support kerberos for hdfs service by @zuston in https://github.com/apache/incubator-opendal/pull/2668
+* feat: support append for hdfs by @zuston in https://github.com/apache/incubator-opendal/pull/2671
+* feat(s3): Use us-east-1 while head bucket returns 403 without X-Amz-Bucket-Region by @john8628 in https://github.com/apache/incubator-opendal/pull/2677
+* feat(oay): Add webdav basic read impl by @Young-Flash in https://github.com/apache/incubator-opendal/pull/2658
+* feat(services/redis): enable TLS by @Stormshield-robinc in https://github.com/apache/incubator-opendal/pull/2670
+* feat(services/etcd): introduce new service backend etcd by @G-XD in https://github.com/apache/incubator-opendal/pull/2672
+* feat(service/obs):add multipart upload function support by @A-Stupid-Sun in https://github.com/apache/incubator-opendal/pull/2685
+* feat(services/s3): Add assume role support by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2687
+* feat(services/tikv): introduce new service backend tikv by @oowl in https://github.com/apache/incubator-opendal/pull/2565
+* feat(service/cos): add multipart upload function support by @ArmandoZ in https://github.com/apache/incubator-opendal/pull/2697
+* feat(oio): Add MultipartUploadWrite to easier the work for Writer by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2699
+* feat(test): add fuzz target for writer by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2706
+* feat: cos multipart uploads write by @parkma99 in https://github.com/apache/incubator-opendal/pull/2712
+* feat(layers): support await_tree instrument by @oowl in https://github.com/apache/incubator-opendal/pull/2623
+* feat(tests): Extract fuzz test of #2717 by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2720
+* feat: oss multipart uploads write by @parkma99 in https://github.com/apache/incubator-opendal/pull/2723
+* feat: add override_content_type by @G-XD in https://github.com/apache/incubator-opendal/pull/2734
+### Changed
+* refactor(services/redis): Polish features of redis by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2681
+* refactor(services/s3): Check header first for region detect by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2691
+* refactor(raw/oio): Reorganize to allow adding more features by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2698
+* refactor: Polish fuzz build time by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2721
+### Fixed
+* fix(services/cos): fix cos service comments by @A-Stupid-Sun in https://github.com/apache/incubator-opendal/pull/2656
+* fix(test): profile setting warning by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2657
+* fix(bindings/C): fix the memory found in valgrind. by @Ji-Xinyou in https://github.com/apache/incubator-opendal/pull/2673
+* fix: owncloud test sometimes fail by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2684
+* fix(services/obs): remove content-length check in backend by @suyanhanx in https://github.com/apache/incubator-opendal/pull/2686
+* fix: fix `HADOOP_CONF_DIR` setting in guidance document by @wcy-fdu in https://github.com/apache/incubator-opendal/pull/2713
+* fix: Seek before the start of file should be invalid by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2718
+* fix(layer/minitrace): fix doctest by @andylokandy in https://github.com/apache/incubator-opendal/pull/2728
+### Docs
+* docs: add instructions to fix wrong vote mail and uploads by @ClSlaid in https://github.com/apache/incubator-opendal/pull/2682
+* doc(services/tikv): add tikv service backend to readme by @oowl in https://github.com/apache/incubator-opendal/pull/2711
+* docs(bindings/java): improve safety doc for get_current_env by @tisonkun in https://github.com/apache/incubator-opendal/pull/2733
+### CI
+* ci(services/webdav): Setup integration test for owncloud by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2659
+* ci: Fix unexpected error in owncloud by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2663
+* ci: upgrade hawkeye action by @tisonkun in https://github.com/apache/incubator-opendal/pull/2665
+* ci: Make owncloud happy by reduce the concurrency by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2667
+* ci: Setup protoc in rust builder by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2674
+* ci: Fix Cargo.lock not updated by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2680
+* ci: Add services fuzz test for read/write/range_read by @dqhl76 in https://github.com/apache/incubator-opendal/pull/2710
+### Chore
+* chore: Update CODEOWNERS by @Xuanwo in https://github.com/apache/incubator-opendal/pull/2676
+* chore(bindings/python): upgrade pyo3 to 0.19 by @messense in https://github.com/apache/incubator-opendal/pull/2694
+* chore: upgrade quick-xml to 0.29 by @messense in https://github.com/apache/incubator-opendal/pull/2696
+* chore(download): update version 0.38.1 by @suyanhanx in https://github.com/apache/incubator-opendal/pull/2714
+* chore(service/minitrace): update to v0.5.0 by @andylokandy in https://github.com/apache/incubator-opendal/pull/2725
+
+
## [v0.38.1] - 2023-07-14
### Added
diff --git a/Cargo.lock b/Cargo.lock
index b5f47382600a..f9dfe0d0395e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3022,7 +3022,7 @@ dependencies = [
[[package]]
name = "oay"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"anyhow",
"axum",
@@ -3076,7 +3076,7 @@ dependencies = [
[[package]]
name = "object_store_opendal"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"async-trait",
"bytes",
@@ -3088,7 +3088,7 @@ dependencies = [
[[package]]
name = "oli"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"anyhow",
"assert_cmd",
@@ -3119,7 +3119,7 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
[[package]]
name = "opendal"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"anyhow",
"async-compat",
@@ -3190,7 +3190,7 @@ dependencies = [
[[package]]
name = "opendal-c"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"bytes",
"cbindgen",
@@ -3230,7 +3230,7 @@ dependencies = [
[[package]]
name = "opendal-java"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"anyhow",
"jni",
@@ -3250,7 +3250,7 @@ dependencies = [
[[package]]
name = "opendal-nodejs"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"futures",
"napi",
@@ -3261,7 +3261,7 @@ dependencies = [
[[package]]
name = "opendal-python"
-version = "0.38.1"
+version = "0.39.0"
dependencies = [
"futures",
"opendal",
diff --git a/Cargo.toml b/Cargo.toml
index e32b5d6c90be..f8b745bde611 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -48,7 +48,7 @@ homepage = "https://opendal.apache.org/"
license = "Apache-2.0"
repository = "https://github.com/apache/incubator-opendal"
rust-version = "1.65"
-version = "0.38.1"
+version = "0.39.0"
[workspace.dependencies]
-opendal = { version = "0.38", path = "core" }
+opendal = { version = "0.39", path = "core" }
diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml
index 80350d42245b..a852ef648a9d 100644
--- a/bindings/java/pom.xml
+++ b/bindings/java/pom.xml
@@ -32,7 +32,7 @@
org.apache.opendal
opendal-java
- 0.38.1
+ 0.39.0
https://opendal.apache.org
diff --git a/bindings/nodejs/npm/darwin-arm64/package.json b/bindings/nodejs/npm/darwin-arm64/package.json
index 1b066dd32150..a33c4b4e6916 100644
--- a/bindings/nodejs/npm/darwin-arm64/package.json
+++ b/bindings/nodejs/npm/darwin-arm64/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendal/lib-darwin-arm64",
"repository": "git@github.com/apache/incubator-opendal.git",
- "version": "0.38.1",
+ "version": "0.39.0",
"os": [
"darwin"
],
diff --git a/bindings/nodejs/npm/darwin-x64/package.json b/bindings/nodejs/npm/darwin-x64/package.json
index c79deb595ca2..eb4d931dbe1c 100644
--- a/bindings/nodejs/npm/darwin-x64/package.json
+++ b/bindings/nodejs/npm/darwin-x64/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendal/lib-darwin-x64",
"repository": "git@github.com/apache/incubator-opendal.git",
- "version": "0.38.1",
+ "version": "0.39.0",
"os": [
"darwin"
],
diff --git a/bindings/nodejs/npm/linux-x64-gnu/package.json b/bindings/nodejs/npm/linux-x64-gnu/package.json
index ac0184a5b931..8dfd59b3631e 100644
--- a/bindings/nodejs/npm/linux-x64-gnu/package.json
+++ b/bindings/nodejs/npm/linux-x64-gnu/package.json
@@ -1,6 +1,6 @@
{
"name": "@opendal/lib-linux-x64-gnu",
- "version": "0.38.1",
+ "version": "0.39.0",
"repository": "git@github.com/apache/incubator-opendal.git",
"os": [
"linux"
diff --git a/bindings/nodejs/npm/win32-x64-msvc/package.json b/bindings/nodejs/npm/win32-x64-msvc/package.json
index efb0072db1b2..f6b41dfd2179 100644
--- a/bindings/nodejs/npm/win32-x64-msvc/package.json
+++ b/bindings/nodejs/npm/win32-x64-msvc/package.json
@@ -1,6 +1,6 @@
{
"name": "@opendal/lib-win32-x64-msvc",
- "version": "0.38.1",
+ "version": "0.39.0",
"repository": "git@github.com/apache/incubator-opendal.git",
"os": [
"win32"
diff --git a/bindings/nodejs/package.json b/bindings/nodejs/package.json
index 09c852fb5459..2277ebdea599 100644
--- a/bindings/nodejs/package.json
+++ b/bindings/nodejs/package.json
@@ -1,7 +1,7 @@
{
"name": "opendal",
"author": "OpenDAL Contributors ",
- "version": "0.38.1",
+ "version": "0.39.0",
"license": "Apache-2.0",
"main": "index.js",
"types": "index.d.ts",
diff --git a/core/src/docs/upgrade.md b/core/src/docs/upgrade.md
index 1f98e156c93d..c59c11004fe4 100644
--- a/core/src/docs/upgrade.md
+++ b/core/src/docs/upgrade.md
@@ -1,3 +1,23 @@
+# Upgrade to v0.39
+
+## Public API
+
+### Service S3 Role Arn Behavior
+
+In PR #2687, OpenDAL changed the behavior when `role_arn` has been specified.
+
+OpenDAL used to override role_arn simply. But since this version, OpenDAL will make sure to use assume_role with specified `role_arn` and `external_id` (if supplied).
+
+### RetryLayer supports RetryInterceptor
+
+In PR #2666, `RetryLayer` supports `RetryInterceptor`. To implement this change, `RetryLayer` changed it's in-memory layout by adding a new generic parameter `I` to `RetryLayer`.
+
+Users who stores `RetryLayer` in struct or enum will need to change the type if they don't want to use default behavior.
+
+## Raw API
+
+In PR #2698, OpenDAL re-org the internal structure of `opendal::raw::oio` and changed some APIs name.
+
# Upgrade to v0.38
There are no public API changes.