Skip to content

Commit

Permalink
Fix CI issues (#1458)
Browse files Browse the repository at this point in the history
* debug output

* test

* publish package before running the test harness

* remove 'with' clause in workflow

* publish package without script

* fix typo

* request funds and add dbg statement

* remove faucet call

* debug error

* add output that could not be parsed to error message

* comment out debug log in publishing script

* make sure package id env is set

* update publish package script handling in tests and grpc to follow update

* fix clippy issues

* fix dependencies for doc test

* fix clippy issues

* fix clippy issues

* fix clippy issues

* fix clippy issues

* fix examples from readme

* add action auth token to release check and check response status

* update action token to execution step scoped variant

* add check for parsed download url

* set IOTA binary version to fixed urls

- avoid CI breaking on releases, where binariese have not yet been published

* bump iota dependencies to `v0.7.3-rc`

---------

Co-authored-by: Sebastian Wolfram <[email protected]>
  • Loading branch information
UMR1352 and wulfraem authored Nov 29, 2024
1 parent cbaf07b commit 34c200c
Show file tree
Hide file tree
Showing 33 changed files with 109 additions and 103 deletions.
20 changes: 16 additions & 4 deletions .github/actions/iota-rebase-sandbox/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,17 @@ runs:
PLATFORM="${{ inputs.platform }}"
echo "Looking for platform: $PLATFORM"
# Get download URL
DOWNLOAD_URL=$(curl "https://api.github.com/repos/iotaledger/iota/releases/latest" | \
jq -r --arg p "$PLATFORM" '.assets[] | select(.name | contains($p)) | .browser_download_url')
# pinned releases from:
# url = https://api.github.com/repos/iotaledger/iota/releases/latest
# releases might be visible before all binaries are available, so refer to fixed binaries here
if [ "$PLATFORM" = "linux" ]; then
DOWNLOAD_URL="https://github.com/iotaledger/iota/releases/download/v0.7.3-rc/iota-v0.7.3-rc-linux-x86_64.tgz"
elif [ "$PLATFORM" = "macos" ]; then
DOWNLOAD_URL="https://github.com/iotaledger/iota/releases/download/v0.7.3-rc/iota-v0.7.3-rc-macos-arm64.tgz"
else
echo "not binaries for platform: $PLATFORM"
exit 1
fi
# Download and extract
echo "Downloading from: $DOWNLOAD_URL"
Expand All @@ -38,4 +46,8 @@ runs:
- name: Start the Network
shell: bash
working-directory: iota
run: iota start --with-faucet --force-regenesis &
run: |
# Clear previous configuration
rm -rf ~/.iota || true
# Start the network
iota start --with-faucet &
9 changes: 9 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,15 @@ jobs:
with:
platform: ${{ matrix.os == 'ubuntu-24.04' && 'linux' || 'macos' }}

- name: publish IotaIdentity package
if: matrix.os != 'windows-latest'
# publish the package and set the IOTA_IDENTITY_PKG_ID env variable
run: |
json_output=$(iota client publish --skip-dependency-verification --with-unpublished-dependencies --json --gas-budget 500000000 .)
package_id=$(echo $json_output | jq --raw-output '.objectChanges[] | select(.type | contains("published")) | .packageId')
echo "IOTA_IDENTITY_PKG_ID=$package_id" >> "$GITHUB_ENV"
working-directory: ./identity_iota_core/packages/iota_identity

- name: Run tests excluding `custom_time` feature
if: matrix.os != 'windows-latest'
run: cargo test --workspace --release
Expand Down
21 changes: 7 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Test this example using https://github.com/anko/txm: `txm README.md`
!test program
cd ../..
mkdir tmp
cat | sed -e 's#identity_iota = { git = "[^"]*"#identity_iota = { path = "../identity_iota"#' > tmp/Cargo.toml
cat | sed -e 's#identity_iota = { git = "[^"]*", tag = "[^"]*"#identity_iota = { path = "../identity_iota"#' > tmp/Cargo.toml
echo '[workspace]' >>tmp/Cargo.toml
-->
<!-- !test check Cargo Example -->
Expand All @@ -92,11 +92,11 @@ version = "1.0.0"
edition = "2021"

[dependencies]
identity_iota = { git = "https://github.com/iotaledger/identity.rs.git", tag = "v1.6.0-alpha", features = ["memstore"] }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.0-alpha" }
tokio = { version = "1", features = ["full"] }
anyhow = "1.0.62"
identity_iota = { git = "https://github.com/iotaledger/identity.rs.git", tag = "v1.6.0-alpha", features = ["memstore"] }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.3-rc" }
rand = "0.8.5"
tokio = { version = "1", features = ["full"] }
```

_main._<span></span>_rs_
Expand All @@ -113,7 +113,6 @@ timeout 360 cargo build || (echo "Process timed out after 360 seconds" && exit 1
-->
<!-- !test check Rust Example -->


```rust,no_run
use anyhow::Context;
use identity_iota::iota::IotaDocument;
Expand All @@ -134,18 +133,12 @@ use identity_iota::verification::MethodScope;
use iota_sdk::IotaClientBuilder;
use tokio::io::AsyncReadExt;
// The endpoint of the IOTA node to use.
static API_ENDPOINT: &str = "http://localhost";
// Test budget for transactions.
const TEST_GAS_BUDGET: u64 = 50_000_000;
/// Demonstrates how to create a DID Document and publish it in a new identity.
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create a new client to interact with the IOTA ledger.
let iota_client = IotaClientBuilder::default()
.build(API_ENDPOINT)
.build_localnet()
.await
.map_err(|err| anyhow::anyhow!(format!("failed to connect to network; {}", err)))?;
Expand All @@ -170,12 +163,12 @@ async fn main() -> anyhow::Result<()> {
let identity_client = IdentityClient::new(read_only_client, signer).await?;
println!("Your wallet address is: {}", sender_address);
println!("Please request funds from http://localhost/faucet/, wait for a couple of seconds and then press Enter.");
println!("Please request funds from http://127.0.0.1:9123/gas, wait for a couple of seconds and then press Enter.");
tokio::io::stdin().read_u8().await?;
// Create a new DID document with a placeholder DID.
let mut unpublished: IotaDocument = IotaDocument::new(identity_client.network());
let verification_method_fragment = unpublished
unpublished
.generate_method(
&storage,
JwkMemStore::ED25519_KEY_TYPE,
Expand Down
2 changes: 1 addition & 1 deletion bindings/grpc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ identity_iota = { path = "../../identity_iota", features = ["resolver", "sd-jwt"
identity_jose = { path = "../../identity_jose" }
identity_storage = { path = "../../identity_storage", features = ["memstore"] }
identity_stronghold = { path = "../../identity_stronghold", features = ["send-sync-storage"] }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", rev = "39c83ddcf07894cdee2abd146381d8704205e6e9" }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.3-rc" }
iota-sdk-legacy = { package = "iota-sdk", version = "1.1.2", features = ["stronghold"] }
prost = "0.13"
rand = "0.8.5"
Expand Down
18 changes: 6 additions & 12 deletions bindings/grpc/tests/api/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ use serde_json::Value;
use std::io::Write;
use std::net::SocketAddr;
use std::path::PathBuf;
use std::str::FromStr;

use tokio::net::TcpListener;
use tokio::process::Command;
Expand Down Expand Up @@ -375,20 +376,13 @@ async fn publish_package(active_address: IotaAddress) -> anyhow::Result<ObjectID
);
}

let publish_result = {
let output_str = std::str::from_utf8(&output.stdout).unwrap();
let start_of_json = output_str.find('{').ok_or(anyhow!("No json in output"))?;
serde_json::from_str::<Value>(output_str[start_of_json..].trim())?
let package_id: ObjectID = {
let output_str = std::str::from_utf8(&output.stdout).unwrap().trim();
ObjectID::from_str(output_str).context(format!(
"failed to find IDENTITY_IOTA_PKG_ID in response from: {output_str}"
))?
};

let package_id = publish_result
.path("$.objectChanges[?(@.type == 'published')].packageId")
.map_err(|e| anyhow!("Failed to parse JSONPath: {e}"))
.and_then(|value| Ok(serde_json::from_value::<Vec<ObjectID>>(value)?))?
.first()
.copied()
.ok_or_else(|| anyhow!("Failed to parse package ID after publishing"))?;

// Persist package ID in order to avoid publishing the package for every test.
let package_id_str = package_id.to_string();
std::env::set_var("IDENTITY_IOTA_PKG_ID", package_id_str.as_str());
Expand Down
4 changes: 2 additions & 2 deletions examples/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ anyhow = "1.0.62"
identity_eddsa_verifier = { path = "../identity_eddsa_verifier", default-features = false, features = ["ed25519"] }
identity_storage = { path = "../identity_storage" }
identity_stronghold = { path = "../identity_stronghold", default-features = false, features = ["send-sync-storage"] }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", rev = "39c83ddcf07894cdee2abd146381d8704205e6e9" }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.3-rc" }
iota-sdk-legacy = { package = "iota-sdk", version = "1.0", default-features = false, features = ["tls", "client", "stronghold"] }
json-proof-token.workspace = true
rand = "0.8.5"
sd-jwt-payload = { version = "0.2.1", default-features = false, features = ["sha"] }
secret-storage = { git = "https://github.com/iotaledger/secret-storage.git", tag = "v0.1.0" }
serde_json = { version = "1.0", default-features = false }
tokio = { version = "1.29", default-features = false, features = ["rt"] }
tokio = { version = "1.29", default-features = false, features = ["rt", "macros"] }

[dependencies.identity_iota]
path = "../identity_iota"
Expand Down
4 changes: 2 additions & 2 deletions examples/utils/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ where
let public_key_bytes = get_sender_public_key(&public_key_jwk)?;
let sender_address = convert_to_address(&public_key_bytes)?;
request_funds(&sender_address).await?;
let package_id = std::env::var("IDENTITY_IOTA_PKG_ID")
let package_id = std::env::var("IOTA_IDENTITY_PKG_ID")
.map_err(|e| {
anyhow::anyhow!("env variable IDENTITY_IOTA_PKG_ID must be set in order to run the examples").context(e)
anyhow::anyhow!("env variable IOTA_IDENTITY_PKG_ID must be set in order to run the examples").context(e)
})
.and_then(|pkg_str| pkg_str.parse().context("invalid package id"))?;

Expand Down
2 changes: 1 addition & 1 deletion identity_credential/src/credential/jwt_serialization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ where
}

#[cfg(feature = "validator")]
impl<'credential, T> CredentialJwtClaims<'credential, T>
impl<T> CredentialJwtClaims<'_, T>
where
T: ToOwned<Owned = T> + Serialize + DeserializeOwned,
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ use super::DomainLinkageValidationResult;
use crate::utils::url_only_includes_origin;

/// A validator for a Domain Linkage Configuration and Credentials.
pub struct JwtDomainLinkageValidator<V: JwsVerifier> {
validator: JwtCredentialValidator<V>,
}
Expand Down
2 changes: 1 addition & 1 deletion identity_credential/src/presentation/jwt_serialization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ where
}

