Pular para o conteúdo principal

Primeiro Exemplo

Agora vou popular o repositório com mais coisas para ter um exemplo com código real simples para fazer mais coisas.

Para rodar o app é só instalar as dependências e executar:

npm install

added 232 packages, and audited 233 packages in 5s

16 packages are looking for funding
run `npm fund` for details

11 vulnerabilities (5 moderate, 5 high, 1 critical)

To address all issues, run:
npm audit fix

Run `npm audit` for details.
 5s 
npm run dev

> [email protected] dev
> vite

VITE v3.0.9 ready in 181 ms

➜ Local: http://localhost:5173/
➜ Network: use --host to expose


## Para testar

npm test

> [email protected] test
> vitest run


RUN v0.22.1 /home/david/gh-first-action

(node:2305122) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
✓ src/components/MainContent.test.jsx (2)

Test Files 1 passed (1)
Tests 2 passed (2)
Start at 16:01:00
Duration 1.47s (transform 331ms, setup 65ms, collect 174ms, tests 80ms)

Agora vamos começar a montar workflows para esse código. Este código já possui os testes para que possamos executar no workflow também.

Vamos falar um pouco sobre os vários tipos de eventos que podem existir. Essa é uma página muito útil pois contém as informações que você pode precisar para qualquer caso de uso que tenha.

  • Eventos do repositório

    • push
    • pull_request
    • create
    • fork
    • issues
    • issues_comment
    • watch
    • discussion
    • Vários outros
  • Outros

    • workflow_dispatch quando executamos manualmente
    • repository_dispatch quando fazemos uma solicitação api rest específica do github
    • schedule dispara de acordo com um cronograma.
    • workflow_call

    Esses tipos de eventos possuem suas variações. Por exemplo, pull request pode ter as variações de opened, closed e muito mais.

Os eventos escolhidos dependem do que você precisa fazer. No nosso caso, vamos executar os testes já desenvolvidos sempre que um push for executado para o repositório.

No primeiro caso, executamos comandos que não dependem do nosso repositório. Neste caso, teremos que clonar o repositório no runner. Para ganhar velocidade, é interessante dividir os jobs que dependem dos mesmos arquivos e criar condição nos steps. Se fossemos fazer na unha, precisaríamos instalar o Git no runner, configurar, ter as credenciais caso o repo for privado para clonar o código. É aí que entram as actions, que são facilidades que o GitHub nos traz.

Da mesma forma, precisamos que o Node.js estivesse instalado no runner para executar os comandos de instalar as dependências e depois testar o código.

name: Test Project

on: push # Poderíamos escolher até em qual branch vamos executar, neste caso esta executando em qualquer branch.

jobs: # no plural sempre
first-job:

runs-on: ubuntu-latest
steps:

- name: Get Code # Fazer o download do código
run: git clone ... # Continue na explicação

- name: Install dependencies
run: npm install

- name: Test Code
run: npm run test

Nodejs já está instalado dentro do ubuntu-latest logo podemos executar diretamente um comando.

Action

As actions são apps personalizados ou de terceiros que executam tarefas repetitivas. Por exemplo o fato de clonar um repositório será praticamente algo que você sempre precisará fazer.

Ao invés de usamos o comando run que estará esperando um comando de shell, usamos action. Actions podem ser desenvolvidas no caso de algo personalizado ou distribuidas através de um marketplace oficial ou comunitário.

Vamos usar a action checkout ao invés de criar todo um script para fazer o get code. Esta action é mantida pelo time do github. Na documentação mostra como usar esta action.

alt text

É sempre bom analisar as actions do criador e verificar isso.

alt text

Esse emblema pode lhe dar mais confiança de que esta ação não está fazendo nada de malicioso, afinal estamos falando de código fonte que irá criar sua aplicação. Mais para frente será abordado sobre segurança e as ações do github e algumas coisas que devemos tomar cuidado.

Crie esse workflow no repositório em .github/workflow em um novo yaml file test.yaml.

name: Test Project

