|
1 | | -name: Update Dev Container Image version |
| 1 | +name: Update devcontainer version |
| 2 | + |
2 | 3 | on: |
3 | | - workflow_call: |
4 | | - inputs: |
5 | | - base_branch: |
6 | | - required: false |
7 | | - type: string |
8 | | - default: main |
9 | | - secrets: |
10 | | - CREATE_PULL_REQUEST_APP_ID: |
11 | | - required: true |
12 | | - CREATE_PULL_REQUEST_PEM: |
13 | | - required: true |
| 4 | + workflow_dispatch: |
| 5 | + schedule: |
| 6 | + - cron: "0 6 * * 4" |
| 7 | +permissions: {} |
| 8 | + |
14 | 9 | jobs: |
15 | | - update_devcontainer_version: |
| 10 | + update-devcontainer-version: |
16 | 11 | runs-on: ubuntu-22.04 |
| 12 | + environment: create_pull_request |
17 | 13 | permissions: |
18 | 14 | contents: read |
19 | 15 | packages: read |
20 | | - pull-requests: write |
21 | | - steps: |
22 | | - - name: Checkout code |
23 | | - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd |
24 | | - with: |
25 | | - fetch-depth: 0 |
26 | | - - name: Load config value |
27 | | - id: load-config |
28 | | - run: | |
29 | | - set -euo pipefail |
30 | | - DEVCONTAINER_IMAGE=$(jq -r '.build.args.IMAGE_NAME' .devcontainer/devcontainer.json) |
31 | | -
|
32 | | - DEVCONTAINER_VERSION=$(jq -r '.build.args.IMAGE_VERSION' .devcontainer/devcontainer.json) |
33 | | -
|
34 | | - { |
35 | | - echo "DEVCONTAINER_IMAGE=$DEVCONTAINER_IMAGE" |
36 | | - echo "DEVCONTAINER_VERSION=$DEVCONTAINER_VERSION" |
37 | | - } >> "$GITHUB_ENV" |
38 | | - - name: Resolve latest devcontainer image version from GHCR |
39 | | - id: resolve-version |
40 | | - env: |
41 | | - GH_TOKEN: "${{ github.token }}" |
42 | | - run: | |
43 | | - set -euo pipefail |
44 | | -
|
45 | | -
|
46 | | - PACKAGE_NAME="eps-devcontainers/${DEVCONTAINER_IMAGE}" |
47 | | -
|
48 | | - ENCODED_PACKAGE_NAME=$(python3 -c 'import sys, urllib.parse; |
49 | | - print(urllib.parse.quote(sys.argv[1], safe=""))' "$PACKAGE_NAME") |
50 | | -
|
51 | | -
|
52 | | - VERSIONS_JSON=$(gh api \ |
53 | | - -H "Accept: application/vnd.github+json" \ |
54 | | - "/orgs/NHSDigital/packages/container/${ENCODED_PACKAGE_NAME}/versions?per_page=100") |
55 | | -
|
56 | | - LATEST_VIA_LATEST_TAG=$(jq -r ' |
57 | | - [ .[] |
58 | | - | select((.metadata.container.tags // []) | index("latest")) |
59 | | - ] |
60 | | - | sort_by(.created_at) |
61 | | - | reverse |
62 | | - | .[0].metadata.container.tags // [] |
63 | | - | map(select(test("^v"))) |
64 | | - | .[0] // empty |
65 | | - ' <<< "$VERSIONS_JSON") |
66 | | -
|
67 | | -
|
68 | | - LATEST_V_TAG=$(jq -r ' |
69 | | - [ .[] |
70 | | - | {created_at, tags: (.metadata.container.tags // [])} |
71 | | - ] |
72 | | - | sort_by(.created_at) |
73 | | - | reverse |
74 | | - | map(.tags[]? | select(test("^v"))) |
75 | | - | .[0] // empty |
76 | | - ' <<< "$VERSIONS_JSON") |
77 | | -
|
78 | | -
|
79 | | - RESOLVED_VERSION="$LATEST_VIA_LATEST_TAG" |
80 | | -
|
81 | | - if [[ -z "$RESOLVED_VERSION" ]]; then |
82 | | - RESOLVED_VERSION="$LATEST_V_TAG" |
83 | | - fi |
84 | | -
|
85 | | -
|
86 | | - if [[ -z "$RESOLVED_VERSION" ]]; then |
87 | | - echo "No version tag matching ^v found for package ${PACKAGE_NAME}" >&2 |
88 | | - exit 1 |
89 | | - fi |
90 | | -
|
91 | 16 |
|
92 | | - echo "Resolved latest version: ${RESOLVED_VERSION}" |
93 | | -
|
94 | | - echo "LATEST_DEVCONTAINER_VERSION=${RESOLVED_VERSION}" >> "$GITHUB_ENV" |
95 | | -
|
96 | | - echo "latest_version=${RESOLVED_VERSION}" >> "$GITHUB_OUTPUT" |
97 | | - - name: Update devcontainer version in config |
98 | | - run: | |
99 | | - set -euo pipefail |
100 | | -
|
101 | | -
|
102 | | - TARGET_VERSION='${{ steps.resolve-version.outputs.latest_version }}' |
103 | | -
|
104 | | - if [[ "$TARGET_VERSION" == "$DEVCONTAINER_VERSION" ]]; then |
105 | | - echo "IMAGE_VERSION is already up to date (${DEVCONTAINER_VERSION})" |
106 | | - exit 0 |
107 | | - fi |
108 | | -
|
109 | | -
|
110 | | - python3 - <<'PY' |
111 | | -
|
112 | | - import json |
113 | | -
|
114 | | - from pathlib import Path |
115 | | -
|
116 | | -
|
117 | | - config_file = Path('.devcontainer/devcontainer.json') |
118 | | -
|
119 | | - config = json.loads(config_file.read_text()) |
120 | | -
|
121 | | - config['build']['args']['IMAGE_VERSION'] = '${{ |
122 | | - steps.resolve-version.outputs.latest_version }}' |
123 | | -
|
124 | | - config_file.write_text(json.dumps(config, indent=2) + '\n') |
125 | | -
|
126 | | - PY |
127 | | -
|
128 | | -
|
129 | | - echo "Updated IMAGE_VERSION from ${DEVCONTAINER_VERSION} to |
130 | | - ${LATEST_DEVCONTAINER_VERSION}" |
131 | | - - name: Create GitHub App Token |
132 | | - uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 |
133 | | - id: generate-token |
134 | | - with: |
135 | | - app-id: "${{ secrets.CREATE_PULL_REQUEST_APP_ID }}" |
136 | | - private-key: "${{ secrets.CREATE_PULL_REQUEST_PEM }}" |
137 | | - - name: Create Pull Request |
138 | | - uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 |
| 17 | + steps: |
| 18 | + - name: Update devcontainer version |
| 19 | + uses: NHSDigital/eps-update-devcontainer@dc3a8c5f11e7226ee4f5f2bb35bd0d1265092306 |
139 | 20 | with: |
140 | | - token: "${{ steps.generate-token.outputs.token }}" |
141 | | - commit-message: Update devcontainer image version to ${{ steps.resolve-version.outputs.latest_version }} |
142 | | - title: "Upgrade: [dependabot] - Update devcontainer image version to ${{ steps.resolve-version.outputs.latest_version }}" |
143 | | - body: "This PR updates the devcontainer image version to ${{ steps.resolve-version.outputs.latest_version }}." |
144 | | - add-paths: .devcontainer/devcontainer.json |
145 | | - sign-commits: true |
146 | | - base: "${{ inputs.base_branch }}" |
147 | | - delete-branch: true |
148 | | - branch: update-devcontainer-version |
| 21 | + calling_repo_base_branch: main |
| 22 | + CREATE_PULL_REQUEST_APP_ID: ${{ secrets.CREATE_PULL_REQUEST_APP_ID }} |
| 23 | + CREATE_PULL_REQUEST_PEM: ${{ secrets.CREATE_PULL_REQUEST_PEM }} |
0 commit comments