Create a New Github Action to Automate Code Tasks with Javascript

Brought by: egghead.io

Overview

Github Actions are an awesome tool from Github that allows us to automate tasks using code-based workflow configuration files. There's also a large marketplace that comes stocked with many useful tools that are ready out of the box.
But sometimes the options available don't completely solve our needs or maybe we're working with a new technology that's simply not available as an Action yet. Luckily, Github allows anyone to create their own Actions using common technologies like Javascript via Node.
We'll learn how to create a new Javascript-based Github Action running on Node. We'll first walk through a simple Hello World example, learn how to test it locally, version control it, use it in the wild, and move on to more advanced solutions that include using packages from npm!

Syllabus

  • Create a New Github Action That Logs Hello World with Javascript and NodeJS
  • Test a New Github Action in Its Repository with a Custom Workflow
  • Use npm to Tag and Version a Github Action Package for Workflow Version Control
  • Use a Custom Github Action to Log Hello World in Another Project
  • Add npm Packages to a Custom Github Action to Use Open Source Libraries
  • Add Configurable Input Controls to Custom Github Actions with Github Actions Toolkit Core
  • Configure Outputs in a Custom Github Action to Use Resulting Data in Other Actions
  • Set an Exit Code on Custom Github Actions to Indicate a Passing or Failing Status
  • Add Debug Logs with the Toolkit Logger to Find and Fix Issues in a Custom Github Action

Taught by

Colby Fayock

Create a New Github Action to Automate Code Tasks with Javascript
Go to course

Create a New Github Action to Automate Code Tasks with Javascript

Brought by: egghead.io

  • egghead.io
  • Paid
  • English
  • Certificate Not Available
  • Available at any time
  • All
  • N/A