on: push # Poderíamos escolher até em qual branch vamos executar, neste caso esta executando em qualquer branch.

jobs: # no plural sempre
Test:

runs-on: ubuntu-latest
steps:

- name: Get Code # Fazer o download do código
uses: actions/checkout@v4
# O bloco abaixo recebe as configurações necessárias para execução
# Peguei alguns parâmetros default só para mostrar como poderíamos referenciar um valor a ser passado e como apontar
with:
# Não precisar passar nada abaixo, é mostrei para ver como usamos valores das quais o actions tem acesso.
repository: ${{ github.repository }} # Este é o default
token: ${{ github.token }} # Este é o default

- name: Install NodeJS
uses: actions/setup-node@v4
with:
node-version: '16'

- name: Test NodeJS Version
run: node --version

- name: Install dependencies
run: npm ci # também instala as dependências mas é mais seguro do que o npm install

- name: Run Tests
run: npm test # Nem esse

Na imagem ubuntu-latest podemos observar o que vem pré instalado, não precisava instalar, mas é sempre bom garantir a versão daquilo que você quer.

Faça o commit e vamos ver o que acontece quando demos um push. Aproveitemos e colocamos em uma nova branch antes

git checkout -b feature/app-tested
git add -A
git commit -m "sua msg"
git push origin feature/app-tested

alt text

alt text

Observe que o nosso evento funcionou pois fizemos um push. Se fizemos um merge na branch main teremos outra execução?

alt text

Teremos pois seria a mesma coisa que criar mergear o código localmente e fazer push.

Entrou no repo é push! Sabendo disso podemos travar o push para pessoas específicas, somente owners do repositório que podem forçar um push ou mudar para pull request.

O que acontece se um step falhar? Vamos alterar um test propositalmente e comitar no repositório.

alt text

alt text

alt text

Multiplos Jobs

Vamos alterar agora esse workflow para deployment e adicionar um novo job (deploy), sendo que o primeiro será mantido o teste.

name: Deployment

on: push

jobs:
test:

runs-on: ubuntu-latest
steps:

- name: Get Code
uses: actions/checkout@v4

- name: Install NodeJS
uses: actions/setup-node@v4
with:
node-version: '16'

- name: Install dependencies
run: npm ci

- name: Run Tests
run: npm test

deploy:
needs: test
runs-on: ubuntu-latest
steps:
## Observe que foi necessário pegar o código do mesmo jeito pois são máquinas diferentes.
- name: Get Code
uses: actions/checkout@v4

- name: Install NodeJS
uses: actions/setup-node@v4
with:
node-version: '16'

- name: Install dependencies
run: npm ci

- name: Build project
run: npm run build

- name: Deploy
run: echo "Deploying somewhere..." #Imagine esse passo

alt text

alt text

Nesse caso os jobs executaram em paralelo e o deploy só deveria acontecer se o test tivesse sucesso.

Para executar um após o outro existem diferentes maneiras mas a mais comum é usar a tag needs que é uma lista de jobs das quais este dependem. Então vamos alterar esta parte.

  deploy:
needs: [test]
# Esse método de declaração de lista não funciona
# needs:
# - test
runs-on: ubuntu-latest

alt text

Se observar o tempo verá que também demorou mais uma vez que o segundo ambiente somente foi montado depois que o primeiro terminou.

É possível montar todos os ambientes de uma vez e ordenar a execução para ganhar velocidade?

Podemos quebrar novamente a parte de teste e testar o que acontece.

alt text

Nem executou o deploy como esperado.

Multiplos Triggers

Até agora usamos somente 2 acionadores. Podemos colocar eles juntos.

...
on: [push, workflow_dispatch]
...

Com isso liberamos o botão para rodar manualmente.

alt text

Contexto do Workflow

Algumas vezes precisamos utilizar o runners com alguns metadados de ambiente.

Dentro dos runners temos algo que chamo de contexto. O contexto carrega uma série de informações do repositório que não estão de fato no código para dentro do workflow que permite trabalhar por exemplo com variáveis de ambiente e outras coisas mais.