#[cfg(feature = "validator")]
impl<'presentation, CRED, T> PresentationJwtClaims<'presentation, CRED, T>
impl<CRED, T> PresentationJwtClaims<'_, CRED, T>
where
CRED: ToOwned<Owned = CRED> + Serialize + DeserializeOwned + Clone,
T: ToOwned<Owned = T> + Serialize + DeserializeOwned,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ where
D: serde::Deserializer<'de>,
{
struct ExactStrVisitor(&'static str);
impl<'a> Visitor<'a> for ExactStrVisitor {
impl Visitor<'_> for ExactStrVisitor {
type Value = &'static str;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(formatter, "the exact string \"{}\"", self.0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ where
D: serde::Deserializer<'de>,
{
struct ExactStrVisitor(&'static str);
impl<'a> Visitor<'a> for ExactStrVisitor {
impl Visitor<'_> for ExactStrVisitor {
type Value = &'static str;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(formatter, "the exact string \"{}\"", self.0)
Expand Down
4 changes: 2 additions & 2 deletions identity_document/src/document/core_document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -690,7 +690,7 @@ impl CoreDocument {
&'me self,
method_query: Q,
scope: Option<MethodScope>,
) -> Option<&VerificationMethod>
) -> Option<&'me VerificationMethod>
where
Q: Into<DIDUrlQuery<'query>>,
{
Expand Down Expand Up @@ -773,7 +773,7 @@ impl CoreDocument {
/// Returns the first [`Service`] with an `id` property matching the provided `service_query`, if present.
// NOTE: This method demonstrates unexpected behavior in the edge cases where the document contains
// services whose ids are of the form <did different from this document's>#<fragment>.
pub fn resolve_service<'query, 'me, Q>(&'me self, service_query: Q) -> Option<&Service>
pub fn resolve_service<'query, 'me, Q>(&'me self, service_query: Q) -> Option<&'me Service>
where
Q: Into<DIDUrlQuery<'query>>,
{
Expand Down
4 changes: 2 additions & 2 deletions identity_document/src/utils/did_url_query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use identity_did::DID;
#[repr(transparent)]
pub struct DIDUrlQuery<'query>(Cow<'query, str>);

impl<'query> DIDUrlQuery<'query> {
impl DIDUrlQuery<'_> {
/// Returns whether this query matches the given DIDUrl.
pub(crate) fn matches(&self, did_url: &DIDUrl) -> bool {
// Ensure the DID matches if included in the query.
Expand Down Expand Up @@ -81,7 +81,7 @@ impl<'query> From<&'query DIDUrl> for DIDUrlQuery<'query> {
}
}

impl<'query> From<DIDUrl> for DIDUrlQuery<'query> {
impl From<DIDUrl> for DIDUrlQuery<'_> {
fn from(other: DIDUrl) -> Self {
Self(Cow::Owned(other.to_string()))
}
Expand Down
8 changes: 8 additions & 0 deletions identity_iota/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ identity_resolver = { version = "=1.4.0", path = "../identity_resolver", default
identity_storage = { version = "=1.4.0", path = "../identity_storage", default-features = false, features = ["iota-document"] }
identity_verification = { version = "=1.4.0", path = "../identity_verification", default-features = false }

[dev-dependencies]
# required for doc test
anyhow = "1.0.64"
identity_iota = { version = "=1.4.0", path = "./", features = ["memstore"] }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.3-rc" }
rand = "0.8.5"
tokio = { version = "1.29.0", features = ["full"] }

[features]
default = ["revocation-bitmap", "iota-client", "resolver"]

Expand Down
21 changes: 7 additions & 14 deletions identity_iota/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Test this example using https://github.com/anko/txm: `txm README.md`
!test program
cd ../..
mkdir tmp
cat | sed -e 's#identity_iota = { git = "[^"]*"#identity_iota = { path = "../identity_iota"#' > tmp/Cargo.toml
cat | sed -e 's#identity_iota = { git = "[^"]*", tag = "[^"]*"#identity_iota = { path = "../identity_iota"#' > tmp/Cargo.toml
echo '[workspace]' >>tmp/Cargo.toml
-->
<!-- !test check Cargo Example -->
Expand All @@ -92,11 +92,11 @@ version = "1.0.0"
edition = "2021"

[dependencies]
identity_iota = { git = "https://github.com/iotaledger/identity.rs.git", tag = "v1.6.0-alpha" }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.0-alpha" }
tokio = { version = "1", features = ["full"] }
anyhow = "1.0.62"
identity_iota = { git = "https://github.com/iotaledger/identity.rs.git", tag = "v1.6.0-alpha", features = ["memstore"] }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.3-rc" }
rand = "0.8.5"
tokio = { version = "1", features = ["full"] }
```

_main._<span></span>_rs_
Expand All @@ -113,7 +113,6 @@ timeout 360 cargo build || (echo "Process timed out after 360 seconds" && exit 1
-->
<!-- !test check Rust Example -->


```rust,no_run
use anyhow::Context;
use identity_iota::iota::IotaDocument;
Expand All @@ -134,18 +133,12 @@ use identity_iota::verification::MethodScope;
use iota_sdk::IotaClientBuilder;
use tokio::io::AsyncReadExt;
// The endpoint of the IOTA node to use.
static API_ENDPOINT: &str = "http://localhost";
// Test budget for transactions.
const TEST_GAS_BUDGET: u64 = 50_000_000;
/// Demonstrates how to create a DID Document and publish it in a new identity.
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create a new client to interact with the IOTA ledger.
let iota_client = IotaClientBuilder::default()
.build(API_ENDPOINT)
.build_localnet()
.await
.map_err(|err| anyhow::anyhow!(format!("failed to connect to network; {}", err)))?;
Expand All @@ -170,12 +163,12 @@ async fn main() -> anyhow::Result<()> {
let identity_client = IdentityClient::new(read_only_client, signer).await?;
println!("Your wallet address is: {}", sender_address);
println!("Please request funds from http://localhost/faucet/, wait for a couple of seconds and then press Enter.");
println!("Please request funds from http://127.0.0.1:9123/gas, wait for a couple of seconds and then press Enter.");
tokio::io::stdin().read_u8().await?;
// Create a new DID document with a placeholder DID.
let mut unpublished: IotaDocument = IotaDocument::new(identity_client.network());
let verification_method_fragment = unpublished
unpublished
.generate_method(
&storage,
JwkMemStore::ED25519_KEY_TYPE,
Expand Down
8 changes: 4 additions & 4 deletions identity_iota_core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ bcs = { version = "0.1.4", optional = true }
fastcrypto = { git = "https://github.com/MystenLabs/fastcrypto", rev = "5f2c63266a065996d53f98156f0412782b468597", package = "fastcrypto", optional = true }
identity_eddsa_verifier = { version = "=1.4.0", path = "../identity_eddsa_verifier", optional = true }
identity_jose = { version = "=1.4.0", path = "../identity_jose", optional = true }
iota-config = { git = "https://github.com/iotaledger/iota.git", package = "iota-config", rev = "39c83ddcf07894cdee2abd146381d8704205e6e9", optional = true }
iota-config = { git = "https://github.com/iotaledger/iota.git", package = "iota-config", tag = "v0.7.3-rc", optional = true }
iota-crypto = { version = "0.23", optional = true }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", rev = "39c83ddcf07894cdee2abd146381d8704205e6e9", optional = true }
iota-sdk = { git = "https://github.com/iotaledger/iota.git", package = "iota-sdk", tag = "v0.7.3-rc", optional = true }
itertools = { version = "0.13.0", optional = true }
move-core-types = { git = "https://github.com/iotaledger/iota.git", package = "move-core-types", rev = "39c83ddcf07894cdee2abd146381d8704205e6e9", optional = true }
move-core-types = { git = "https://github.com/iotaledger/iota.git", package = "move-core-types", tag = "v0.7.3-rc", optional = true }
rand = { version = "0.8.5", optional = true }
secret-storage = { git = "https://github.com/iotaledger/secret-storage.git", tag = "v0.1.0", optional = true }
serde-aux = { version = "4.5.0", optional = true }
shared-crypto = { git = "https://github.com/iotaledger/iota.git", package = "shared-crypto", rev = "39c83ddcf07894cdee2abd146381d8704205e6e9", optional = true }
shared-crypto = { git = "https://github.com/iotaledger/iota.git", package = "shared-crypto", tag = "v0.7.3-rc", optional = true }
tokio = { version = "1.29.0", default-features = false, optional = true, features = ["macros", "sync", "rt", "process"] }

[dev-dependencies]
Expand Down
8 changes: 5 additions & 3 deletions identity_iota_core/packages/iota_identity/Move.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ name = "IotaIdentity"
edition = "2024.beta"

[dependencies]
MoveStdlib = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/move-stdlib", rev = "ead968e573d8feaa1aa78dddadb8b18a8a99870d" }
Iota = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/iota-framework", rev = "ead968e573d8feaa1aa78dddadb8b18a8a99870d" }
Stardust = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/stardust", rev = "ead968e573d8feaa1aa78dddadb8b18a8a99870d" }
# 'tag' keyword not supported here, therefore use rev instead
# 'tag = "v0.7.3-rc"' equals 'rev = "34da09d2684e7e3356bc457b5e412405357f9972"', which we use here
MoveStdlib = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/move-stdlib", rev = "34da09d2684e7e3356bc457b5e412405357f9972" }
Iota = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/iota-framework", rev = "34da09d2684e7e3356bc457b5e412405357f9972" }
Stardust = { git = "https://github.com/iotaledger/iota.git", subdir = "crates/iota-framework/packages/stardust", rev = "34da09d2684e7e3356bc457b5e412405357f9972" }

[addresses]
iota_identity = "0x0"
Expand Down
7 changes: 4 additions & 3 deletions identity_iota_core/scripts/publish_identity_package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
# Copyright 2020-2024 IOTA Stiftung
# SPDX-License-Identifier: Apache-2.0

script_dir=$(dirname $0)
script_dir=$(cd "$(dirname $0)" && pwd)
package_dir=$script_dir/../packages/iota_identity

# echo "publishing package from $package_dir"
cd $package_dir
iota client publish --with-unpublished-dependencies --skip-dependency-verification --json --gas-budget 500000000 .
package_id=$(iota client publish --with-unpublished-dependencies --skip-dependency-verification --silence-warnings --json --gas-budget 500000000 $package_dir | jq --raw-output '.objectChanges[] | select(.type | contains("published")) | .packageId')
export IOTA_IDENTITY_PKG_ID=$package_id
echo "${IOTA_IDENTITY_PKG_ID}"
Loading

0 comments on commit 34c200c

Please sign in to comment.