8.1.2PHP Version1.04sRequest Duration2MBMemory UsageGET en/courses/{slug}Route
    • Booting (671ms)
    • Application (369ms)
    • 1 x Booting (64.34%)
      671.29ms
      1 x Application (35.41%)
      369.43ms
      14 templates were rendered
      • public.courses.show (resources/views/public/courses/show.blade.php)3bladefile
        Params
        0
        course
        1
        links
        2
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.courses.partials.details (resources/views/public/courses/partials/details.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.layouts.main (resources/views/public/layouts/main.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.meta (resources/views/public/layouts/partials/meta.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.navbar (resources/views/public/layouts/partials/navbar.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.links (resources/views/public/auth/profile/partials/links.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.layouts.partials.flash-session (resources/views/public/layouts/partials/flash-session.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      uri
      GET en/courses/{slug}
      middleware
      web, localize:en
      controller
      App\Http\Controllers\CourseController@show
      as
      en.courses.show
      namespace
      prefix
      /en
      where
      file
      app/Http/Controllers/CourseController.php:17-35
      6 statements were executed12.89ms
      • select * from `courses` where `slug_en` = 'create-a-new-github-action-to-automate-code-tasks-with-javascript' limit 1
        11.41ms/app/Http/Controllers/CourseController.php:20corspedia
        Metadata
        Bindings
        • 0. create-a-new-github-action-to-automate-code-tasks-with-javascript
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:20
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • update `courses` set `visitors` = `visitors` + 1, `courses`.`updated_at` = '2025-07-04 10:42:00' where `id` = 2127
        600μs/app/Http/Controllers/CourseController.php:21corspedia
        Metadata
        Bindings
        • 0. 2025-07-04 10:42:00
        • 1. 2127
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:21
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `topic_id`, `slug_en`, `slug_ar` from `subjects` where `subjects`.`id` in (106)
        210μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `slug_en`, `slug_ar` from `topics` where `topics`.`id` in (1)
        170μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 25. /app/Http/Controllers/CourseController.php:23
        • 26. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 27. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 28. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 29. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `providers` where `providers`.`id` in (29) and `providers`.`deleted_at` is null
        220μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `html_files` where `html_files`.`id` = 2118 limit 1
        280μs/app/Models/Course.php:84corspedia
        Metadata
        Bindings
        • 0. 2118
        Backtrace
        • 21. /app/Models/Course.php:84
        • 28. view::public.courses.show:29
        • 30. /vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:125
        • 31. /vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:58
        • 32. /vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:72
      App\Models\HtmlFile
      1
      App\Models\Provider
      1
      App\Models\Topic
      1
      App\Models\Subject
      1
      App\Models\Course
      1
        _token
        EJEMTKjWNAsbOMESzHAAuFrcRuWilFNyh3Stfu9g
        locale
        en
        _previous
        array:1 [ "url" => "https://www.corspedia.com/en/courses/create-a-new-github-action-to-automate-co...
        _flash
        array:2 [ "old" => [] "new" => [] ]
        PHPDEBUGBAR_STACK_DATA
        []
        path_info
        /en/courses/create-a-new-github-action-to-automate-code-tasks-with-javascript
        status_code
        200
        
        status_text
        OK
        format
        html
        content_type
        text/html; charset=UTF-8
        request_query
        []
        
        request_request
        []
        
        request_headers
        0 of 0
        array:24 [ "cf-ipcountry" => array:1 [ 0 => "US" ] "cf-connecting-ip" => array:1 [ 0 => "216.73.217.5" ] "cdn-loop" => array:1 [ 0 => "cloudflare; loops=1" ] "x-forwarded-proto" => array:1 [ 0 => "https" ] "x-forwarded-for" => array:1 [ 0 => "216.73.217.5" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "cf-ray" => array:1 [ 0 => "959e036b7cc5cceb-YYZ" ] "accept-encoding" => array:1 [ 0 => "gzip, br" ] "priority" => array:1 [ 0 => "u=0, i" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "cf-visitor" => array:1 [ 0 => "{"scheme":"https"}" ] "host" => array:1 [ 0 => "www.corspedia.com" ] "content-length" => array:1 [ 0 => "" ] "content-type" => array:1 [ 0 => "" ] ]
        request_server
        0 of 0
        array:50 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_CF_IPCOUNTRY" => "US" "HTTP_CF_CONNECTING_IP" => "216.73.217.5" "HTTP_CDN_LOOP" => "cloudflare; loops=1" "HTTP_X_FORWARDED_PROTO" => "https" "HTTP_X_FORWARDED_FOR" => "216.73.217.5" "HTTP_SEC_FETCH_SITE" => "none" "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" "HTTP_UPGRADE_INSECURE_REQUESTS" => "1" "HTTP_SEC_CH_UA_PLATFORM" => ""Windows"" "HTTP_SEC_CH_UA_MOBILE" => "?0" "HTTP_SEC_CH_UA" => ""Chromium";v="130", "HeadlessChrome";v="130", "Not?A_Brand";v="99"" "HTTP_CACHE_CONTROL" => "no-cache" "HTTP_PRAGMA" => "no-cache" "HTTP_SEC_FETCH_DEST" => "document" "HTTP_CF_RAY" => "959e036b7cc5cceb-YYZ" "HTTP_ACCEPT_ENCODING" => "gzip, br" "HTTP_PRIORITY" => "u=0, i" "HTTP_SEC_FETCH_USER" => "?1" "HTTP_SEC_FETCH_MODE" => "navigate" "HTTP_CF_VISITOR" => "{"scheme":"https"}" "HTTP_HOST" => "www.corspedia.com" "REDIRECT_STATUS" => "200" "SERVER_NAME" => "corspedia.com" "SERVER_PORT" => "443" "SERVER_ADDR" => "141.95.147.152" "REMOTE_USER" => "" "REMOTE_PORT" => "26326" "REMOTE_ADDR" => "108.162.241.69" "SERVER_SOFTWARE" => "nginx/1.18.0" "GATEWAY_INTERFACE" => "CGI/1.1" "HTTPS" => "on" "REQUEST_SCHEME" => "https" "SERVER_PROTOCOL" => "HTTP/2.0" "DOCUMENT_ROOT" => "/var/www/corspedia/public" "DOCUMENT_URI" => "/index.php" "REQUEST_URI" => "/en/courses/create-a-new-github-action-to-automate-code-tasks-with-javascript" "SCRIPT_NAME" => "/index.php" "CONTENT_LENGTH" => "" "CONTENT_TYPE" => "" "REQUEST_METHOD" => "GET" "QUERY_STRING" => "" "SCRIPT_FILENAME" => "/var/www/corspedia/public/index.php" "PATH_INFO" => "" "FCGI_ROLE" => "RESPONDER" "PHP_SELF" => "/index.php" "REQUEST_TIME_FLOAT" => 1751625719.8387 "REQUEST_TIME" => 1751625719 ]
        request_cookies
        []
        
        response_headers
        0 of 0
        array:5 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Fri, 04 Jul 2025 10:42:00 GMT" ] "set-cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6IkJ0RzhyUzE2ZHlwOXFyU3ZlQ29TWEE9PSIsInZhbHVlIjoiWitzVzBjQkRQWXU2OHNZK29kS3ZldXRCNWpkUDQzMHI0RG9tUDVaMG84VkVaN2d6d2Q0S0RGSU1udmpRNjY0R1lId2FEaEdveDJlUHErZDJxNmhRR2YraU9yalNhbmNVTjlRWUZscWlQTUg2d2s2NTVhaVp2QTdaaEN0OWNFTSsiLCJtYWMiOiI0ZGNjNGUxNTA0ZGUwMDcyZmNjN2M1NmM0NjlmMzczN2E4OTFiMDliZWY5YzRlZTYxZWViYjFiMTg1ZjJlNzlhIiwidGFnIjoiIn0%3D; expires=Fri, 04 Jul 2025 12:42:00 GMT; Max-Age=7200; path=/; samesite=laxXSRF-TOKEN=eyJpdiI6IkJ0RzhyUzE2ZHlwOXFyU3ZlQ29TWEE9PSIsInZhbHVlIjoiWitzVzBjQkRQWXU2OHNZK29kS3ZldXRCNWpkUDQzMHI0RG9tUDVaMG84VkVaN2d6d2Q0S0RGSU1udmpRNjY0R1lId2FEa" 1 => "laravel_session=eyJpdiI6IlBMYjkra2NONEgyM2Z4YkVvcVJUU3c9PSIsInZhbHVlIjoibzBGY0FMYmlzS2srK1BoV1VFM2Z0ZllmNUpGU0liUzE0WUovUE56ci9id0t4SFErbEhuQmFPVG9vd3c1bEIwckVDT1pEeUp4S2xkaWo4b2VEMFc5OVlZa2ZkSmNBeUgxcTJhSHMzcy8wczlxc1F0UWxhL2NBZG5kZFZGOFRvQXoiLCJtYWMiOiJjZGVjNGJhZGE0M2JhMGFiNjVmZWNhYmE5MGMxZmRkMDNhZTkzZGY0NTNkNmU3YjYyNWViOTM3MThkZTM1NDJhIiwidGFnIjoiIn0%3D; expires=Fri, 04 Jul 2025 12:42:00 GMT; Max-Age=7200; path=/; httponly; samesite=laxlaravel_session=eyJpdiI6IlBMYjkra2NONEgyM2Z4YkVvcVJUU3c9PSIsInZhbHVlIjoibzBGY0FMYmlzS2srK1BoV1VFM2Z0ZllmNUpGU0liUzE0WUovUE56ci9id0t4SFErbEhuQmFPVG9vd3c1bEIwckVD" ] "Set-Cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6IkJ0RzhyUzE2ZHlwOXFyU3ZlQ29TWEE9PSIsInZhbHVlIjoiWitzVzBjQkRQWXU2OHNZK29kS3ZldXRCNWpkUDQzMHI0RG9tUDVaMG84VkVaN2d6d2Q0S0RGSU1udmpRNjY0R1lId2FEaEdveDJlUHErZDJxNmhRR2YraU9yalNhbmNVTjlRWUZscWlQTUg2d2s2NTVhaVp2QTdaaEN0OWNFTSsiLCJtYWMiOiI0ZGNjNGUxNTA0ZGUwMDcyZmNjN2M1NmM0NjlmMzczN2E4OTFiMDliZWY5YzRlZTYxZWViYjFiMTg1ZjJlNzlhIiwidGFnIjoiIn0%3D; expires=Fri, 04-Jul-2025 12:42:00 GMT; path=/XSRF-TOKEN=eyJpdiI6IkJ0RzhyUzE2ZHlwOXFyU3ZlQ29TWEE9PSIsInZhbHVlIjoiWitzVzBjQkRQWXU2OHNZK29kS3ZldXRCNWpkUDQzMHI0RG9tUDVaMG84VkVaN2d6d2Q0S0RGSU1udmpRNjY0R1lId2FEa" 1 => "laravel_session=eyJpdiI6IlBMYjkra2NONEgyM2Z4YkVvcVJUU3c9PSIsInZhbHVlIjoibzBGY0FMYmlzS2srK1BoV1VFM2Z0ZllmNUpGU0liUzE0WUovUE56ci9id0t4SFErbEhuQmFPVG9vd3c1bEIwckVDT1pEeUp4S2xkaWo4b2VEMFc5OVlZa2ZkSmNBeUgxcTJhSHMzcy8wczlxc1F0UWxhL2NBZG5kZFZGOFRvQXoiLCJtYWMiOiJjZGVjNGJhZGE0M2JhMGFiNjVmZWNhYmE5MGMxZmRkMDNhZTkzZGY0NTNkNmU3YjYyNWViOTM3MThkZTM1NDJhIiwidGFnIjoiIn0%3D; expires=Fri, 04-Jul-2025 12:42:00 GMT; path=/; httponlylaravel_session=eyJpdiI6IlBMYjkra2NONEgyM2Z4YkVvcVJUU3c9PSIsInZhbHVlIjoibzBGY0FMYmlzS2srK1BoV1VFM2Z0ZllmNUpGU0liUzE0WUovUE56ci9id0t4SFErbEhuQmFPVG9vd3c1bEIwckVD" ] ]
        session_attributes
        0 of 0
        array:5 [ "_token" => "EJEMTKjWNAsbOMESzHAAuFrcRuWilFNyh3Stfu9g" "locale" => "en" "_previous" => array:1 [ "url" => "https://www.corspedia.com/en/courses/create-a-new-github-action-to-automate-code-tasks-with-javascript" ] "_flash" => array:2 [ "old" => [] "new" => [] ] "PHPDEBUGBAR_STACK_DATA" => [] ]