Ejemplo n.º 1
0
Archivo: test-ci.py Proyecto: cseed/ci
 def approve(self, pr_number, sha):
     return post_repo('hail-is/ci-test',
                      f'pulls/{pr_number}/reviews',
                      json={
                          "commit_id": sha,
                          "event": "APPROVE"
                      },
                      status_code=200,
                      token=oauth_tokens['user2'])
Ejemplo n.º 2
0
def approve(pr_number, sha):
    return post_repo(FQ_REPO,
                     f'pulls/{pr_number}/reviews',
                     json={
                         "commit_id": sha,
                         "event": "APPROVE"
                     },
                     status_code=200,
                     token=oauth_tokens['user2'])
Ejemplo n.º 3
0
def create_pull_request(title, ref, base="master"):
    return post_repo(FQ_REPO,
                     'pulls',
                     json={
                         "title": title,
                         "head": ref,
                         "base": base
                     },
                     status_code=201,
                     token=oauth_tokens['user1'])
Ejemplo n.º 4
0
def approve(pr_number, sha):
    return post_repo(
        FQ_REPO,
        f'pulls/{pr_number}/reviews',
        json={
            "commit_id": sha,
            "event": "APPROVE"
        },
        status_code=200,
        token=oauth_tokens['user2'])
Ejemplo n.º 5
0
Archivo: test-ci.py Proyecto: cseed/ci
 def create_pull_request(self, title, ref, base="master"):
     return post_repo('hail-is/ci-test',
                      'pulls',
                      json={
                          "title": title,
                          "head": ref,
                          "base": base
                      },
                      status_code=201,
                      token=oauth_tokens['user1'])
Ejemplo n.º 6
0
def create_pull_request(title, ref, base="master"):
    return post_repo(
        FQ_REPO,
        'pulls',
        json={
            "title": title,
            "head": ref,
            "base": base
        },
        status_code=201,
        token=oauth_tokens['user1'])
Ejemplo n.º 7
0
 def notify_github(self, build):
     log.info(f'notifying github of {build} for {self.short_str()}')
     json = {
         'state': build.gh_state(),
         'description': str(build),
         'context': CONTEXT
     }
     if isinstance(build, Failure) or isinstance(build, Mergeable):
         json['target_url'] = \
             f'https://storage.googleapis.com/{GCS_BUCKET}/ci/{self.source.sha}/{self.target.sha}/index.html'
     try:
         post_repo(self.target.ref.repo.qname,
                   'statuses/' + self.source.sha,
                   json=json,
                   status_code=201)
     except BadStatus as e:
         if e.status_code == 422:
             log.exception(
                 f'Too many statuses applied to {self.source.sha}! This is a '
                 f'dangerous situation because I can no longer block merging '
                 f'of failing PRs.')
         else:
             raise e
Ejemplo n.º 8
0
 def notify_github(self, build):
     log.info(f'notifying github of {build} for {self.short_str()}')
     json = {
         'state': build.gh_state(),
         'description': str(build),
         'context': CONTEXT
     }
     if isinstance(build, Failure) or isinstance(build, Mergeable):
         json['target_url'] = \
             f'https://storage.googleapis.com/{GCS_BUCKET}/ci/{self.source.sha}/{self.target.sha}/index.html'
     try:
         post_repo(
             self.target.ref.repo.qname,
             'statuses/' + self.source.sha,
             json=json,
             status_code=201)
     except BadStatus as e:
         if e.status_code == 422:
             log.exception(
                 f'Too many statuses applied to {self.source.sha}! This is a '
                 f'dangerous situation because I can no longer block merging '
                 f'of failing PRs.')
         else:
             raise e