Para acessar essas informações usamos uma sintaxe específica ${{ <context> }}. Temos palavras reservadas que nos permitem acessar esses valores.

Também temos as expressões que combinam funções com contextos.

Vamos montar um pipeline simples para entender isso. Vamos usar uma função toJSON em uma expressão para converter o contexto github em um json para ver tudo que temos acesso.

name: Output Information

on: workflow_dispatch

jobs:
info:
runs-on: ubuntu-latest
steps:

- name: Show Context
# Estamos querendo pegar todo o contexto do github e mostrar em json
run: echo "${{ toJSON(github) }}"

Salve este workflow e vamos rodar manualmente. Vamos analisar o log e ver tudo que temos.

alt text

Vamos mais a fundo no log e observar o objeto do contexto do github.

Por exemplo poderíamos acessar o nome do owner do repositório usando ${{ github.repository_owner}} que traria davidpuziol. Se fossemos usar uma url do repositório para clonar ao invés de usar o action checkout poderíamos pegar pelo ${{ github.repositoryUrl}} ao invés colocar o valor hard coded no yaml.

{
token: ***,
job: info, //nome do job
ref: refs/heads/main,
sha: d74c26ff77283f03196c167f689941ab1893acaf,
repository: davidpuziol/gh-first-action,
repository_owner: davidpuziol,
repository_owner_id: 32808515,
repositoryUrl: git://github.com/davidpuziol/gh-first-action.git,
run_id: 10239662371,
run_number: 1,
retention_days: 90,
run_attempt: 1,
artifact_cache_size_limit: 10,
repository_visibility: public,
repo-self-hosted-runners-disabled: false,
enterprise-managed-business-id: ,
repository_id: 837317176,
actor_id: 32808515,
actor: davidpuziol,
triggering_actor: davidpuziol,
workflow: Output Information,
head_ref: ,
base_ref: ,
event_name: workflow_dispatch,
event: {
inputs: null,
ref: refs/heads/main,
repository: {
allow_forking: true,
archive_url: https://api.github.com/repos/davidpuziol/gh-first-action/{archive_format}{/ref},
archived: false,
assignees_url: https://api.github.com/repos/davidpuziol/gh-first-action/assignees{/user},
blobs_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/blobs{/sha},
branches_url: https://api.github.com/repos/davidpuziol/gh-first-action/branches{/branch},
clone_url: https://github.com/davidpuziol/gh-first-action.git,
collaborators_url: https://api.github.com/repos/davidpuziol/gh-first-action/collaborators{/collaborator},
comments_url: https://api.github.com/repos/davidpuziol/gh-first-action/comments{/number},
commits_url: https://api.github.com/repos/davidpuziol/gh-first-action/commits{/sha},
compare_url: https://api.github.com/repos/davidpuziol/gh-first-action/compare/{base}...{head},
contents_url: https://api.github.com/repos/davidpuziol/gh-first-action/contents/{+path},
contributors_url: https://api.github.com/repos/davidpuziol/gh-first-action/contributors,
created_at: 2024-08-02T17:27:07Z,
default_branch: main,
deployments_url: https://api.github.com/repos/davidpuziol/gh-first-action/deployments,
description: Github Course First Repo,
disabled: false,
downloads_url: https://api.github.com/repos/davidpuziol/gh-first-action/downloads,
events_url: https://api.github.com/repos/davidpuziol/gh-first-action/events,
fork: false,
forks: 0,
forks_count: 0,
forks_url: https://api.github.com/repos/davidpuziol/gh-first-action/forks,
full_name: davidpuziol/gh-first-action,
git_commits_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/commits{/sha},
git_refs_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/refs{/sha},
git_tags_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/tags{/sha},
git_url: git://github.com/davidpuziol/gh-first-action.git,
has_discussions: false,
has_downloads: true,
has_issues: true,
has_pages: false,
has_projects: true,
has_wiki: true,
homepage: null,
hooks_url: https://api.github.com/repos/davidpuziol/gh-first-action/hooks,
html_url: https://github.com/davidpuziol/gh-first-action,
id: 837317176,
is_template: false,
issue_comment_url: https://api.github.com/repos/davidpuziol/gh-first-action/issues/comments{/number},
issue_events_url: https://api.github.com/repos/davidpuziol/gh-first-action/issues/events{/number},
issues_url: https://api.github.com/repos/davidpuziol/gh-first-action/issues{/number},
keys_url: https://api.github.com/repos/davidpuziol/gh-first-action/keys{/key_id},
labels_url: https://api.github.com/repos/davidpuziol/gh-first-action/labels{/name},
language: JavaScript,
languages_url: https://api.github.com/repos/davidpuziol/gh-first-action/languages,
license: {
key: mit,
name: MIT License,
node_id: MDc6TGljZW5zZTEz,
spdx_id: MIT,
url: https://api.github.com/licenses/mit
},
merges_url: https://api.github.com/repos/davidpuziol/gh-first-action/merges,
milestones_url: https://api.github.com/repos/davidpuziol/gh-first-action/milestones{/number},
mirror_url: null,
name: gh-first-action,
node_id: R_kgDOMehyOA,
notifications_url: https://api.github.com/repos/davidpuziol/gh-first-action/notifications?since,
open_issues: 0,
open_issues_count: 0,
owner: {
avatar_url: https://avatars.githubusercontent.com/u/32808515?v=4,
events_url: https://api.github.com/users/davidpuziol/events{/privacy},
followers_url: https://api.github.com/users/davidpuziol/followers,
following_url: https://api.github.com/users/davidpuziol/following{/other_user},
gists_url: https://api.github.com/users/davidpuziol/gists{/gist_id},
gravatar_id: ,
html_url: https://github.com/davidpuziol,
id: 32808515,
login: davidpuziol,
node_id: MDQ6VXNlcjMyODA4NTE1,
organizations_url: https://api.github.com/users/davidpuziol/orgs,
received_events_url: https://api.github.com/users/davidpuziol/received_events,
repos_url: https://api.github.com/users/davidpuziol/repos,
site_admin: false,
starred_url: https://api.github.com/users/davidpuziol/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/davidpuziol/subscriptions,
type: User,
url: https://api.github.com/users/davidpuziol
},
private: false,
pulls_url: https://api.github.com/repos/davidpuziol/gh-first-action/pulls{/number},
pushed_at: 2024-08-04T22:15:52Z,
releases_url: https://api.github.com/repos/davidpuziol/gh-first-action/releases{/id},
size: 75,
ssh_url: [email protected]:davidpuziol/gh-first-action.git,
stargazers_count: 0,
stargazers_url: https://api.github.com/repos/davidpuziol/gh-first-action/stargazers,
statuses_url: https://api.github.com/repos/davidpuziol/gh-first-action/statuses/{sha},
subscribers_url: https://api.github.com/repos/davidpuziol/gh-first-action/subscribers,
subscription_url: https://api.github.com/repos/davidpuziol/gh-first-action/subscription,
svn_url: https://github.com/davidpuziol/gh-first-action,
tags_url: https://api.github.com/repos/davidpuziol/gh-first-action/tags,
teams_url: https://api.github.com/repos/davidpuziol/gh-first-action/teams,
topics: [],
trees_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/trees{/sha},
updated_at: 2024-08-04T22:15:55Z,
url: https://api.github.com/repos/davidpuziol/gh-first-action,
visibility: public,
watchers: 0,
watchers_count: 0,
web_commit_signoff_required: false
},
sender: {
avatar_url: https://avatars.githubusercontent.com/u/32808515?v=4,
events_url: https://api.github.com/users/davidpuziol/events{/privacy},
followers_url: https://api.github.com/users/davidpuziol/followers,
following_url: https://api.github.com/users/davidpuziol/following{/other_user},
gists_url: https://api.github.com/users/davidpuziol/gists{/gist_id},
gravatar_id: ,
html_url: https://github.com/davidpuziol,
id: 32808515,
login: davidpuziol,
node_id: MDQ6VXNlcjMyODA4NTE1,
organizations_url: https://api.github.com/users/davidpuziol/orgs,
received_events_url: https://api.github.com/users/davidpuziol/received_events,
repos_url: https://api.github.com/users/davidpuziol/repos,
site_admin: false,
starred_url: https://api.github.com/users/davidpuziol/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/davidpuziol/subscriptions,
type: User,
url: https://api.github.com/users/davidpuziol
},
workflow: .github/workflows/output.yml
},
server_url: https://github.com,
api_url: https://api.github.com,
graphql_url: https://api.github.com/graphql,
ref_name: main,
ref_protected: false,
ref_type: branch,
secret_source: Actions,
workflow_ref: davidpuziol/gh-first-action/.github/workflows/output.yml@refs/heads/main,
workflow_sha: d74c26ff77283f03196c167f689941ab1893acaf,
workspace: /home/runner/work/gh-first-action/gh-first-action,
action: __run,
event_path: /home/runner/work/_temp/_github_workflow/event.json,
action_repository: ,
action_ref: ,
path: /home/runner/work/_temp/_runner_file_commands/add_path_82936500-cc74-4468-b613-268563dc2a2b,
env: /home/runner/work/_temp/_runner_file_commands/set_env_82936500-cc74-4468-b613-268563dc2a2b,
step_summary: /home/runner/work/_temp/_runner_file_commands/step_summary_82936500-cc74-4468-b613-268563dc2a2b,
state: /home/runner/work/_temp/_runner_file_commands/save_state_82936500-cc74-4468-b613-268563dc2a2b,
output: /home/runner/work/_temp/_runner_file_commands/set_output_82936500-cc74-4468-b613-268563dc2a2b
} License,
node_id: MDc6TGljZW5zZTEz,
spdx_id: MIT,
url: https://api.github.com/licenses/mit
},
merges_url: https://api.github.com/repos/davidpuziol/gh-first-action/merges,
milestones_url: https://api.github.com/repos/davidpuziol/gh-first-action/milestones{/number},
mirror_url: null,
name: gh-first-action,
node_id: R_kgDOMehyOA,
notifications_url: https://api.github.com/repos/davidpuziol/gh-first-action/notificationsall,
open_issues: 0,
open_issues_count: 0,
owner: {
avatar_url: https://avatars.githubusercontent.com/u/32808515?v=4,
events_url: https://api.github.com/users/davidpuziol/events{/privacy},
followers_url: https://api.github.com/users/davidpuziol/followers,
following_url: https://api.github.com/users/davidpuziol/following{/other_user},
gists_url: https://api.github.com/users/davidpuziol/gists{/gist_id},
gravatar_id: ,
html_url: https://github.com/davidpuziol,
id: 32808515,
login: davidpuziol,
node_id: MDQ6VXNlcjMyODA4NTE1,
organizations_url: https://api.github.com/users/davidpuziol/orgs,
received_events_url: https://api.github.com/users/davidpuziol/received_events,
repos_url: https://api.github.com/users/davidpuziol/repos,
site_admin: false,
starred_url: https://api.github.com/users/davidpuziol/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/davidpuziol/subscriptions,
type: User,
url: https://api.github.com/users/davidpuziol
},
private: false,
pulls_url: https://api.github.com/repos/davidpuziol/gh-first-action/pulls{/number},
pushed_at: 2024-08-04T22:15:52Z,
releases_url: https://api.github.com/repos/davidpuziol/gh-first-action/releases{/id},
size: 75,
ssh_url: [email protected]:davidpuziol/gh-first-action.git,
stargazers_count: 0,
stargazers_url: https://api.github.com/repos/davidpuziol/gh-first-action/stargazers,
statuses_url: https://api.github.com/repos/davidpuziol/gh-first-action/statuses/{sha},
subscribers_url: https://api.github.com/repos/davidpuziol/gh-first-action/subscribers,
subscription_url: https://api.github.com/repos/davidpuziol/gh-first-action/subscription,
svn_url: https://github.com/davidpuziol/gh-first-action,
tags_url: https://api.github.com/repos/davidpuziol/gh-first-action/tags,
teams_url: https://api.github.com/repos/davidpuziol/gh-first-action/teams,
topics: [],
trees_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/trees{/sha},
updated_at: 2024-08-04T22:15:55Z,
url: https://api.github.com/repos/davidpuziol/gh-first-action,
visibility: public,
watchers: 0,
watchers_count: 0,
web_commit_signoff_required: false
},
sender: {
avatar_url: https://avatars.githubusercontent.com/u/32808515?v=4,
events_url: https://api.github.com/users/davidpuziol/events{/privacy},
followers_url: https://api.github.com/users/davidpuziol/followers,
following_url: https://api.github.com/users/davidpuziol/following{/other_user},
gists_url: https://api.github.com/users/davidpuziol/gists{/gist_id},
gravatar_id: ,
html_url: https://github.com/davidpuziol,
id: 32808515,
login: davidpuziol,
node_id: MDQ6VXNlcjMyODA4NTE1,
organizations_url: https://api.github.com/users/davidpuziol/orgs,
received_events_url: https://api.github.com/users/davidpuziol/received_events,
repos_url: https://api.github.com/users/davidpuziol/repos,
site_admin: false,
starred_url: https://api.github.com/users/davidpuziol/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/davidpuziol/subscriptions,
type: User,
url: https://api.github.com/users/davidpuziol
},
workflow: .github/workflows/output.yml
},
server_url: https://github.com,
api_url: https://api.github.com,
graphql_url: https://api.github.com/graphql,
ref_name: main,
ref_protected: false,
ref_type: branch,
secret_source: Actions,
workflow_ref: davidpuziol/gh-first-action/.github/workflows/output.yml@refs/heads/main,
workflow_sha: d74c26ff77283f03196c167f689941ab1893acaf,
workspace: /home/runner/work/gh-first-action/gh-first-action,
action: __run,
event_path: /home/runner/work/_temp/_github_workflow/event.json,
action_repository: ,
action_ref: ,
path: /home/runner/work/_temp/_runner_file_commands/add_path_82936500-cc74-4468-b613-268563dc2a2b,
env: /home/runner/work/_temp/_runner_file_commands/set_env_82936500-cc74-4468-b613-268563dc2a2b,
step_summary: /home/runner/work/_temp/_runner_file_commands/step_summary_82936500-cc74-4468-b613-268563dc2a2b,
state: /home/runner/work/_temp/_runner_file_commands/save_state_82936500-cc74-4468-b613-268563dc2a2b,
output: /home/runner/work/_temp/_runner_file_commands/set_output_82936500-cc74-4468-b613-268563dc2a2b
} License,
node_id: MDc6TGljZW5zZTEz,
spdx_id: MIT,
url: https://api.github.com/licenses/mit
},
merges_url: https://api.github.com/repos/davidpuziol/gh-first-action/merges,
milestones_url: https://api.github.com/repos/davidpuziol/gh-first-action/milestones{/number},
mirror_url: null,
name: gh-first-action,
node_id: R_kgDOMehyOA,
notifications_url: https://api.github.com/repos/davidpuziol/gh-first-action/notificationsparticipating,
open_issues: 0,
open_issues_count: 0,
owner: {
avatar_url: https://avatars.githubusercontent.com/u/32808515?v=4,
events_url: https://api.github.com/users/davidpuziol/events{/privacy},
followers_url: https://api.github.com/users/davidpuziol/followers,
following_url: https://api.github.com/users/davidpuziol/following{/other_user},
gists_url: https://api.github.com/users/davidpuziol/gists{/gist_id},
gravatar_id: ,
html_url: https://github.com/davidpuziol,
id: 32808515,
login: davidpuziol,
node_id: MDQ6VXNlcjMyODA4NTE1,
organizations_url: https://api.github.com/users/davidpuziol/orgs,
received_events_url: https://api.github.com/users/davidpuziol/received_events,
repos_url: https://api.github.com/users/davidpuziol/repos,
site_admin: false,
starred_url: https://api.github.com/users/davidpuziol/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/davidpuziol/subscriptions,
type: User,
url: https://api.github.com/users/davidpuziol
},
private: false,
pulls_url: https://api.github.com/repos/davidpuziol/gh-first-action/pulls{/number},
pushed_at: 2024-08-04T22:15:52Z,
releases_url: https://api.github.com/repos/davidpuziol/gh-first-action/releases{/id},
size: 75,
ssh_url: [email protected]:davidpuziol/gh-first-action.git,
stargazers_count: 0,
stargazers_url: https://api.github.com/repos/davidpuziol/gh-first-action/stargazers,
statuses_url: https://api.github.com/repos/davidpuziol/gh-first-action/statuses/{sha},
subscribers_url: https://api.github.com/repos/davidpuziol/gh-first-action/subscribers,
subscription_url: https://api.github.com/repos/davidpuziol/gh-first-action/subscription,
svn_url: https://github.com/davidpuziol/gh-first-action,
tags_url: https://api.github.com/repos/davidpuziol/gh-first-action/tags,
teams_url: https://api.github.com/repos/davidpuziol/gh-first-action/teams,
topics: [],
trees_url: https://api.github.com/repos/davidpuziol/gh-first-action/git/trees{/sha},
updated_at: 2024-08-04T22:15:55Z,
url: https://api.github.com/repos/davidpuziol/gh-first-action,
visibility: public,
watchers: 0,
watchers_count: 0,
web_commit_signoff_required: false
},
sender: {
avatar_url: https://avatars.githubusercontent.com/u/32808515?v=4,
events_url: https://api.github.com/users/davidpuziol/events{/privacy},
followers_url: https://api.github.com/users/davidpuziol/followers,
following_url: https://api.github.com/users/davidpuziol/following{/other_user},
gists_url: https://api.github.com/users/davidpuziol/gists{/gist_id},
gravatar_id: ,
html_url: https://github.com/davidpuziol,
id: 32808515,
login: davidpuziol,
node_id: MDQ6VXNlcjMyODA4NTE1,
organizations_url: https://api.github.com/users/davidpuziol/orgs,
received_events_url: https://api.github.com/users/davidpuziol/received_events,
repos_url: https://api.github.com/users/davidpuziol/repos,
site_admin: false,
starred_url: https://api.github.com/users/davidpuziol/starred{/owner}{/repo},
subscriptions_url: https://api.github.com/users/davidpuziol/subscriptions,
type: User,
url: https://api.github.com/users/davidpuziol
},
workflow: .github/workflows/output.yml
},
server_url: https://github.com,
api_url: https://api.github.com,
graphql_url: https://api.github.com/graphql,
ref_name: main,
ref_protected: false,
ref_type: branch,
secret_source: Actions,
workflow_ref: davidpuziol/gh-first-action/.github/workflows/output.yml@refs/heads/main,
workflow_sha: d74c26ff77283f03196c167f689941ab1893acaf,
workspace: /home/runner/work/gh-first-action/gh-first-action,
action: __run,
event_path: /home/runner/work/_temp/_github_workflow/event.json,
action_repository: ,
action_ref: ,
path: /home/runner/work/_temp/_runner_file_commands/add_path_82936500-cc74-4468-b613-268563dc2a2b,
env: /home/runner/work/_temp/_runner_file_commands/set_env_82936500-cc74-4468-b613-268563dc2a2b,
step_summary: /home/runner/work/_temp/_runner_file_commands/step_summary_82936500-cc74-4468-b613-268563dc2a2b,
state: /home/runner/work/_temp/_runner_file_commands/save_state_82936500-cc74-4468-b613-268563dc2a2b,
output: /home/runner/work/_temp/_runner_file_commands/set_output_82936500-cc74-4468-b613-268563dc2a2b
}

Vamos utilizar muito essa idéia de contexto ao longo do aprendizado. Aqui temos só um primeiro contato.