Travis-CI: artifacts on Amazon S3

Protože jsme byli líní si nastavovat Jenkinse, tak používáme Travis-CI pro rohlík a dneska jsem zjistil, že Travis vám vypíše maximálně ~10k řádků výstupu :)

travis-artifacts-10k-lines

Co s tím? No, bude potřeba ten “bordel” z buildu nahrát někam jinam.

Když náhodou narazíte na tu správnou kombinaci slov, tak se vám poštěstí najít dva články. Bohužel jsou oba dva úplně blbě a jenom s nimi budete ztrácet čas. Já jsem se po pár hodinách dopracoval k následujícímu řešení.

S3: nový kýblík

Zaregistrovat se na Amazon a vytvořit nový kýblíček je velice primitivní. Jediné gotcha, na které jsem narazil, tak je povolit, aby z bucketu šlo číst přes veřejné url. Návod jak to udělat jsem našel tady.

Vlezeme si do “Properties” bucketu, roletka “Permissions”, prostřední tlačítko “Add bucket policy”

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::muj-travis/*"
        }
    ]
}

a nezapomenout nahradit muj-travis za název našeho kýblíčku.

S3: vytvoření nového uživatele

Travis bude potřebovat nějak nahrávat ty soubory na Amazon. No a na Amazonu je dobrým pravidlem na všechno dělat nového uživatele, který vždy dostane nová přístupová práva a dáte mu jenom ta opravnění, jaká potřebuje.

Najdeme si tedy IAM (= Identity and Access Management), vytvoříme nového uživatele a buďto přímo uživateli přidáme novou Policy, nebo pro něj vytvoříme Group a té dáme následující policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::muj-travis"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::muj-travis/*"
      ]
    }
  ]
}

a nezapomenout nahradit muj-travis za název kýblíčku.

Travis: úprava buildu

Ze současného

after_failure:
  - 'for i in $(find ./tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done'

after_script:
  - 'for i in $(find ./log -name \*.log); do echo "--- $i"; cat $i; echo; echo; done'
  - 'for i in $(find ./tests -name \*.log); do echo "--- $i"; cat $i; echo; echo; done'

smažeme blok after_script a nahradíme ho za

after_script:
  - curl -sL https://raw.githubusercontent.com/travis-ci/artifacts/master/install | bash
  - tests/travis.artifacts.sh

Vytvoříme soubor tests/travis.artifacts.sh s obsahem

#!/bin/bash

# export ARTIFACTS_DEBUG=1
export ARTIFACTS_S3_REGION=eu-west-1
export ARTIFACTS_BUCKET=muj-travis
export ARTIFACTS_TARGET_PATHS=artifacts/$TRAVIS_REPO_SLUG/$TRAVIS_BUILD_ID/$TRAVIS_JOB_ID

~/bin/artifacts upload --key my-s3-key-id --secret my-s3-secret \
  $(ls log/*.log tests/**/*.log tests/**/exception-*.html 2> /dev/null | tr "\n" ":" | sed -r 's/:$//')

nahradíme my-s3-key-id za přístupový klíč našeho uživatele, my-s3-secret za secret a muj-travis za název kýblíčku. Pokud používáte jiný region tak i eu-west-1, ale eu-centra-1 mi z nějakého důvodu nefungoval, tak jsem to nechal v Irsku.

Ano, vidíte správně, commitnul jsem do repa klíč a secret ke svému S3 bucketu v plaintextu. Proč bych neměl takovou věc dělat? Věděli jste, že existují roboti, kteří prochází veřejné repozitáře a hledají commitnuté klíče a pak je zneužívají na šíření spamu a virů? :) No a proto je dobrý nápad commitovat zašifrované klíče, nebo použít nastavení Environment Variables repozitáře.

Proč teda sakra commituju ty klíče v plaintextu? Vyvíjíme feature branchingem a na všechno děláme pullrequesty. No a Travis má bezpečnostní feature, že nedovolí použít v buildu pullrequestu zašifrované parametry a je jedno jestli je tam vložít přes “Environment Variables” v nastavení repozitáře, nebo přes cli utilitu na kterou potřebujete ruby. Je to asi kvůli tomu, že bych si mohl do pullrequestu dát nějaké echo a vypsat si ty klíče v plaintextu a pak je zneužít. To chápu. Co nechápu, tak že tohle není možné použití ani u Travis-PRO pro privátní repozitáře, kde je naprosto jasné, že to používají pouze a jenom lidé z firmy a je jedno co s pullrequestem udělám za šaškárny.

Jako vždy, budu rád když mě vyvedete z omylu, pokud existuje lepší řešení :)

Mám tu chybu? Fix me

Autor:

comments powered by Disqus