Ejemplo n.º 9
0
def test_merges_approved_pr(tmpdir):
    BRANCH_NAME = 'test_merges_approved_pr'
    pr_number = None
    try:
        status = ci_get('/status', status_code=200)
        assert '_watched_targets' in status
        assert status['_watched_targets'] == [[{
            'repo': {
                'name': REPO_NAME,
                'owner': 'hail-ci-test'
            },
            'name': 'master'
        }, True]]
        os.chdir(tmpdir)
        call(
            [
                'git', 'clone',
                f'https://{oauth_tokens["user1"]}@github.com/hail-ci-test/{REPO_NAME}.git'
            ],
            # do not leak the token
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL)
        os.chdir(REPO_NAME)
        call([
            'git', 'config', 'user.email',
            '*****@*****.**'
        ])
        call(['git', 'config', 'user.name', 'ci-automated-tests'])
        call(['git', 'remote', '-v'])

        call(['git', 'checkout', '-b', BRANCH_NAME])
        call(['git', 'commit', '--allow-empty', '-m', 'foo'])
        call(['git', 'push', 'origin', BRANCH_NAME])
        source_sha = rev_parse(BRANCH_NAME)
        gh_pr = post_repo(FQ_REPO,
                          'pulls',
                          json={
                              "title": "foo",
                              "head": BRANCH_NAME,
                              "base": "master"
                          },
                          status_code=201)
        pr_number = str(gh_pr['number'])
        post_repo(FQ_REPO,
                  f'pulls/{pr_number}/reviews',
                  json={
                      "commit_id": source_sha,
                      "event": "APPROVE"
                  },
                  status_code=200,
                  token=oauth_tokens['user2'])
        get_repo(FQ_REPO,
                 f'pulls/{pr_number}/reviews',
                 status_code=200,
                 token=oauth_tokens['user1'])
        time.sleep(7)
        poll_github_until_merged(pr_number)

        call(['git', 'fetch', 'origin'])
        merged_sha = rev_parse('origin/master')

        # deploy job takes some time
        time.sleep(7)

        deploy_artifact = run(
            ['gsutil', 'cat', f'gs://hail-ci-test/{merged_sha}'],
            stdout=subprocess.PIPE,
            check=True)
        deploy_artifact = deploy_artifact.stdout.decode('utf-8').strip()
        assert f'commit {merged_sha}' in deploy_artifact
    finally:
        call(['git', 'push', 'origin', ':' + BRANCH_NAME])
        if pr_number is not None:
            patch_repo(FQ_REPO,
                       f'pulls/{pr_number}',
                       json={"state": "closed"},
                       status_code=200)
Ejemplo n.º 10
0
def test_pull_request_trigger(tmpdir):
    BRANCH_NAME = 'test_pull_request_trigger'
    pr_number = None
    try:
        status = ci_get('/status', status_code=200)
        assert '_watched_targets' in status
        assert status['_watched_targets'] == [[{
            'repo': {
                'name': REPO_NAME,
                'owner': 'hail-ci-test'
            },
            'name': 'master'
        }, True]]
        os.chdir(tmpdir)
        call(
            [
                'git', 'clone',
                f'https://{oauth_tokens["user1"]}@github.com/hail-ci-test/{REPO_NAME}.git'
            ],
            # do not leak the token
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL)
        os.chdir(REPO_NAME)
        call([
            'git', 'config', 'user.email',
            '*****@*****.**'
        ])
        call(['git', 'config', 'user.name', 'ci-automated-tests'])
        call(['git', 'remote', '-v'])

        call(['git', 'checkout', '-b', BRANCH_NAME])
        call(['git', 'commit', '--allow-empty', '-m', 'foo'])
        call(['git', 'push', 'origin', BRANCH_NAME])
        source_sha = rev_parse(BRANCH_NAME)
        target_sha = rev_parse('master')
        data = post_repo(FQ_REPO,
                         'pulls',
                         json={
                             "title": "foo",
                             "head": BRANCH_NAME,
                             "base": "master"
                         },
                         status_code=201,
                         token=oauth_tokens['user1'])
        pr_number = str(data['number'])
        time.sleep(7)
        pr = poll_until_finished_pr(BRANCH_NAME)
        assertDictHasKVs(
            pr.to_json(), {
                "target": {
                    "ref": {
                        "repo": {
                            "owner": "hail-ci-test",
                            "name": REPO_NAME
                        },
                        "name": "master"
                    },
                    "sha": target_sha
                },
                "source": {
                    "ref": {
                        "repo": {
                            "owner": "hail-ci-test",
                            "name": REPO_NAME
                        },
                        "name": BRANCH_NAME
                    },
                    "sha": source_sha
                },
                "review": "pending",
                "build": {
                    "type": "Mergeable",
                    "target_sha": target_sha
                },
                "number": pr_number
            })
    finally:
        call(['git', 'push', 'origin', ':' + BRANCH_NAME])
        if pr_number is not None:
            patch_repo(FQ_REPO,
                       f'pulls/{pr_number}',
                       json={"state": "closed"},
                       status_code=200,
                       token=oauth_tokens['user1'])
