Home > OS >  Check if a key exists and return another key
Check if a key exists and return another key

Time:10-25

I need help with jq syntax on how to return the Gitlab job ID if it contains an artifact. The JSON output looks like this (removed a lot of unrelated info from it and added [...]):

[{
    "id": 3219589880,
    "status": "success",
    "stage": "test",
    "name": "job_with_no_artifact",
    "ref": "main",
    "tag": false,
    "coverage": null,
    "allow_failure": false,
    "created_at": "2022-10-24T18:21:25.119Z",
    "started_at": "2022-10-24T18:21:25.986Z",
    "finished_at": "2022-10-24T18:21:38.464Z",
    "duration": 12.478682,
    "queued_duration": 0.499786,
    "user": {
        "id": 123456789,
        [...]
    },
    "commit": {
        "id": "5e0e1f287d20daf2036a3ca71c656dce55999265",
        [...]
    "pipeline": {
        "id": 123456789,
        [...]
    "project": {
        "ci_job_token_scope_enabled": false
    },
    "artifacts": [],
    "runner": {
        "id": 12270859,
        [...]
    },
    "artifacts_expire_at": null,
    "tag_list": []
}, {
    "id": 3219589878,
    "status": "success",
    "stage": "test",
    "name": "create_artifact_job_2",
    "ref": "main",
    "tag": false,
    "coverage": null,
    "allow_failure": false,
    "created_at": "2022-10-24T18:21:25.111Z",
    "started_at": "2022-10-24T18:21:25.922Z",
    "finished_at": "2022-10-24T18:21:39.090Z",
    "duration": 13.168405,
    "queued_duration": 0.464364,
    "user": {
        "id": 123456789,
        [...]
    },
    "commit": {
        "id": "5e0e1f287d20daf2036a3ca71c656dce55999265",
        [...]
    },
    "pipeline": {
        "id": 675641982,
        [...],
    "project": {
        "ci_job_token_scope_enabled": false
    },
    "artifacts_file": {
        "filename": "artifacts.zip",
        "size": 223
    },
    "artifacts": [{
        "file_type": "archive",
        "size": 223,
        "filename": "artifacts.zip",
        "file_format": "zip"
    }, {
        "file_type": "metadata",
        "size": 153,
        "filename": "metadata.gz",
        "file_format": "gzip"
    }],
    "runner": {
        "id": 12270845,
        [...]
    },
    "artifacts_expire_at": "2022-10-25T18:21:35.859Z",
    "tag_list": []
}, {
    "id": 3219589876,
    "status": "success",
    "stage": "test",
    "name": "create_artifact_job_1",
    "ref": "main",
    "tag": false,
    "coverage": null,
    "allow_failure": false,
    "created_at": "2022-10-24T18:21:25.103Z",
    "started_at": "2022-10-24T18:21:25.503Z",
    "finished_at": "2022-10-24T18:21:41.407Z",
    "duration": 15.904028,
    "queued_duration": 0.098837,
    "user": {
        "id": 123456789,
        [...]
    },
    "commit": {
        "id": "5e0e1f287d20daf2036a3ca71c656dce55999265",
        [...]
    },
    "pipeline": {
        "id": 123456789,
        [...]
    },
    "web_url": "WEB_URL",
    "project": {
        "ci_job_token_scope_enabled": false
    },
    "artifacts_file": {
        "filename": "artifacts.zip",
        "size": 217
    },
    "artifacts": [{
        "file_type": "archive",
        "size": 217,
        "filename": "artifacts.zip",
        "file_format": "zip"
    }, {
        "file_type": "metadata",
        "size": 152,
        "filename": "metadata.gz",
        "file_format": "gzip"
    }],
    "runner": {
        "id": 12270857,
    },
    "artifacts_expire_at": "2022-10-25T18:21:37.808Z",
    "tag_list": []
}]

I've been trying to do either of the following using jQ:

Either:

  • Check if artifacts_file key exists in each iteration and if it does return the (job) id (so .[].id)

  • Check if artifacts array is empty in each iteration and if it is empty return the (job) id.

In both cases I'm able to do the first part but I am not sure how to return the .id key.

Related stackoverflow questions that I've been trying to utilize and adapt to my case:

What I have so far: jq '[.[].artifacts[]|select(length > 0)] | .[]' which returns all the artifacts found (but it doesn't contain the .id of the job).

CodePudding user response:

Checking the existence of a field using has:

.[] | select(has("artifacts_file")).id
3219589878
3219589876

Demo

Checking if a field is an empty array by comparing it to []:

.[] | select(.artifacts == []).id
3219589880

Demo

  • Related