Implement VM-test for gitea plugin

[?]
Mar 30, 2021, 8:35 PM
3VSNQ6TJKHAMCGNMCBSHKN4JGB7NTOWHP3LXPVI4DCFCFCGQ4MKQC

Dependencies

  • [2] A4NSGFS3 LDAP: add VM test to flake.nix
  • [3] JFG4FYTW Implement simple status notifications for Git repos hosted on gitea
  • [4] ZLLMZMPO Fix error codes for GiteaStatus plugin
  • [*] RWNXH3H2 lastModified -> lastModifiedDate

Change contents

  • edit in flake.nix at line 496
    [6.9632]
    [2.0]
    tests.gitea.x86_64-linux =
    with import (nixpkgs + "/nixos/lib/testing-python.nix") { system = "x86_64-linux"; };
    makeTest {
    machine = { pkgs, ... }: {
    imports = [ hydraServer ];
    services.hydra-dev.extraConfig = ''
    <gitea_authorization>
    root=d7f16a3412e01a43a414535b16007c6931d3a9c7
    </gitea_authorization>
    '';
    nix = {
    distributedBuilds = true;
    buildMachines = [{
    hostName = "localhost";
    systems = [ "x86_64-linux" ];
    }];
    binaryCaches = [];
    };
    services.gitea = {
    enable = true;
    database.type = "postgres";
    disableRegistration = true;
    httpPort = 3001;
    };
    services.openssh.enable = true;
    environment.systemPackages = with pkgs; [ gitea git jq gawk ];
    networking.firewall.allowedTCPPorts = [ 3000 ];
    };
    skipLint = true;
    testScript = let
    scripts.mktoken = pkgs.writeText "token.sql" ''
    INSERT INTO access_token (id, uid, name, created_unix, updated_unix, token_hash, token_salt, token_last_eight) VALUES (1, 1, 'hydra', 1617107360, 1617107360, 'a930f319ca362d7b49a4040ac0af74521c3a3c3303a86f327b01994430672d33b6ec53e4ea774253208686c712495e12a486', 'XRjWE9YW0g', '31d3a9c7');
    '';
    scripts.git-setup = pkgs.writeShellScript "setup.sh" ''
    set -x
    mkdir -p /tmp/repo $HOME/.ssh
    cat ${snakeoilKeypair.privkey} > $HOME/.ssh/privk
    chmod 0400 $HOME/.ssh/privk
    git -C /tmp/repo init
    cp ${smallDrv} /tmp/repo/jobset.nix
    git -C /tmp/repo add .
    git config --global user.email test@localhost
    git config --global user.name test
    git -C /tmp/repo commit -m 'Initial import'
    git -C /tmp/repo remote add origin gitea@machine:root/repo
    GIT_SSH_COMMAND='ssh -i $HOME/.ssh/privk -o StrictHostKeyChecking=no' \
    git -C /tmp/repo push origin master
    git -C /tmp/repo log >&2
    '';
    scripts.hydra-setup = pkgs.writeShellScript "hydra.sh" ''
    set -x
    su -l hydra -c "hydra-create-user root --email-address \
    'alice@example.org' --password foobar --role admin"
    URL=http://localhost:3000
    USERNAME="root"
    PASSWORD="foobar"
    PROJECT_NAME="trivial"
    JOBSET_NAME="trivial"
    mycurl() {
    curl --referer $URL -H "Accept: application/json" \
    -H "Content-Type: application/json" $@
    }
    cat >data.json <<EOF
    { "username": "$USERNAME", "password": "$PASSWORD" }
    EOF
    mycurl -X POST -d '@data.json' $URL/login -c hydra-cookie.txt
    cat >data.json <<EOF
    {
    "displayname":"Trivial",
    "enabled":"1",
    "visible":"1"
    }
    EOF
    mycurl --silent -X PUT $URL/project/$PROJECT_NAME \
    -d @data.json -b hydra-cookie.txt
    cat >data.json <<EOF
    {
    "description": "Trivial",
    "checkinterval": "60",
    "enabled": "1",
    "visible": "1",
    "keepnr": "1",
    "enableemail": true,
    "emailoverride": "hydra@localhost",
    "type": 0,
    "nixexprinput": "git",
    "nixexprpath": "jobset.nix",
    "inputs": {
    "git": {"value": "http://localhost:3001/root/repo.git", "type": "git"},
    "gitea_repo_name": {"value": "repo", "type": "string"},
    "gitea_repo_owner": {"value": "root", "type": "string"},
    "gitea_status_repo": {"value": "git", "type": "string"}
    }
    }
    EOF
    mycurl --silent -X PUT $URL/jobset/$PROJECT_NAME/$JOBSET_NAME \
    -d @data.json -b hydra-cookie.txt
    '';
    api_token = "d7f16a3412e01a43a414535b16007c6931d3a9c7";
    snakeoilKeypair = {
    privkey = pkgs.writeText "privkey.snakeoil" ''
    -----BEGIN EC PRIVATE KEY-----
    MHcCAQEEIHQf/khLvYrQ8IOika5yqtWvI0oquHlpRLTZiJy5dRJmoAoGCCqGSM49
    AwEHoUQDQgAEKF0DYGbBwbj06tA3fd/+yP44cvmwmHBWXZCKbS+RQlAKvLXMWkpN
    r1lwMyJZoSGgBHoUahoYjTh9/sJL7XLJtA==
    -----END EC PRIVATE KEY-----
    '';
    pubkey = pkgs.lib.concatStrings [
    "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHA"
    "yNTYAAABBBChdA2BmwcG49OrQN33f/sj+OHL5sJhwVl2Qim0vkUJQCry1zFpKTa"
    "9ZcDMiWaEhoAR6FGoaGI04ff7CS+1yybQ= sakeoil"
    ];
    };
    smallDrv = pkgs.writeText "jobset.nix" ''
    { trivial = builtins.derivation {
    name = "trivial";
    system = "x86_64-linux";
    builder = "/bin/sh";
    allowSubstitutes = false;
    preferLocalBuild = true;
    args = ["-c" "echo success > $out; exit 0"];
    };
    }
    '';
    in ''
    import json
    machine.start()
    machine.wait_for_unit("multi-user.target")
    machine.wait_for_open_port(3000)
    machine.wait_for_open_port(3001)
    machine.succeed(
    "su -l gitea -c 'GITEA_WORK_DIR=/var/lib/gitea gitea admin create-user "
    + "--username root --password root --email test@localhost'"
    )
    machine.succeed("su -l postgres -c 'psql gitea < ${scripts.mktoken}'")
    machine.succeed(
    "curl --fail -X POST http://localhost:3001/api/v1/user/repos "
    + "-H 'Accept: application/json' -H 'Content-Type: application/json' "
    + f"-H 'Authorization: token ${api_token}'"
    + ' -d \'{"auto_init":false, "description":"string", "license":"mit", "name":"repo", "private":false}\'''
    )
    machine.succeed(
    "curl --fail -X POST http://localhost:3001/api/v1/user/keys "
    + "-H 'Accept: application/json' -H 'Content-Type: application/json' "
    + f"-H 'Authorization: token ${api_token}'"
    + ' -d \'{"key":"${snakeoilKeypair.pubkey}","read_only":true,"title":"SSH"}\'''
    )
    machine.succeed(
    "${scripts.git-setup}"
    )
    machine.succeed(
    "${scripts.hydra-setup}"
    )
    machine.wait_until_succeeds(
    'curl -Lf -s http://localhost:3000/build/1 -H "Accept: application/json" '
    + '| jq .buildstatus | xargs test 0 -eq'
    )
    data = machine.succeed(
    'curl -Lf -s "http://localhost:3001/api/v1/repos/root/repo/statuses/$(cd /tmp/repo && git show | head -n1 | awk "{print \\$2}")" '
    + "-H 'Accept: application/json' -H 'Content-Type: application/json' "
    + f"-H 'Authorization: token ${api_token}'"
    )
    response = json.loads(data)
    assert len(response) == 2, "Expected exactly two status updates for latest commit!"
    assert response[0]['status'] == "success", "Expected latest status to be success!"
    assert response[1]['status'] == "pending", "Expected first status to be pending!"
    machine.shutdown()
    '';
    };
  • replacement in src/lib/Hydra/Plugin/GiteaStatus.pm at line 65
    [3.3285][3.3285:3378]()
    my $url = "http://$domain:3000/api/v1/repos/$repoOwner/$repoName/statuses/$rev";
    [3.3285]
    [3.3378]
    my $url = "http://$domain:3001/api/v1/repos/$repoOwner/$repoName/statuses/$rev";