Ejemplo n.º 11
0
def test_merges_approved_pr(tmpdir):
    BRANCH_NAME = 'test_merges_approved_pr'
    pr_number = None
    try:
        status = ci_get('/status', status_code=200)
        assert '_watched_targets' in status
        assert status['_watched_targets'] == [[{
            'repo': {
                'name': REPO_NAME,
                'owner': 'hail-ci-test'},
            'name': 'master'}, True]]
        os.chdir(tmpdir)
        call(['git', 'clone', f'https://{oauth_tokens["user1"]}@github.com/hail-ci-test/{REPO_NAME}.git'],
             # do not leak the token
             stdout=subprocess.DEVNULL,
             stderr=subprocess.DEVNULL)
        os.chdir(REPO_NAME)
        call(['git', 'config', 'user.email', '*****@*****.**'])
        call(['git', 'config', 'user.name', 'ci-automated-tests'])
        call(['git', 'remote', '-v'])

        call(['git', 'checkout', '-b', BRANCH_NAME])
        call(['git', 'commit', '--allow-empty', '-m', 'foo'])
        call(['git', 'push', 'origin', BRANCH_NAME])
        source_sha = rev_parse(BRANCH_NAME)
        gh_pr = post_repo(
            FQ_REPO,
            'pulls',
            json={
                "title": "foo",
                "head": BRANCH_NAME,
                "base": "master"
            },
            status_code=201)
        pr_number = str(gh_pr['number'])
        post_repo(
            FQ_REPO,
            f'pulls/{pr_number}/reviews',
            json={
                "commit_id": source_sha,
                "event": "APPROVE"
            },
            status_code=200,
            token=oauth_tokens['user2'])
        get_repo(
            FQ_REPO,
            f'pulls/{pr_number}/reviews',
            status_code=200,
            token=oauth_tokens['user1'])
        time.sleep(7)
        poll_github_until_merged(pr_number)

        call(['git', 'fetch', 'origin'])
        merged_sha = rev_parse('origin/master')

        # deploy job takes some time
        time.sleep(7)

        deploy_artifact = run(['gsutil', 'cat', f'gs://hail-ci-test/{merged_sha}'], stdout=subprocess.PIPE, check=True)
        deploy_artifact = deploy_artifact.stdout.decode('utf-8').strip()
        assert f'commit {merged_sha}' in deploy_artifact
    finally:
        call(['git', 'push', 'origin', ':' + BRANCH_NAME])
        if pr_number is not None:
            patch_repo(
                FQ_REPO,
                f'pulls/{pr_number}',
                json={"state": "closed"},
                status_code=200)
Ejemplo n.º 12
0
def test_pull_request_trigger(tmpdir):
    BRANCH_NAME = 'test_pull_request_trigger'
    pr_number = None
    try:
        status = ci_get('/status', status_code=200)
        assert '_watched_targets' in status
        assert status['_watched_targets'] == [[{
            'repo': {
                'name': REPO_NAME,
                'owner': 'hail-ci-test'},
            'name': 'master'}, True]]
        os.chdir(tmpdir)
        call(['git', 'clone', f'https://{oauth_tokens["user1"]}@github.com/hail-ci-test/{REPO_NAME}.git'],
             # do not leak the token
             stdout=subprocess.DEVNULL,
             stderr=subprocess.DEVNULL)
        os.chdir(REPO_NAME)
        call(['git', 'config', 'user.email', '*****@*****.**'])
        call(['git', 'config', 'user.name', 'ci-automated-tests'])
        call(['git', 'remote', '-v'])

        call(['git', 'checkout', '-b', BRANCH_NAME])
        call(['git', 'commit', '--allow-empty', '-m', 'foo'])
        call(['git', 'push', 'origin', BRANCH_NAME])
        source_sha = rev_parse(BRANCH_NAME)
        target_sha = rev_parse('master')
        data = post_repo(
            FQ_REPO,
            'pulls',
            json={
                "title": "foo",
                "head": BRANCH_NAME,
                "base": "master"
            },
            status_code=201,
            token=oauth_tokens['user1'])
        pr_number = str(data['number'])
        time.sleep(7)
        pr = poll_until_finished_pr(BRANCH_NAME)
        assertDictHasKVs(
            pr.to_json(),
            {
                "target": {
                    "ref": {
                        "repo": {
                            "owner": "hail-ci-test",
                            "name": REPO_NAME
                        },
                        "name": "master"
                    },
                    "sha": target_sha
                },
                "source": {
                    "ref": {
                        "repo": {
                            "owner": "hail-ci-test",
                            "name": REPO_NAME
                        },
                        "name": BRANCH_NAME
                    },
                    "sha": source_sha
                },
                "review": "pending",
                "build": {
                    "type": "Mergeable",
                    "target_sha": target_sha
                },
                "number": pr_number
            })
    finally:
        call(['git', 'push', 'origin', ':' + BRANCH_NAME])
        if pr_number is not None:
            patch_repo(
                FQ_REPO,
                f'pulls/{pr_number}',
                json={"state": "closed"},
                status_code=200,
                token=oauth_tokens['user1'])
