|
3 | 3 | config, |
4 | 4 | cargo2nix, |
5 | 5 | system, |
| 6 | + lib, |
6 | 7 | ... |
7 | 8 | }: |
8 | 9 | { |
|
28 | 29 | allowCustomCrateRegistries = true; |
29 | 30 | }; |
30 | 31 | credentials = { |
31 | | - RENOVATE_TOKEN = config.sops.secrets."services/renovate/credentials/RENOVATE_TOKEN".path; |
| 32 | + GITHUB_PEM = config.sops.secrets."services/renovate/credentials/privkey.pem".path; |
32 | 33 | GITHUB_COM_TOKEN = config.sops.secrets."services/renovate/credentials/GITHUB_COM_TOKEN".path; |
33 | 34 | }; |
34 | 35 | runtimePackages = with pkgs; [ |
|
46 | 47 | ]; |
47 | 48 | }; |
48 | 49 |
|
49 | | - sops.secrets."services/renovate/credentials/RENOVATE_TOKEN".sopsFile = ./secrets.yaml; |
| 50 | + systemd.services.renovate.script = lib.mkBefore '' |
| 51 | + #!${lib.getExe pkgs.bash} |
| 52 | + set -euo pipefail |
| 53 | + client_id=Iv23li2EB7v4XJseLlto |
| 54 | + pem="$(${lib.getExe' pkgs.systemd "systemd-creds"} cat 'SECRET-GITHUB_PEM')" |
| 55 | + now=$(${lib.getExe' pkgs.coreutils "date"} +%s) |
| 56 | + iat=$((''${now} - 60)) # Issues 60 seconds in the past |
| 57 | + exp=$((''${now} + 31536000)) # Expires 10 minutes in the future |
| 58 | + b64enc() { ${lib.getExe pkgs.openssl} base64 | ${lib.getExe' pkgs.coreutils "tr"} -d '=' | ${lib.getExe' pkgs.coreutils "tr"} '/+' '_-' | ${lib.getExe' pkgs.coreutils "tr"} -d '\n'; } |
| 59 | + header_json='{ |
| 60 | + "typ":"JWT", |
| 61 | + "alg":"RS256" |
| 62 | + }' |
| 63 | + # Header encode |
| 64 | + header=$( echo -n "''${header_json}" | b64enc ) |
| 65 | +
|
| 66 | + payload_json="{ |
| 67 | + \"iat\":''${iat}, |
| 68 | + \"exp\":''${exp}, |
| 69 | + \"iss\":\"''${client_id}\" |
| 70 | + }" |
| 71 | + # Payload encode |
| 72 | + payload=$( echo -n "''${payload_json}" | b64enc ) |
| 73 | +
|
| 74 | + # Signature |
| 75 | + header_payload="''${header}"."''${payload}" |
| 76 | + signature=$( |
| 77 | + ${lib.getExe pkgs.openssl} dgst -sha256 -sign <(echo -n "''${pem}") \ |
| 78 | + <(echo -n "''${header_payload}") | b64enc |
| 79 | + ) |
| 80 | +
|
| 81 | + # Create JWT |
| 82 | + JWT="''${header_payload}"."''${signature}" |
| 83 | +
|
| 84 | + RENOVATE_TOKEN=$(${lib.getExe pkgs.curl} --request POST \ ─╯ |
| 85 | + --url "https://api.github.com/app/installations/61371765/access_tokens" \ |
| 86 | + --header "Accept: application/vnd.github+json" \ |
| 87 | + --header "Authorization: Bearer ''${JWT}" \ |
| 88 | + --header "X-GitHub-Api-Version: 2022-11-28" | ${lib.getExe pkgs.jq} -r '.token') |
| 89 | +
|
| 90 | + export RENOVATE_TOKEN |
| 91 | + ''; |
| 92 | + |
| 93 | + sops.secrets."services/renovate/credentials/privkey.pem".sopsFile = ./secrets.yaml; |
50 | 94 | sops.secrets."services/renovate/credentials/GITHUB_COM_TOKEN".sopsFile = ./secrets.yaml; |
51 | 95 | } |
0 commit comments