Table of Contents Background Gotchas with Actions on GitHub Enterprise Server Caching isn’t available GitHub Enterprise Server is behind GitHub Enterprise Cloud Using Public GitHub.com Actions Dockerhub pull rate limiting General Limitations No dropdowns for manually triggered jobs Self-hosted runner default labels You can’t restart a single job of a workflow Slow log output You can’t have actions that call other actions Metrics and observability Workflow YAML Syntax can confusing Closing Background I’ve been leading a team at my dayjob to migrate every engineering team to GitHub Actions (GHA)
Say you’re a developer working on a feature, and you want to get early feedback from other teammates. How would you go about it? Most companies don’t have a good process for this, and it ends up crippling their ability to ship features and iterate.
The process at companies without review app environments:
An engineer works on a UI feature that she wants to get some early feedback on how it looks and feels.
UPDATE: 2017-05-12 A few more thoughts have come to mind after writing the original post.
I realized that I didn’t talk about the clojurescript side of things.
People coming from opinionated frameworks like Ruby on Rails often become disoriented in a Clojure project. Rails, being a framework, has the code already organized for you. You just had to learn where to put your models, views, and controllers.
Clojure doesn’t have a major opinionated framework like Ruby on Rails that forces you to follow its conventions.
A lot of beginners get confused and have questions like the following:
I’ve been getting questions from beginner Clojure developers on how to effectively use their REPL and interactive development.
Quite a few of these people are coming from languages like Java, where they would have to compile their application and wait before running any code.
Integrate your REPL with your editor You must have your REPL integrated with your editor. Whether that’s a text editor like emacs with cider, or an IDE like IntelliJ with Cursive, you have to be able to evaluate code in your REPL from the editor.
Last year, I submitted a PR to the Clojure web request routing library, Compojure. Even though I was doing Clojure full time at work, there was still a lot for me to learn and always will be.
Opening a PR for an open source library I was familiar with and used all the time made me realize a few things:
I didn’t know it as intimately as I thought I did.
Checking For An Empty List Don’t use (not (empty? coll)). Instead prefer (seq coll) instead.
Seq returns nil if the collection is empty. If the seq isn’t empty then it returns a seq on that collection.
Flattening The Result Of A Map By One Level If the result of a map function ever returns a list of lists, then use mapcat over (apply (concat (map...))):
(map list (range 10)) ;; => ((0) (1) (2) (3) (4) (5) (6) (7) (8) (9)) (mapcat list (range 10)) ;; => (0 1 2 3 4 5 6 7 8 9) Maps Are Functions Maps, like keywords, are functions.
Backstory I wrote an article on how I decided to go with Ruby instead of Clojure a while back. I moved my blog from Wordpress to Jekyll yesterday and think it’s time for an honest update.
Performance and Speed Clojure and Ruby is often an order of a magnitude faster than Ruby for compute based tasks.