Ejemplo n.º 13
0
    def test_merges_approved_pr(self):
        BRANCH_NAME = 'test_merges_approved_pr'
        with tempfile.TemporaryDirectory() as d:
            pr_number = None
            try:
                status = ci_get('/status', status_code=200)
                self.assertIn('_watched_targets', status)
                assert status['_watched_targets'] == [[{
                    'repo': {
                        'name': self.repo_name,
                        'owner': 'hail-ci-test'},
                    'name': 'master'}, True]]
                os.chdir(d)
                call(['git', 'clone', f'[email protected]:hail-ci-test/{self.repo_name}.git'])
                os.chdir(self.repo_name)
                call(['git', 'remote', '-v'])

                call(['git', 'checkout', '-b', BRANCH_NAME])
                call(['git', 'commit', '--allow-empty', '-m', 'foo'])
                call(['git', 'push', 'origin', BRANCH_NAME])
                source_sha = self.rev_parse(BRANCH_NAME)
                gh_pr = post_repo(
                    self.fq_repo,
                    'pulls',
                    json={
                        "title": "foo",
                        "head": BRANCH_NAME,
                        "base": "master"
                    },
                    status_code=201)
                pr_number = str(gh_pr['number'])
                post_repo(
                    self.fq_repo,
                    f'pulls/{pr_number}/reviews',
                    json={
                        "commit_id": source_sha,
                        "event": "APPROVE"
                    },
                    status_code=200,
                    token=oauth_tokens['user2'])
                get_repo(
                    self.fq_repo,
                    f'pulls/{pr_number}/reviews',
                    status_code=200,
                    token=oauth_tokens['user1'])
                time.sleep(7)
                self.poll_github_until_merged(pr_number)

                call(['git', 'fetch', 'origin'])
                merged_sha = self.rev_parse('origin/master')

                # deploy job takes some time
                time.sleep(7)

                deploy_artifact = run(['gsutil', 'cat', f'gs://hail-ci-test/{merged_sha}'], stdout=subprocess.PIPE, check=True)
                deploy_artifact = deploy_artifact.stdout.decode('utf-8').strip()
                assert f'commit {merged_sha}' in deploy_artifact
            finally:
                call(['git', 'push', 'origin', ':' + BRANCH_NAME])
                if pr_number is not None:
                    patch_repo(
                        self.fq_repo,
                        f'pulls/{pr_number}',
                        json={"state": "closed"},
                        status_code=200)
Ejemplo n.º 14
0
    def test_pull_request_trigger(self):
        BRANCH_NAME = 'test_pull_request_trigger'
        with tempfile.TemporaryDirectory() as d:
            pr_number = None
            try:
                status = ci_get('/status', status_code=200)
                self.assertIn('_watched_targets', status)
                self.assertEqual(status['_watched_targets'],
                                 [[{'repo': {
                                     'name': self.repo_name,
                                     'owner': 'hail-ci-test'},
                                    'name': 'master'}, True]])
                os.chdir(d)
                call(['git', 'clone', f'[email protected]:hail-ci-test/{self.repo_name}.git'])
                os.chdir(self.repo_name)
                call(['git', 'remote', '-v'])

                call(['git', 'checkout', '-b', BRANCH_NAME])
                call(['git', 'commit', '--allow-empty', '-m', 'foo'])
                call(['git', 'push', 'origin', BRANCH_NAME])
                source_sha = self.rev_parse(BRANCH_NAME)
                target_sha = self.rev_parse('master')
                data = post_repo(
                    self.fq_repo,
                    'pulls',
                    json={
                        "title": "foo",
                        "head": BRANCH_NAME,
                        "base": "master"
                    },
                    status_code=201,
                    token=oauth_tokens['user1'])
                pr_number = str(data['number'])
                time.sleep(7)
                pr = self.poll_until_finished_pr(BRANCH_NAME)
                assertDictHasKVs(
                    pr.to_json(),
                    {
                        "target": {
                            "ref": {
                                "repo": {
                                    "owner": "hail-ci-test",
                                    "name": self.repo_name
                                },
                                "name": "master"
                            },
                            "sha": target_sha
                        },
                        "source": {
                            "ref": {
                                "repo": {
                                    "owner": "hail-ci-test",
                                    "name": self.repo_name
                                },
                                "name": BRANCH_NAME
                            },
                            "sha": source_sha
                        },
                        "review": "pending",
                        "build": {
                            "type": "Mergeable",
                            "target_sha": target_sha
                        },
                        "number": pr_number
                    })
            finally:
                call(['git', 'push', 'origin', ':' + BRANCH_NAME])
                if pr_number is not None:
                    patch_repo(
                        self.fq_repo,
                        f'pulls/{pr_number}',
                        json={"state": "closed"},
                        status_code=200,
                        token=oauth_tokens['user1'])